问题描述:
1. 协调器、路由器、终端预编译了NV_RESTORE=1和NV_INIT;协调器、路由器禁止未经认证的设备入网。
2. 路由器与终端每隔10秒发一次心跳包给协调器,协调器在一段时间内没有收到心跳包,将会清除相应的设备;程序如下:
……
AddrMgrEntry_t addrEntry;
NLME_LeaveReq_t req;
// Set up device info
addrEntry.user = ADDRMGR_USER_DEFAULT;
addrEntry.index = index;
if (AddrMgrEntryGet( &addrEntry ))
{
req.extAddr = addrEntry.extAddr;
req.removeChildren = TRUE;
req.rejoin = TRUE;
req.silent = FALSE;
NLME_LeaveReq( &req );
AssocRemove(addrEntry.extAddr);
……
3. 遇到的问题
路由器或终端在运行相当长一段时间之后,或者在随意上电重启后,会出现路由器或终端无法加入网络;是随机出现的了,不定时不定点出现。重启等也无法加入网络,只有协调器按下按键,调用NLME_PermitJoiningRequest(10)之后,出问题的设备才能重新加入网络
4. 抓包发现有问题的路由器或终端没有发出"Orphan notification"数据包
5. 总结:现在还不知道是因为协调器没有收到心跳包将设备移除,还是其它原因导致的了。
请TI工程师和各位高手指点迷津了!谢谢!
WEN LI2:
根据单步仿真发现uint8 ZDOInitDevice( uint16 startDelay )->uint8 ZDApp_RestoreNetworkState( void )->networkStateNV = ZDApp_RestoreNetworkState();->在uint8 ZDApp_RestoreNetworkState( void )函数中的 if ( NLME_RestoreFromNV() )出问题,NLME_RestoreFromNV()读取的数据为0,推测NV中的数据被更改了,NLME_RestoreFromNV()非开源,无法看到更详细的内容。猜测:一是主动更改NV数据,二是存储其它数据到NV的时候意外更改了NLME_RestoreFromNV()中的数据,三是程序运行越界导致NV的数据被更改。我的应用程序层并没有对NV进行操作,二点导致的问题出现可能性比较小,具体还在查找。
user4356936:
回复 WEN LI2:
也遇到类似的问题,不知道你解决了没有?
VV:
回复 user4356936:
调用LEAVE命令,节点有没有重新入网成功?
按照你的代码,节点应该会rejoin到网络里面。
另外如果节点长时间运行以后,不重启,这个问题会出现吗?
wei shi5:
回复 WEN LI2:
ZDApp_Init函数里面有一个ZDAppCheckForHoldKey函数,如果是1.2.2a版本的协议栈的话会有
if ( zdappHoldKeys == SW_BYPASS_START ) { // Change the device state to HOLD on start up devState = DEV_HOLD; }
这样一段语句,可能是这个造成的 ,要么把这个语句屏蔽试一试 或者干脆直接把ZDAppCheckForHoldKey这个函数屏蔽掉试试看..
Jason hu1:
NLME_LeaveReq( &req );
AssocRemove(addrEntry.extAddr);
想删掉EndDevice,这样调用,leave根本发不出来,去掉AssocRemove(addrEntry.extAddr);就可以。
请问,你删EndDevice也是这样调用的吗?