终端发送如下
HalUARTWrite(0,zclSampleSw_SensorData,19 );//发送器先把发送的数据打印到串口
//上报
pReportCmd = osal_mem_alloc( sizeof(zclReportCmd_t) + sizeof(zclReport_t) );
if ( pReportCmd != NULL )
{
pReportCmd->numAttr = 1;
pReportCmd->attrList[0].attrID = ATTRID_BASIC_DEVICE_ENABLED;
pReportCmd->attrList[0].dataType = ZCL_DATATYPE_CHAR_STR;
pReportCmd->attrList[0].attrData = (void *)(&zclSampleSw_SensorData);
zcl_SendReportCmd( SAMPLELIGHT_ENDPOINT, &zclSampleLight_DstAddr,
ZCL_CLUSTER_ID_GEN_ON_OFF,
pReportCmd, ZCL_FRAME_SERVER_CLIENT_DIR, TRUE, zclSampleLightSeqNum++ );
}
协调器端接收如下:
static uint8 zclSampleSw_ProcessInReportCmd( zclIncomingMsg_t *pInMsg )
{
zclReportCmd_t *pReportCmd;
pReportCmd=(zclReportCmd_t *)pInMsg->attrCmd;
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK );
if ( pReportCmd->attrList[0].attrID == ATTRID_BASIC_DEVICE_ENABLED )
{ //osal_memcpy(&LongData,pReportCmd->attrList[0].attrData,19);
HalUARTWrite(0,pReportCmd->attrList[0].attrData,19 );
}
}
发现发送端通过串口打印的数据和协调器收到的数据是不一样的,附件是抓的包,请帮忙分析一下
终端发送的19字节数据示例 01 03 0E 01 A4 00 24 00 0D 00 36 5C 3A 63 93 00 43 AA 93
其中前面三个字节是固定的01 03 0E,后面的16自己是传感器采集的数值,不是固定的,附件是抓包数据
终端每秒发送19字节数据给协调器.psd
YiKai Chen:
看到你的數據都只有發出01 03,應該是data length不對
user5367314:
回复 YiKai Chen:
data length在发送端怎么配置呢?
Alvin Chen:
回复 user5367314:
你发出的就不对,你不要用ZCL规定的cluster去做,用一个你自己定义的去做。
user5367314:
回复 Alvin Chen:
自定义cluster和attribute 我给出我自己的想法,帮我看一下思路是否正确
#define ZCL_CLUSTER_ID_Sample0x0001
#defineATTRID_Sample0x0001
1.然后在Sample_data.c文件里初始化,如下
InClusterList和OutClusterList什么区别?是不是发出的是out,收到的是in,
自定义的cluster是不是InClusterList和OutClusterList都要放进去?
const cId_t zclSample_OutClusterList[]和zclSample_InClusterList
2.然后在CONST zclAttrRec_t zclSample_Attrs里也初始化?
{ZCL_CLUSTER_ID_Sample ,{ // Attribute recordATTRID_Sample,ZCL_DATATYPE_CHAR_STR,ACCESS_CONTROL_READ,(void *)zclSample}
}
3.关于第2点,ACCESS_CONTROL_READ是读还是读和写都要,我这边就是双方互传多字节的私有数据,4.关于第2点,zclSample就是我放数据的数组名吧?
YiKai Chen:
回复 user5367314:
你發出來數據不完整跟這些無關,你要去調試zcl_SendReportCmd里的zclGetAttrDataLength為什麼沒給出正確的dataLen
Alvin Chen:
回复 user5367314:
你先按照YK的建议去看datalen ,我也有关于下面的怀疑。。。
The DeviceEnabled attribute is a boolean and specifies whether the device is
enabled or disabled. This attribute shall be set to one of the non-reserved values
user5367314:
回复 Alvin Chen:
我把ZCL_DATATYPE_CHAR_STR改为ZCL_DATATYPE_UINT64,
接收方就能收到8字节正确的数据,说明长字节的数据不是用ZCL_DATATYPE_CHAR_STR,
那改用哪个数据类型呢?
YiKai Chen:
回复 user5367314:
用ZCL_DATATYPE_CHAR_STR時是用zclGetAttrDataLength決定字节長度的,你應該可以用IAR調試看為什麼zclGetAttrDataLength沒給出正確的dataLen
斌斌有礼:
如果你想用report命令去上报一个ZCL中没有的attribute,你可以自己定义。
关于数据长度你有一个错误,ZCL_DATATYPE_CHAR_STR,如果是0x41 42 43 44这几个数据类型,那么它的数据的第一个字节或者第二个字节表示的是后面的数据长度。其余的数据类型则不用考虑这个,直接传输一个该类型数据就可以了。
TI中文支持网

