This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ZigBee 3.0 zcl_SendReportCmd使用

3.0协议栈协调器和终端通过zcl_SendReportCmd互发数据

1.发送多字节(例如10字节)的数据的时候pReportCmd->numAttr 是不是就是10?

zclReportCmd_t *pReportCmd;
pReportCmd->numAttr 
pReportCmd->attrList[0].attrID 
pReportCmd->attrList[0].dataType
pReportCmd->attrList[0].attrData 
2.接收端会进入下面的函数是吗?

case ZCL_CMD_REPORT:
zclSampleSw_ProcessInReportCmd( pInMsg );
我在接收函数里怎么提取数据?

static uint8 zclSampleSw_ProcessInReportCmd( zclIncomingMsg_t *pInMsg )
{

}

  • attr 值是report 几个属性,跟你单个属性上传的数据无关。

    可以看一下下面的文章有一定参考意义:

    bbs.newbitstudio.com/forum.php

  • zcl_SendReportCmd一次最大可以发送多少个字节的私有数据?
  • 这个取决你的应用程序可以申请出多少空间,以及考虑IEEE 802.15.4MAC数据包的最大长度为127字节
    ZCL REPPROT 参考
    SampleTemperatureSensor
    SampleThermostat
  • 建議一次发送不要超過60个字节
  • 测试的时候发现终端有掉线和自动重启的现象,抓包如附件,请帮忙看看是什么原因?3.0协议栈开关灯例程

    掉线自动重启.psd

  • 协调器通过zcl_SendReportCmd给2630终端发私有数据,
    2630终端在应用程序里怎么接收?
    协调器发送后会,2630的接收处理函数是?
  • 发送端:
    uint8 zclSampleSw_IR_CMD[4]={0};
    zclSampleSw_IR_CMD[0]=1;
    zclSampleSw_IR_CMD[1]=2;
    zclSampleSw_IR_CMD[2]=3;
    zclSampleSw_IR_CMD[3]=4;
    //发送
    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_UINT8;
    pReportCmd->attrList[0].attrData = (void *)(&zclSampleSw_IR_CMD);
    zcl_SendReportCmd( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr,
    ZCL_CLUSTER_ID_GEN_ON_OFF,
    pReportCmd, ZCL_FRAME_CLIENT_SERVER_DIR, TRUE, zclSampleSwSeqNum++ );
    }
    osal_mem_free( pReportCmd );
    接收端
    uint8 str[4]={0};
    zclReportCmd_t *pReportCmd;
    pReportCmd=(zclReportCmd_t *)pInMsg->attrCmd;
    osal_memcpy(&str,pReportCmd->attrList[0].attrData,4);
    HalUARTWrite(0,str,4 );
    接收端能收到,但是接收的数据不对,
    请问哪里代码有误?
  • pReportCmd->attrList[0].dataType = ZCL_DATATYPE_UINT8;這個不對,至少要設置成ZCL_DATATYPE_UINT32才能送4個bytes
  • 你有认真看过我第一个链接??
    要使用 ZCL_DATATYPE_CHAR_STR
  • 那我发送50个字节用什么类型?
  • 我以为ZCL_DATATYPE_CHAR_STR是字符串类型,我发的就是普通数据
  • 50字節可以用ZCL_DATATYPE_CHAR_STR或是ZCL_DATATYPE_ARRAY

  • 用ZCL_DATATYPE_CHAR_STR根本收不到任何数据
    用ZCL_DATATYPE_ARRAY可以收到数据,但是不对

  • 剛看了一下源碼,zclSerializeData裡面沒有處理ZCL_DATATYPE_ARRAY,所以應該要用ZCL_DATATYPE_CHAR_STR,你說用ZCL_DATATYPE_CHAR_STR根本收不到任何数据,那你有抓包看封包有沒有送出嗎?
  • 代码如下,看下是否有问题?

    dataType 为ZCL_DATATYPE_UINT8时,发送一个字节是没问题的

    但是dataType 改为ZCL_DATATYPE_CHAR_STR,发送4个字节就收不到了
    发送
    zclReportCmd_t *pReportCmd;
    zclSampleSw_DstAddr.addr.shortAddr = 0xFFFF;
    zclSampleSw_IR_CMD[0]=0xFA;
    zclSampleSw_IR_CMD[1]=0XF9;
    zclSampleSw_IR_CMD[2]=0X02;
    zclSampleSw_IR_CMD[3]=0X04;
    //发送
    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_CHAR_STR;
    pReportCmd->attrList[0].attrData = (void *)(&zclSampleSw_IR_CMD);
    zcl_SendReportCmd( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr,
    ZCL_CLUSTER_ID_GEN_ON_OFF,
    pReportCmd, ZCL_FRAME_CLIENT_SERVER_DIR, TRUE, bdb_getZCLFrameCounter() );
    }
    osal_mem_free( pReportCmd );
    接收
    zclReportCmd_t *pReportCmd;
    uint8 TestBuf[4]={0};
    pReportCmd=(zclReportCmd_t *)pInMsg->attrCmd;
    osal_memcpy(&TestBuf,pReportCmd->attrList[0].attrData,4);
    HalLedSet( HAL_LED_2, HAL_LED_MODE_BLINK );//灯闪烁
    HalUARTWrite(0,TestBuf,4 );//发给到串口

  • 建議你先抓包看看封包有沒有送出,還有不要用廣播
  • 抓包如附件,协调器一次发送4字节数据给终端

    发送的数为0xFA 0xF9 0x02 0x09001.psd04,终端收不到

  • 你好,抓包是什么情况?我看提示说数据超长了,就4个字节怎么超长了?
  • 感覺上zcl_SendReportCmd裡頭zclGetAttrDataLength的處理怪怪的,你用IAR進去調試看看
  • 用zcl_SendReportCmd发送100个字节数据,协议会自动拆成两帧数据,
    然后在接收端再自动组合成一帧长的数据
    还是需要手动拆包和手动组包?
  • 照理协议会自动拆成两帧数据,然后在接收端再自动组合成一帧长的数据