节点被协调器删除,但是没有脱离网络,依然在发Data_Request()
协议版本:home1.2.2.a
条件:7个节点,无路由,开启child aging,counter =10s;;Poll_rate = 1s;开启Extend PanID。
现象:刚开始都是正常,运行一段时间之后(不一定多长),会出现个别节点不能再接收协调器信息,查看抓包文件,协调器确实没有发信息,观察AssociatedDevList,发现列表中已经没有了该节点的信息,但是节点已经在发Data_Request(),而不是脱离网络并重新加入。此时只需要停止运行协调器一段时间,再接着运行就恢复正常,请问是哪个参数设置不合理造成这个现象,或者怎么解决这个问题?
EndDevice发了Data Request给父节点,父节点会回复Leave命令给EndDevice。
您好,谢谢答复,原理上讲应该是这样的,但是事实上发生这种现象之后,节点一直在data request,父节点并无应答,如果不人为干预的话,节点将一直无法恢复通讯,是设置上还有什么问题吗?
应该节点距离太远或信号差,导致没有能够接收到协调器的命令。而协调器本身已经清除了节点信息,所以无法再通信上。
谢谢,应该也不是这个问题,节点们和协调器相距大概10米,但是7个节点是在一起的,在协调器处抓包看LQI大概是40-60.无法通讯的原因应该就是你说的这个,但是我不知道该怎么恢复通讯。
强制开启默认允许节点入网
这个已经开启,只不过节点自己不知道自己脱离了网络,所以没有重新入网的这个过程。
所以说设置心跳还是必要的,终端上报2次心跳(可以设置)没有收到回复,会自己判断自己掉线了。
实在不行就只能先这么解决了,不过请问下,心跳包怎么设置次数?
我这个问题还有个特别之处。。。被删掉的节点data request 居然还有ack。。。
您可以在协议栈内使能zgChildAgingEnable功能。
使能该功能后,终端节点在入网成功以后会通过Device Announce把Timeout相关的信息发给父设备,ZDApp_AnnounceNewAddress里的NLME_SendEndDevTimeoutReq。
在父设备上面,收到这个req以后,会调用到下面这个函数
NLME_ProcessEndDevTimeoutReq( NLDE_FrameFormat_t *ff )
如果收到data req,就会把节点信息从NotmyChildlist重新移到Associate list里面去。如果在NotmyChildList里面的counter的时候,那么就把这个节点彻底删除了NwkNotMyChildSendLeave。
所以如果要判断节点是否在线,只需要判断在AssociateList还是否存在就可以了。
AssocGetWithShort( uint16 shortAddr )
谢谢susan,但是我已经开启了zgChildAgingEnable这个功能,timeout时间为10s。为了暂时解决这个问题,我还2minutes发送一个心跳包ZDApp_AnnounceNewAddress()更新节点的路径,但是运行3天后,7个节点掉了5个,再也无法通讯。附件是有掉线状态的抓包文件。
而且掉线的节点,重启之后就正常,在抓包文件中看不出有何异常,data request都是会有ack。
还有个现象,就是协调器可以收到节点返回的数据,但是节点无法接收协调器的数据,问题就集中在这儿了。
貌似我这个现象和这个现象一致,http://www.deyisupport.com/question_answer/wireless_connectivity/zigbee/f/104/t/101010.aspx,但是我已经使用了Z-Stack Home 1.2.2a.44539这个协议栈了
没有办法,child aging不是很稳定,只好disable了,然后改用心跳包的方式更新路径,并且一直打开接收,去掉data request,目前比较稳定。