Part Number:CC2530Other Parts Discussed in Thread:Z-STACK,
你好,我这边遇到一个问题,使用cc2530芯片,SDK使用Z-Stack Home 1.2.2a.44539版本,程序调用zcl_SendReportCmd()属性上报函数,反馈状态是成功的,但是抓包没有抓到任何属性上报数据,但是其他的Default Response等ack或读属性反馈啥的都有数据,单单属性上报没有数据发出来。而且这种现象只是偶尔上电才出现,如果上电入网后没有出现则一直都是正常的,一旦上电入网出现就一直都是这种现象,断电重启就恢复正常。请问下这种情况可能是什么东西导致的?
Kevin Qiu1:
卑鄙的信鸽 said:而且这种现象只是偶尔上电才出现,如果上电入网后没有出现则一直都是正常的,一旦上电入网出现就一直都是这种现象,断电重启就恢复正常。
这似乎有点奇怪,只是在某个设备上还是其他设备上也有这样的情况?
将使用zcl_SendReportCmd部分的代码传上来看一下
,
卑鄙的信鸽:
uint8 GeneralAttrReport(uint16 ClusterId,uint16 AttributeID,uint16 SourceEndpoint){ uint8 i = 0; uint8 state = ZFailure;
zclReportCmd_t* reportCmd = osal_mem_alloc( sizeof( zclReportCmd_t ) + sizeof( zclReport_t ));
zclAttrRec_t attrRec; if(reportCmd != NULL) { if(ZDApp_GetState() == DEV_ROUTER) { zclFindAttrRec( SourceEndpoint, ClusterId, AttributeID, &attrRec ); for(i = 0; i < SwitchLight_NumAttributes; i++) { if(attrRec.clusterID == ClusterId) { if(attrRec.attr.attrId == AttributeID) { reportCmd->numAttr = 1; reportCmd->attrList[0].attrID = AttributeID; reportCmd->attrList[0].dataType = attrRec.attr.dataType; reportCmd->attrList[0].attrData = attrRec.attr.dataPtr;
state = zcl_SendReportCmd(SourceEndpoint, &SwitchLight_DstAddr, ClusterId, reportCmd, ZCL_FRAME_SERVER_CLIENT_DIR,0,FALSE, SwitchLightSeqNum++); break; } } } }
osal_mem_free( reportCmd ); } return state;}
属性上报的代码就是这个。所有的设备都会出现这个现象。出现概率最多的情况是在还没入网的情况下断电,然后再上电入网。
,
YiKai Chen:
看你的源碼,不應該在迴圈裡一直調用zcl_SendReportCmd,如果有多個attribute,應該合併回報,另外,你的 SwitchLight_DstAddr內容是什麼?
,
卑鄙的信鸽:
你好,这个不会出现迴圈一直调用的,zcl_SendReportCmd()函数下面有个break,会跳出这个循环
,
YiKai Chen:
你的 SwitchLight_DstAddr內容是什麼?
,
卑鄙的信鸽:
宏定义为0x14
,
YiKai Chen:
宏定义为0x14是什麼意思?我問的是你的 SwitchLight_DstAddr內容填了什麼?
,
Kevin Qiu1:
DstAddr指的是上报的目标地址,你能把这种情况的抓包文件传上来吗
,
卑鄙的信鸽:
不好意思,我看错了,
afAddrType_t SwitchLight_DstAddr;
SwitchLight_DstAddr.addrMode = (afAddrMode_t)AddrNotPresent;SwitchLight_DstAddr.endPoint = 0;SwitchLight_DstAddr.addr.shortAddr = 0;
,
卑鄙的信鸽:
抓包??如果出现问题是抓不了属性上报的信息的
,
YiKai Chen:
AddrNotPresent是用binding table的資料去送report,你設備入網后有做binding嗎?
,
卑鄙的信鸽:
这边入网后有绑定操作的
,
YiKai Chen:
建議抓包確定一下在出問題的時候绑定操作是否有成功
,
卑鄙的信鸽:
这是出现问题时的入网流程
,
卑鄙的信鸽:
调试看绑定操作是没问题的
,
YiKai Chen:
抓包截圖沒看到绑定操作,你確定有問題的時候抓包檔裡面有看到綁定操作?
,
卑鄙的信鸽:
绑定操作的数据能抓包吗?绑定操作在抓包显示是怎样的?有没有类似我这个截图看下?绑定操作我只是在代码调试反馈的。
,
Kevin Qiu1:
binding也包含在抓包数据中,查看下面的46-60行:
,
卑鄙的信鸽:
有没有怎么绑定的相关资料可以看下?
,
YiKai Chen:
可以參考一下 sunmaysky.blogspot.com/…/how-to-do-device-binding-from-ti-ztool.html
,
卑鄙的信鸽:
链接打不开
,
Kevin Qiu1:
binding信息可以在下面文档第四章查看:
Z-Stack Developer's Guide.pdf
YiKai提供的链接需要使用VPN才能打开
,
卑鄙的信鸽:
看了资料,我这边是使用文档 4.1.2 中的bindAddEntry()函数添加绑定表的。所以抓包并没有出现你截图中的binding数据。所以我这边的绑定是否有问题?怎么改?
,
YiKai Chen:
你是如何用bindAddEntry添加绑定表?
,
卑鄙的信鸽:
BindingEntry_t *Entery = NULL; uint16 clusters[4]; zAddrType_t addr; addr.addrMode = Addr64Bit; sAddrExtCpy(addr.addr.extAddr, IEEEAddr); clusters[0] = ZCL_CLUSTER_ID_GEN_ON_OFF; clusters[1] = ZCL_CLUSTER_ID_PERSONAL; clusters[2] = ZCL_CLUSTER_ID_GEN_BASIC; clusters[3] = ZCL_CLUSTER_ID_HA_ELECTRICAL_MEASUREMENT;
Entery = bindAddEntry(SWITCHLIGH_ENDPOINT, &addr, 1,4, clusters);
入网后调用这些。
,
YiKai Chen:
sAddrExtCpy內的IEEEAddr是誰的IEEE address?
,
卑鄙的信鸽:
调用这个AddrMgrExtAddrLookup(coorAddr.addr.shortAddr, IEEEAddr)函数获取的
,
YiKai Chen:
AddrMgrExtAddrLookup這個是在入網後調用嗎?
,
卑鄙的信鸽:
是的。而且我在线调试过这个IEEE地址是没错的
,
YiKai Chen:
你調用bindAddEntry後要不要先檢查一下return回來的BindingEntry_t內容是不是正確的
,
卑鄙的信鸽:
这个函数返回的状态是正确的,在线调试也是正常的。BindingTable[]的数值也是正常的
,
YiKai Chen:
目前只能建議你調試zcl_SendReportCmd調用AF_DataRequest時有沒有error
,
卑鄙的信鸽:
你好,我换了个网关,试了几十次不会出现这种情况。之前的网关一试就出现了。但是我想设备的属性上报应该只是设备自己的功能而已,跟网关应该搭不上边,但这现象又这么奇怪。所以这问题可能出现在哪??
,
YiKai Chen:
卑鄙的信鸽 said:换了个网关
跟之前的网关是同樣的硬件跟軟件?只是換一台?
,
卑鄙的信鸽:
不一样,网关的硬件跟软件都不一样
,
YiKai Chen:
那你還是換回來不行的那台去調試看看zcl_SendReportCmd調用AF_DataRequest時有沒有error
,
卑鄙的信鸽:
不管有没有出现这个问题zcl_SendReportCmd調用AF_DataRequest的反馈都是success,从来没出现反馈是error
,
YiKai Chen:
如果你report的目的地就是coordinator,然後endpoint也是固定的,你要不要在SwitchLight_DstAddr內使用short address mode然後destination short address就是0x0000再測試看看
,
卑鄙的信鸽:
这边要用绑定操作,所以还是得弄清楚这个问题。你们这边的有没有绑定操作的参考代码??还有属性上报AF_DataRequest()–>APSDE_DataReq( &req )后,在哪里能看到数据真的发送完成?还有这个属性上报的数据缓存大小在哪里可以看??
,
YiKai Chen:
绑定操作一般會由coordinator透過ZDP_BindReq來發送給要绑定的設備,而不是直接在設備上去添加绑定表
,
卑鄙的信鸽:
使用手册文档 4.1.2 中绑定操作类型,有没有参考代码?还有属性上报AF_DataRequest()–>APSDE_DataReq( &req )后,在哪里能看到数据真的发送完成?还有这个属性上报的数据缓存大小在哪里可以看??
,
YiKai Chen:
1. 绑定操作参考代码 https://www.twblogs.net/a/5b884cfc2b71775d1cdb80cf
2. APSDE_DataReq( &req )后就是Z-Stack lib的事情,應用程序這邊是沒辦法看到進一查看Z-Stack发送的狀況,除非你有源碼
,
卑鄙的信鸽:
你好,这个链接打不开。还有这个属性上报的数据缓存大小在哪里可以看??
,
YiKai Chen:
卑鄙的信鸽 said:这个链接打不开
應該是被防火牆擋住了。
卑鄙的信鸽 said:数据缓存大小在哪里可以看
應用程序是沒辦法調適Z-Stack libary的部份的
,
卑鄙的信鸽:
关闭防火墙都打不开,有没有能打开的链接?
,
YiKai Chen:
…
,
卑鄙的信鸽:
好的,谢谢