请问节点退网的具体流程是怎样的?调用到了协议栈中的哪些函数?想实现的功能为:协调器指示某个节点退网,节点在收到指示后自动退出网络,协议栈有相关函数支持该功能吗?谢谢
VV:
你可以在协议栈里面搜索下面函数,了解下关于退网的流程和使用方法
NLME_LeaveReq( NLME_LeaveReq_t* req )
ZDO_ProcessMgmtLeaveReq( zdoIncomingMsg_t *inMsg )
yun gao:
回复 VV:
@VV,
您好!十分感谢您的解答!我的协调器在调用了ZDP_MgmtLeaveReq()后成功实现了让需要退网的节点退网了,但我仍有几个疑问:
1. 对于NLME_LeaveReq_t中的rejoin的TRUE和FALSE分别代表什么意思?我在将rejoin设为FALSE时,节点退网后将不会再搜索网络,请问这时节点处于一种什么状态?在哪一步将节点的网络初始化步骤给停掉了?只有在将rejoin设为TRUE时,节点退网后才会再次执行搜索网络的步骤。
2. 我目前所实现的节点退网方式为:协调器串口接收到需要退网的节点MAC地址,协调器调用ZDP_MgmtLeaveReq()将需要退网的节点MAC地址广播出去,节点收到该消息后进入ZDO_ProcessMgmtLeaveReq()进行相关的处理,然后执行了NLME_LeaveReq(),请问节点执行了NLME_LeaveReq()后会发生什么事件?和NLME_LeaveInd()以及NLME_LeaveRsp()之间有什么关联?
3. 低功耗终端退网的功能该如何实现?因为退网的指令是随时发送的,而低功耗终端须隔较长时间才会醒来接收一下数据,因此几乎都无法接收到协调器广播的退网指令,我目前的实现方法为:终端醒来后先发送心跳包,若未收到回应包则初始化为新节点,由于其它节点在调用了NLME_LeaveReq()后将该终端的相关信息都删除了,因此无法发送回应包给该终端,该终端就自然而然地初始化了。请问是否还有更加简便的实现方法?
希望您能为我解答!谢谢!
VV:
回复 yun gao:
@yun gao,
1, rejoin 设置为TRUE的话,父设备再让节点离开网络以后,节点并没有删除之前网络的网络参数,节点还是可以通过Rejoin的方式入网。
如果设置为FALSE的话,子设备在离网以后,就不会通过rejoin方式加网了,重新去搜索一个新的网络了。
无论哪一种,在离网以后,搜索网络都会的,你可以看下void ZDApp_LeaveReset( uint8 ra )
2,就是把自己的状态恢复到初始化状态,然后重启去搜索网络,至于搜索后是rejoin还是join就看 rejoin flag的设置了。
NLME_LeaveInd()以及NLME_LeaveRsp()是内部层与层之间的交互,不需要关心
3,或者可以你的节点发送心跳包的时候,父设备再发送leave 命令也可以的。