AssociatedDevList中的无效节点
[复制链接]
昨天发现一个问题,ED设备不定义NV_RESTORE宏,频繁掉电上电多次后,就不能入网了。 然后google了一下找到原因:ED设备反复入网,重新分配ShorAddr,AssociatedDevList就被占满了。 AssociatedDevList是一个类型为associated_devices_t的数组,容量为NWK_MAX_DEVICES。 先看associated_devices_t的定义: - typedef struct {
- UINT16 shortAddr; // Short address of associated device
- uint16 addrIdx; // Index from the address manager
- byte nodeRelation;
- byte devStatus; // bitmap of various status values
- byte assocCnt;
- byte age;
- linkInfo_t linkInfo;
- } associated_devices_t;
由于未开启NV_RESTORE,那么掉网设备重新入网后会被重新分配ShortAddr,将占用新的设备关联表条目。 而旧的关联条目,在Z-Stack中是不会主动被删除的。
总结一下解决的办法:
一. 全功能节点
类型associated_devices_t中,有一个age域,当关联表的维护者收到一条来自该短地址的Link Status消息,就会重置该域。 全功能节点(路由器)默认为15秒发送一次Link Status,那么父节点就可以通过age域来判断它的全功能子节点是否还连接在网络中。 - for(_nodeCounter = 0; _nodeCounter < NWK_MAX_DEVICES; _nodeCounter++) {
- if((CHILD_FFD_RX_IDLE==AssociatedDevList[_nodeCounter].nodeRelation) || (AssociatedDevList[CHILD_FFD==_nodeCounter].nodeRelation)) {
- if(AssociatedDevList[_nodeCounter].age > NWK_ROUTE_AGE_LIMIT) {
- //#TODO: Remove...
- }
- }
- }
二. 半功能设备 如果是终端设备,是不会定时发送Link Status的,那么通过age域来判断的方法就不可用了,因为无论该设备是否在网络中,age域都一直在累加。 TI E2E论坛中的大神发表了如下的方法:
编辑AssocList.h头文件,在associated_devices_t的类型定义中添加一个“idle”域,定时累加该域的值,直到收到一条来自该短地址的OTA消息,将该域的值重置。 这样就可以使用类似全功能设备的判断方法来删除无效的终端子节点了
|