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消息,将该域的值重置。
这样就可以使用类似全功能设备的判断方法来删除无效的终端子节点了
不建议修改 associated_devices_t结构,定时轮询AssociatedDevList,如果是RFD,age加1。然后可以用Annce作为心跳包。
请教大神,协调器中AssociatedDevList数组的大小是否就是限制入网设备个数的量,我看的实例程序中数组大小为20,我仿真程序看到每入网一个设备,这个数组就会有一组数据修改,应该是记录了新入网设备的短地址等相关信息,难道只能存20个设备的信息?
大家好,我在sampleApp里面通过串口打印AssociatedDevList这个数组的信息,发现其初始化只有3个数据N:21index:5shortA:0FFFnodeR:5devS:5age:51
N:21index:5shortA:0FFFnodeR:5devS:5age:52
N:21index:5,
后续路由器加入的时候,也不会增加节点,请问这个是什么原因
请问怎么实现啊,Annce是终端发出来的么?那是广播给所有设备还是单播给父节点呢?
我觉得不是入网设备个数限制在20,而是每个设备关联的设备个数不超过20个吧?