TI中文支持网
TI专业的中文技术问题搜集分享网站

用zcl_SendReportCmd

协议栈: Z-stack 3.0.2 
参考程序为:GenericApp
芯片型号:CC2530

问题:我使用按键触发了一个通过zcl_SendReportCmd报告自定义数据的函数,抓包显示发出去了接收方也ACK了,可是抓到的无线数据包多了9个字节的数据,并且接收方好像没有进入case ZCL_CMD_REPORT里面,求解,感谢。关键以及抓包文件附上。7月30日18_26_33_test1.rar

//发送方发送函数
void GenericApp_SendTheMessage(void)
{zclReportCmd_t *pReportCmd;uint8 send_data[5] = {0x04,0x11,0x22,0x33,0x99};afAddrType_t devDstAddr;devDstAddr.addrMode=(afAddrMode_t)Addr16Bit;devDstAddr.endPoint=GENERICAPP_ENDPOINT;devDstAddr.addr.shortAddr=0x0000;pReportCmd = osal_mem_alloc( sizeof(zclReportCmd_t) + sizeof(zclReport_t) );if ( pReportCmd != NULL ){pReportCmd->numAttr = 1;pReportCmd->attrList[0].attrID = ATTRID_ON_OFF;pReportCmd->attrList[0].dataType = ZCL_DATATYPE_UINT64;pReportCmd->attrList[0].attrData = (uint8*)send_data;zcl_SendReportCmd( GENERICAPP_ENDPOINT, &devDstAddr,ZCL_CLUSTER_ID_GEN_ON_OFF,pReportCmd, ZCL_FRAME_SERVER_CLIENT_DIR, TRUE, bdb_getZCLFrameCounter() );}osal_mem_free(pReportCmd);
}
//接收方
void zclGenericApp_ProcessInReportCmd(  zclIncomingMsg_t *pInMsg )
{zclReportCmd_t *pReportCmd;pReportCmd=(zclReportCmd_t *)pInMsg->attrCmd;if ( pReportCmd->attrList[0].attrID == ATTRID_ON_OFF ){HalUARTWrite(0,pReportCmd->attrList[0].attrData,5 );HalUARTWrite(0,"success",sizeof("success") );}else{HalUARTWrite(0,"fail",sizeof("fail") );}
}

Alvin Chen:

看了你的抓包文件,没有问题。但是数据只有0x04是正常的,如果你想传输一个字符串请使用自定义的cluster。因为你用的是on/off report 上传的应该为light的状态所以只有一位。如果你想使用report 建议去使用SampleTemperatureSensor和SampleThermostat

user6069081:

回复 Alvin Chen:

 你好,这抓包里面确实发出了我想要发的数据,照你的意思是有用的数据就只是0x04是吗?

Alvin Chen:

回复 user6069081:

是的,因为按照zcl specon/off report 是一个状态位,不建议你用已经规定好的去做你自己私有协议。你可以自己去定义一个cluster。

user6069081:

回复 Alvin Chen:

好的,那我接收方是否在case ZCL_CMD_REPORT此处处理传入的report数据呢?感谢

YiKai Chen:

回复 user6069081:

是的

user6069081:

回复 user6069081:

static void zclGenericApp_ProcessIncomingMsg( zclIncomingMsg_t *pInMsg )
{switch ( pInMsg->zclHdr.commandID ){
#ifdef ZCL_READcase ZCL_CMD_READ_RSP:zclGenericApp_ProcessInReadRspCmd( pInMsg );break;
#endif
#ifdef ZCL_WRITEcase ZCL_CMD_WRITE_RSP:zclGenericApp_ProcessInWriteRspCmd( pInMsg );break;
#endifcase ZCL_CMD_CONFIG_REPORT:case ZCL_CMD_CONFIG_REPORT_RSP:case ZCL_CMD_READ_REPORT_CFG:case ZCL_CMD_READ_REPORT_CFG_RSP://bdb_ProcessIncomingReportingMsg( pInMsg );break;case ZCL_CMD_REPORT:zclGenericApp_ProcessInReportCmd( pInMsg );break;case ZCL_CMD_DEFAULT_RSP:zclGenericApp_ProcessInDefaultRspCmd( pInMsg );break;default:break;}if ( pInMsg->attrCmd )osal_mem_free( pInMsg->attrCmd );
}

user6069081:

回复 YiKai Chen:

我想请问我接受方定义了ZCL_CLUSTER_ID_GEN_ON_OFF作为输入簇,report的处理程序如题第二段程序,可是我串口看不到预计的字符串,单用串口收发是没有问题的,何解?

YiKai Chen:

回复 user6069081:

串口看不到预计的字符串是什麼意思?你設置斷點在 ZCL_CMD_REPORT會在收到 ZCL report的時候停在斷點上嗎?

user6069081:

回复 YiKai Chen:

就是我在接收方的zclGenericApp_ProcessInReportCmd函数里加了一条打印“success”字符串的语句,结果没有显示我想要的“success”。我感觉接收方并没有进入到ZCL_CMD_REPORT里面。

YiKai Chen:

回复 user6069081:

你設置斷點在 ZCL_CMD_REPORT去調試的話,會在收到 ZCL report的時候停在斷點上嗎?

赞(0)
未经允许不得转载:TI中文支持网 » 用zcl_SendReportCmd
分享到: 更多 (0)