This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于 coordinator realignment 入网方式的 疑问!

Expert 1850 points

有个终端设备 在一个环境里面 存在多个 协调器!

终端设备 发出orphan notification , 结果这些 协调器都回复 了 coordinator realignment 给他!

于是 它 选了一个发 MAC  ACK , 但是入不了网!(因为这个协调器不是它正在的 父节点!)

后续 它 又 发出beacon request 出去, 它真正的父节点  回复了它  正确的beacon,  但是它就是无法入网!!!!

只能重新上电, 然后碰巧它选择了对的父节点  回复MAC ACK 才可以入网!!!! 

log:

以下几个问题:

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 );
    }
    }