网络内的协调器和路由器有若干个,我希望协调器或者路由器即使遇到掉电,网络也不会瘫痪,下次重启协调器或者路由器就可以了。
终端节点遇到父节点掉电,会寻找新的父节点,但是父节点重新上电后,如果再对这个终端节点进行发送数据,会直接在关联表中发送数据,但是这个节点已经不在父节点中,所以会发送失败。所以我的做法就是终端节点定时广播ZDO的Annce指令,如果原来的父节点收到这个Annce,那么就是新父节点转发的,原父节点会把它删除。
但是广播Annce对网络负荷很大。我现在用了一种方法,就是协调器和路由器上电后,就检查关联表,如果关联表里面有终端节点,就删除。终端节点定时向父节点发心跳包,并等待应答。如果没有收到应答,就说明终端节点已经被父节点从关联表里面删除了(终端节点有父节点的地址可以直接发送,父节点没了关联表就根本无法寻找到终端节点),然后就用软复位,终端节点会用REJOIN的方式重新加入网络。
终端节点在REJOIN前会进入DEV_NWK_ORPHAN状态,如果没有找到父节点,就会进入DEV_NWK_DISC状态,如何判断DEV_NWK_DISC的结果?我希望终端节点在协调器和路由器全部彻底关机后,回到加入网络前的状态,即可以重新加入一个新的PAN。在NV_RESTORE下,如何恢复到加入网络前的状态?我现在就是直接擦除FLASH的NV_RAM区域