关于 coordinator realignment 入网方式的 疑问!
有个终端设备 在一个环境里面 存在多个 协调器!
终端设备 发出orphan notification , 结果这些 协调器都回复 了 coordinator realignment 给他!
于是 它 选了一个发 MAC ACK , 但是入不了网!(因为这个协调器不是它正在的 父节点!)
后续 它 又 发出beacon request 出去, 它真正的父节点 回复了它 正确的beacon, 但是它就是无法入网!
只能重新上电, 然后碰巧它选择了对的父节点 回复MAC ACK 才可以入网!
log:0882.1.rar
以下几个问题:
1. 为什么不是它 父节点的 协调器 也会 回复它 coordinator realignment ~~~~?
2. 为什么 收到 coordinator realignment 之后 ,它能识别不是它父节点?
3. 既然识别出来了, 为什么后续真正的父节点 发beacon 给它, 它又入不了网呢?
1. 为什么不是它 父节点的 协调器 也会 回复它 coordinator realignment ~~~~?---------------因为orphan notification是在当前信道里面广播的命令。在这个信道的所有协调器和路由器都会回复的(记住,不管是否是在之前的那个网络)。
2. 为什么 收到 coordinator realignment 之后 ,它能识别不是它父节点?------因为节点可以根据回复的coordinator realignment 命令识别是否是之前的父节点。根据panId、网络地址和它自己本身的关联表里面的内容进行比较就可以了(自己理解的)。
3. 既然识别出来了, 为什么后续真正的父节点 发beacon 给它, 它又入不了网呢?-------这个确实存在,要在协议栈里面增加点代码即可实现。
1. ~~~~?---------------因为orphan notification是在当前信道里面广播的命令。在这个信道的所有协调器和路由器都会回复的(记住,不管是否是在之前的那个网络)。
这一点我不赞同! 因为我尝试过, 如果设备发leave 指令 而且leave 指令被旧协调器收到(或者说旧父节点收到) ,那么下次它发orphan 的时候,这个旧的父节点是不会再回复coordinator realignment的!
所以这里不是因为 orphan 是广播,所以导致所有协调器和路由器都会回复, 事实上是因为 父子关系依然 存在由于 父节点端, 所以父节点才回复的~~~
2. 这一点应该是 根据 extern PANID 判断~~~但目前我还是找不到在哪里
3. 请问你是如何 增加代码的?
1、第一点,如果有leave 指令是设备主动离开的话,有可能不会回复。这种情况我没有测试。误导了.....哈哈
3、zstack2.5.1A -----文件ZDApp.C
void ZDApp_NetworkInit( uint16 delay )
{
if ( devStartMode == MODE_REJOIN )//ADD
{//ADD
_tmpRejoinState = true;//ADD
}//ADD
if ( delay )
{
// Wait awhile before starting the device
osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay );
}
else
{
osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT );
}
}