我有个需求,当路由器断电,重新插上之后,我希望知道,路由器重新加入网络了。
但是我发现路由器重连并不会发送device_annce信号。
请帮帮我把。多谢
VV:
路由没重新入网这一说法,因为路由器只有在第一次入网的时候会有device Announce,之后路由器自己可以维持工作,即便重新上电也没关系的。
你可以在每次上电以后,发送一个应用层的数据出去,作为这个重新上电的标记。
fdar jc:
回复 VV:
嗨!VV:
能不能帮我看看下面的问题啊:
1、父节点丢失(断电或者设备损坏)后,子节点重连处理方法?
找过之前的论坛问题解答,您提出了如下方法:
1)、通过心跳数据包或者定时查询网络状态来判断父节点是否丢失。
2)、开启了NV_RESTORE,清除网络相关NV数据,重新入网。
3)、未开启NV_RESTORE,直接SystemReset()。
关于2)中清除网络相关NV数据,能否具体指出?3)中调用SystemReset(),如果不重启,清除哪些相关变量重新入网可解决?
2、长地址通信中,属于广播方式还是点对点?长地址是IEEE 地址还是Secondary地址,如果能用Secondary地址通信,具体实现代码能否给个示例?
如:
SampleApp_PointToPoint_DstAddr.addrMode = (afAddrMode_t)Addr64Bit;SampleApp_PointToPoint_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;
for(i=0;i<8;i++) SampleApp_PointToPoint_DstAddr.addr.extAddr[i]= New_Mac_Addr[i];
VV:
回复 fdar jc:
1,
// Set the NV startup option to force a "new" join. zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
SystemReset()
3)ZDApp_NetworkInit( 0);
2,
是的,你的方式是对的,但是用长地址通信,只是表面上用长地址,实际在底层还是通过长地址去搜索短地址,然后再通过短地址发送出去。
fdar jc:
回复 VV:
嗨!VV您好,感谢您的回复!
1、父节点丢失(断电或者设备损坏)后,子节点重连处理方法?
关于这个问题,我想了解:1)、父节点丢失后,协议栈本身做了哪些事?哪些事又是要在应用层完成的?
2)、未开启NV_RESTORE的情况下。不执行SystemReset();直接ZDApp_NetworkInit( 0);这样能实现吗?
2、长地址通信中,长地址是IEEE 地址还是Secondary地址?
VV:
回复 fdar jc:
1,
1)在父节点丢失以后,节点的状态机会发生变化,先是变成了Orphan的状态,然后到Resume,开始重新去找原先的网络,进入Rejoin状态。
从这个过程来说都是协议栈自动完成了,不需要用户在应用做改动的。
在最新的协议栈里面,也已经加进去了,父节点丢失了,长时间没办法找到原先的网络话,协议栈会让节点过段时间再找网络,目的是为了不让节点过多的消耗电池电量。具体你可以看下最新协议栈中的变量
// Rejoin backoff (silent period ) durationuint32 zgDefaultRejoinBackoff = REJOIN_BACKOFF;
2)你需要实现什么?重新找父节点??
2 首先在IEEE分为两个Primary IEEE和Secondary IEEE,Primary IEEE是固化在CC2530芯片里面,用户只能读。
Secondary IEEE是存放在Flash里面,允许用户读和写。
协议栈选择哪个地址作为自己的IEEE地址,是根据用户是否有往Secondary IEEE写数据,如果有的话,就用Secondary IEEE作为自己的IEEE。
如果Secondary IEEE没有写,全是0xFF的话,那么就默认使用Primary IEEE作为自己的IEEE地址。
这个逻辑的实现在zmain_ext_addr(void)中实现。
NBE NBE:
回复 VV:
协调器断电后,路由器不能重新加入网络,怎样处理