微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 关于终端不能重新入网问题,请TI工程师赐教了!

关于终端不能重新入网问题,请TI工程师赐教了!

时间:10-02 整理:3721RD 点击:

问题描述:

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工程师和各位高手指点迷津了!谢谢!

根据单步仿真发现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进行操作,二点导致的问题出现可能性比较小,具体还在查找。

也遇到类似的问题,不知道你解决了没有?

调用LEAVE命令,节点有没有重新入网成功? 

按照你的代码,节点应该会rejoin到网络里面。 

另外如果节点长时间运行以后,不重启,这个问题会出现吗?

ZDApp_Init函数里面有一个ZDAppCheckForHoldKey函数,如果是1.2.2a版本的协议栈的话会有

if ( zdappHoldKeys == SW_BYPASS_START )
{
// Change the device state to HOLD on start up
devState = DEV_HOLD;
}

这样一段语句,可能是这个造成的 ,要么把这个语句屏蔽试一试 或者干脆直接把ZDAppCheckForHoldKey这个函数屏蔽掉试试看..

NLME_LeaveReq( &req );

AssocRemove(addrEntry.extAddr);

想删掉EndDevice,这样调用,leave根本发不出来,去掉AssocRemove(addrEntry.extAddr);就可以。

请问,你删EndDevice也是这样调用的吗?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top