NV_RESTORE模式下,如何去维护关联表?
网络内的协调器和路由器有若干个,我希望协调器或者路由器即使遇到掉电,网络也不会瘫痪,下次重启协调器或者路由器就可以了。
终端节点遇到父节点掉电,会寻找新的父节点,但是父节点重新上电后,如果再对这个终端节点进行发送数据,会直接在关联表中发送数据,但是这个节点已经不在父节点中,所以会发送失败。所以我的做法就是终端节点定时广播ZDO的Annce指令,如果原来的父节点收到这个Annce,那么就是新父节点转发的,原父节点会把它删除。
但是广播Annce对网络负荷很大。我现在用了一种方法,就是协调器和路由器上电后,就检查关联表,如果关联表里面有终端节点,就删除。终端节点定时向父节点发心跳包,并等待应答。如果没有收到应答,就说明终端节点已经被父节点从关联表里面删除了(终端节点有父节点的地址可以直接发送,父节点没了关联表就根本无法寻找到终端节点),然后就用软复位,终端节点会用REJOIN的方式重新加入网络。
终端节点在REJOIN前会进入DEV_NWK_ORPHAN状态,如果没有找到父节点,就会进入DEV_NWK_DISC状态,如何判断DEV_NWK_DISC的结果?我希望终端节点在协调器和路由器全部彻底关机后,回到加入网络前的状态,即可以重新加入一个新的PAN。在NV_RESTORE下,如何恢复到加入网络前的状态?我现在就是直接擦除FLASH的NV_RAM区域
Hi Aries,
是不是可以考虑让您的父节点在重新上电后自己先检查一遍自己的关联表呢?
其实父节点也可以找到先前的子节点,建议用IEEE地址
为什么你需要在NV_RESTORE下还要新加入一个PAN呢?你是指新的一个PAN ID吗?
父节点上电后,检查关联表是没有意义的,先前加入的终端节点在父节点掉电后,会加入到其它的父节点中。如果重新上电的父节点要寻址某个终端节点,会在自己的关联表中找到该节点,但是这个时候是无法向该节点发送数据的。
另外,NV_RESTORE下,如果协调器和路由器都失效了,应该怎么办?怎么退出一个网络?
Hi Aries,
我的意思是您可以通过检查关联表,找到先前有哪几个子节点,并找到那几个节点的IEEE地址。
如果所有的协调器和路由器都失效了,那么终端节点也就从那个网络退出了
您你是需要该终端节点连上另外一个网络?为什么呢?
如果协调器,路由器也打开了NV_INIT, NV-RESTORE,那么它们重新上电后建立的网络跟先前的还是同一个。
终端节点也开了NV_INIT,父节点没有了会寻找新的父节点啊。一直这样死循环。
Hi Aries,
这时候的终端节点确实会在一直寻找先前那个网络的协调器或者路由器 以重新加入网络
这种情况下,假如你想让终端节点加入另外一个PAN ID的网络,可以调用"zgWriteStartupOptions(ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE);" 然后再重启该终端节点。
当然自己写程序擦除flash的NV区也是可以的