如何处理coordinator掉电后,重新上电panid+1的问题~
我用的IC是CC2530 协议栈是zstack cc2530 2.5.1a。测试发现coordinator与两个router组网后,然后coordinator掉电,再上电,则coordinator的PANID就会+1,与原来的router不连接。
个人理解:
1.coordinator本身也是router,是带有建网功能的router,在建网的时候,扫描周围zigbee网络,发现存在一个panid与自己一样的zigbee网络时候,为了防止网络冲突,PANID自动+1,然后建立新zigbee网络。
2.router 在coordinator建网后,coordinator再掉网,每隔15s与网络地址是0x0000的coordinator沟通,沟通不了AssociatedDevList.age+1,若有其他设备上电,如router或end device,则其他设备与该router连接。
以上两点是导致coordinator掉电后重新上电,与原来网络不连接的原因。
我们大家都知道coordinator掉电无可避免,同时又不能让客户将所有的router与end device重启,这样的话,会导致该产品无法使用。
注意网上大神提供的方法:增加NV_RESTORE选项可以解决这个问题.这个是不能解决问题的。原因是个人理解的第一点。请不要再给这个建议了!
希望大家各抒己见,一起把这个问题解决。TI的zigbee 就完美了~
1, 正确
2,正确
导致与原先网络连接不上的原因是,重新上电的Coordinator已经和原先的Router不在同一PAN网络下了。
如果开启了NV功能以后,当协调器掉电上来以后不会再去重新建网了,而是直接在原先的网络上工作了,因为保存了之前网络的PANID
感谢VV 大神回复~出现上面问题,有一个前提,我的zigbee网络的PANID是固定的,不是网络上的0XFFFF,所以使能NV功能后无效果。如果不用固定PANID 那VV 大神,能提供些入网管控的方法么?另外为什么固定了PANID后,使能NV后无效果?这个是否能给予答案~谢谢~
楼主 请问 你的的panid+1的情况是在panid不为0xffff的时候还是为0xffff的时候呢》
现在我的做法基本上是让终端不自动加入网络,然后将panid设置为非0xffff,然后通过给coo提供mac地址方法来加入终端到网络中
感谢回复~我出现问题是PANID不为0XFFFF的时候,固定某个值,比如0x0001,自动加入网络,同时网络里面必须有两个以上router,这样coodinator掉电重启就出现这样问题。
你的做法是否可以这样理解:end device PANID为非0xffff值,不主动加入网络,根据coordinator的MAC地址加入网络?我是想知道当你设备加入好网络后,跟我网络状况一样,至少两个router,然后coordinator掉电,这样会不会出现PANID+1的情况,那如果出现这样情况的话 你们是如何处理。
可以留联系方式么。比如qq,mail等 我的QQ 781358810 有兴趣讨论下~感谢~
“我出现问题是PANID不为0XFFFF的时候,固定某个值,比如0x0001,自动加入网络,同时网络里面必须有两个以上router,这样coodinator掉电重启就出现这样问题。”
只要1个Router就可以。
你的做法是否可以这样理解:end device PANID为非0xffff值,不主动加入网络(是主动入网),根据coordinator的MAC地址加入网络(选择合适的PANID加入网络)?我是想知道当你设备加入好网络后,跟我网络状况一样,至少两个router,然后coordinator掉电,这样会不会出现PANID+1的情况(会),那如果出现这样情况的话 你们是如何处理。(开启NV_RESTORE)
TI W工程师的意思是否这样的?
1. 将coordinator,router,end device都开启NV_RESTORE。
2.第一次网络建好后,所有的网络参数如PAN id等都被ZC,ZR,ZE保存了。当ZC重新上电时,不会再去侦测PAN ID等,直接调用NV ROM保存的网络参数,所以也就不存在PAN+1的问题了。
之前看到有个贴子说,如果ZC,ZE开启了NV_RESTORE,ZR不开启NV_RESTORE的话无法做中继,是否是这样的? 谢谢!
TI VV大神~经过不下10次测试,coordinator与router都开启NV_RESTORE,coordinator与2个router组网,然后coordinator掉电,掉电时间接近1分钟,然后再上电,这样coordinator的PANID,如果是设定的话,非0xffff,则PANID+1,若是0xffff,则又随机生成一个panid,与原来的panid不一样,与原来zigbee网络无法连接。请问你们提出建议的时候有自己测试么?
希望TI的大神们,能回复下这个问题啊,我也面临着这样的问题!
今天跟了下代码,发现在ZDapp.c,有个函数uint8 ZDApp_RestoreNetworkState(vodi)函数里面有个NLME_RestoreFromNV()的值为0,导致coordinator是为创建网络而不是恢复网络。NLME_RestoreFromNV()函数无法跟到,所以不知道为什么启动NV后不恢复网络而是创建网络,麻烦帮忙分析下~
同样的问题,2013年7年有提出,网络地址:http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/25124.aspx
你是在哪个协议栈版本?哪个samplecode里面做的测试?
协议栈是zstack cc2530 2.5.1a,coordinator用的是ZNP,Router是HA里的LightingDevice,谢谢!
No news is good news!
德州仪器(TI)来自模拟和嵌入式处理等多个产品线的专家在此为您答疑解惑。他们分别在模拟、MCU以及嵌入式处理等领域拥有多年的现场技术支持经验,并且在多种应用领域中,积累了丰富的系统经验。我们欢迎您随时提出您在设计中遇到的技术问题,TI专家将尽快给予您满意的答复。
TI大神又skip 这里!
Iven,
你好,不好意思回复晚了。
我这边测试都没有问题啊!加入NV_RESTORE就可以了。
VV大神,感谢你的回复。
我不知道你的测试方法和使用的代码是否一样,测试无数遍,我这边一定会出现panid+1的问题,所以你的回答没什么意义。
我在你们TI E2E论坛上发了同样的问题,大概能找到原因了,现在在解决这个问题。如果按照我使用的代码是一定会出现这个问题,但是目前很少人会使用这个代码,所以这个问题不是每个人都能碰到的。结贴吧.
非常感谢,把E2E帖子发出来,可以让其他人看到。
http://e2e.ti.com/support/wireless_connectivity/f/158/t/348223.aspx?pi267162=3
VV大神~辛苦你把我发的在E2E上的贴发出来,貌似现在问题也还没解决~
VV大神,发下牢骚~我也看了大部分你们的回复:简单,模糊,没什么建设性质等等。
Iven
我这边做了两个实验,
1)利用Z-Stack 2.5.1a里面 GenericApp做Coordinator和Router,在编译选项里面加入NV_RESTORE。在f8wconfig文件固定PANID
跟你做了一样的操作,协调器在重新上电以后,还是原来的PANID工作
2)利用Z-Stack 2.5.1a里面的ZNP做Coordinator,GenericApp做Router,在编译选项里面加入NV_RESTORE。在f8wconfig文件固定PANID
利用你Z-Tool控制协调器,发送了两个命令 ZB_SYSTEM_RESET 和 ZB_START_REQUEST把协调器建立起来了,让路由加入进去。
然后把Coordinator reset,再发送 ZB_SYSTEM_RESET 和 ZB_START_REQUES,结果还是原先的PANID。
我做的实验是否跟你一样的?
谢谢!
vv大神,想不到你还在研究我的问题~真心谢谢~你的第二个实验跟我相似,不过我不下命令,直接掉电重启,测试10遍,有概率出现。
掉电重启以后,你的host给CC2530ZNP发送了什么命令,因为ZNP是被动设备,如果仅仅是复位的话,CC2530应该不会有动作的,需要host发命令才可以的。
我改代码变成自动运行网络,host只读取panid和channel~
-DHOLD_AUTO_START 注释掉~
ok,你改自动运行以后,能不能把你修改的代码分享下。
谢谢!
不好意思~ 这个不太好给~ 谅解~
把HOLD_AUTO_START去掉以后,我这边测试,还是一样的结果。
为什么会有概率性出现?如果有问题,应该每次都必现的才对。
在启动网络开始时候,会判断是新网络,还是恢复网络。
函数在zdoAPP.c的ZDOInitDevice里networkStateNV = ZDApp_ReadNetworkRestoreState();读到的是新网络,还是恢复网络,从这个函数读到。
由于Z_stack是半开源的,所以我不确定什么地方写成新网络了~
这个函数时开源的
/*********************************************************************
* @fn ZDApp_ReadNetworkRestoreState
*
* @brief Read the ZCD_NV_STARTUP_OPTION NV Item to state whether
* or not to restore the network state.
* If the read value has the ZCD_STARTOPT_DEFAULT_NETWORK_STATE
* bit set return the ZDO_INITDEV_NEW_NETWORK_STATE.
*
* @param none
*
* @return ZDO_INITDEV_NEW_NETWORK_STATE
* or ZDO_INITDEV_RESTORED_NETWORK_STATE based on whether or
* not ZCD_STARTOPT_DEFAULT_NETWORK_STATE bit is set in
* ZCD_NV_STARTUP_OPTION
*/
uint8 ZDApp_ReadNetworkRestoreState( void )
{
uint8 networkStateNV = ZDO_INITDEV_RESTORED_NETWORK_STATE;
// Look for the New Network State option.
if ( zgReadStartupOptions() & ZCD_STARTOPT_DEFAULT_NETWORK_STATE )
{
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE;
}
return ( networkStateNV );
}
你断点可以调试返回的值是什么?
我从头看了两遍这个贴,每一楼都认真看了~你说的这个函数是开源的~但是zgReadStartupOptions() ,这个涉及的函数就有不开源的~还有我之前查到的信息是Host需要设置一些参数,我们没设置,导致有可能会变创建网络~
http://bbs.eeworld.com.cn/thread-439954-1-1.html
这个是我在eeworld发的贴。
同样问题的贴:
http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/25124.aspx
设置断点,有时候得到02
if (event == MAC_MLME_BEACON_NOTIFY_IND )
{
tmp += sizeof(macPanDesc_t) + pData->beaconNotifyInd.sduLength;
/*lianglinz616@163.com,固定PANID不变*/
if(zgDeviceLogicalType == ZG_DEVICETYPE_COORDINATOR)
{
osal_msg_deallocate( (uint8 *)pData );
return;
}
}
你是解决问题?不适用NV_RESTORE选项?
NV_RESTORE 应该也可以吧. 你可以测试下.
linzhi lianglinzhi 大神~ 麻烦你看完所有的楼的内容~ 谢谢~
请修改协调器代码测试验证.
大神~这个问题是已经修改代码验证后才发出来的问题~麻烦~
Iven,
能否私信告诉我,你修改代码的地方,方便我们一起找下问题。
谢谢!
您好,问题解决没有我也出了同样的问题NLME_RestoreFromNV()返回值为0