最近调试终端退网功能,开始使用NLME_LeaveReq()和ZDApp_LeaveReset(),一直出现退网之后终端再次加网会失败的问题无法解决,终端执行退网动作后在协调器的关联表中还会存在退网节点的信息,感觉不合道理。昨天试了下使用ZDP_MgmtLeaveReq()发现都解决了, 无论终端还是协调器使用ZDP_MgmtLeaveReq()都能使终端成功退网并且退网后无论再次原来的还是另一个网络都能顺利加入,且退网后协调器的关联表会立即将退出节点信息删除。
在协调器使用ZDP_MgmtLeaveReq()时dstAddr参数为终端的地址,IEEEAddr为终端的IEEE,终端使用时dstAddr参数为协调器的地址,IEEEAddr仍为终端的IEEE。
根据这样的结果来看应用程序执行退网操作的方法应该是使用ZDP_MgmtLeaveReq()而不是 ZDApp_LeaveReset()/NLME_LeaveReq(),当然中间的过程会有执行到 ZDApp_LeaveReset()/NLME_LeaveReq()那是过程中间的事情应用程序不需要关注。
Viki Shi:
调用ZDP_MgmtLeaveReq()进行设备退网操作时,也是通过ZDO的Mgmt消息处理函数ZDO_ProcessMgmtLeaveReq()来调用NLME_LeaveReq()函数,来实现退网申请
user4975928:
回复 Viki Shi:
但是我直接调用NLME_LeaveReq()来实现退网申请总会出现之后不能重新成功加网的情况,我觉得是ZDP_MgmtLeaveReq()发起的过程中NLME_LeaveReq()只是完成一部分操作,所有单独使用NLME_LeaveReq()时还有一部分必要的处理没有进行从而导致后面重新加网失败的吧!?
YiKai Chen:
退网之后终端再次加网時,你在退网之后有先呼叫zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE )然後做SystemResetSoft()來再次加网嗎?
user4975928:
回复 YiKai Chen:
有,在测试使用
if( NLME_LeaveReq(&req)==afStatus_SUCCESS )
{ZDApp_LeaveReset(false);
}
的方式做退网时,ZDApp_LeaveReset()是会发出ZDO_DEVICE_RESET事件,系统在ZDO_DEVICE_RESET事件处理中会先
zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );然后再SystemResetSoft(); 。但是这种方式在Reset之后再次加网会失败,现象是:
1)req.rejoin =false, ZDApp_LeaveReset(false);退网后复位,重启加网没反应,CO、ED同时复位后加网失败(END_DEVICE_UNAUTH反复);再次都重启,加网成功(仅一次,之后再重复都_DEVICE_UNAUTH);
2)req.rejoin =true, ZDApp_LeaveReset(false);退网后立即重连,成功,随后复位;重启后加网没反应,CO、ED同时复位后加网失败(END_DEVICE_UNAUTH反复);
YiKai Chen:
回复 user4975928:
請問你用的Z-Stack版本?
user4975928:
回复 YiKai Chen:
3.0.1
YiKai Chen:
回复 user4975928:
試試下面的步驟
1. 呼叫NLME_LeaveReq
2. 呼叫bdb_setFN
3. 呼叫osal_start_timerEx( ZDAppTaskID, ZDO_DEVICE_RESET, 1000)
user4975928:
回复 YiKai Chen:
YiKai Chen試試下面的步驟 1. 呼叫NLME_LeaveReq 2. 呼叫bdb_setFN3. 呼叫osal_start_timerEx( ZDAppTaskID, ZDO_DEVICE_RESET, 1000)
YiKai Chen:
回复 user4975928:
你可以試試手動把协调器关联表上的已退终端的信息清除