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.

休眠终端节点ReJoin之后一直发送Data Request

终端节点设置为PowerSaving模式,也屏蔽了NWK_AUTO_POLL,实测在正常情况下终端节点能正常进入休眠状态,并定时唤醒发送采集数据。

但是在有些时候,终端节点掉线重连以后就一直在发Data Request。根据Sniffer探测的数据包可以看到终端节点确实重新Rejion了并发送Device Announce,但是之后一直在发送Data Request数据包,发送的频率为440ms跟REJOIN_POLL_RATE参数一样,不知道问题出在哪里了。

PS:(种情况出现的概率很低,大部分情况终端节点能过够掉线重连并进入正常休眠状态的。

可以看到第二张截图终端节点0X335B一直在发送Data Request,第一幅截图也说明了终端节点正常入网了,其中的Private CLuster数据包为自己在终端节点入网之后的一些参数同步数据。

  • 我们根据您的情况测试了一下,没法复现您的问题.

    请问您能否给出完整的包?

  • 2.1测试抓包.cubx.zip

    谢谢大大的回复,我的完整抓包数据在附件,第1433个数据包开始,终端地址为0X335B。您看一下整个重新入网的数据有什么问题?

  • 这个问题我出现过,你可以参考一下。
    设置的REJOIN_POLL_RATE是休眠节点发送rejoinrequest 到datarequest请求回应的间隔。
    在这个时间间隔内,如果配置了ZDO_REJOIN_BACKOFF的功能,刚好把devState状态变为DEV_NWK_BACKOFF,就会导致你说的情况。你把REJOIN_POLL_RATE设置的很长,REJOIN_SCAN设置很短,就一定会出现
  • 这个问题有可能存在的,在Rejoin的时候,刚好切换到back off的状态。

    最后代码就没法运行到,void ZDApp_ProcessNetworkJoin( void )函数中的

            ZDApp_AnnounceNewAddress();
    
            if ( ( (ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE) == 0 )
                || ( (ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE)
                  && (zgChildAgingEnable == TRUE) ) )
            {
              NLME_SetPollRate( ZDApp_SavedPollRate );
            }

    导致poll rate没有修改过来了。

    但是一般都会把Back off 设置的比较长,不希望节点不停的去搜网

  • 嗯,我设置的Rejion_POLL_RATE为5min,REJION_SCAN为5S,这样做是为了让终端在掉线重新搜索网络的时候不回去去频繁的发送Beacon Request,节省电池电量。如果按照你这个说法,应该怎么设置这两个参数解决这种情况呢?
  • 那这样的话是否可以在ZDO_STATE_CHANGE事件中,判断poll rate是否为0(我设置不定时发送data request),如果不为0直接修改为0就可以修复这个Bug么?
  • 你好,我说的那样设置只是放了让你复现问题。如果你正常用的话,Rejion_POLL_RATE保持440ms就可以。我在ZDApp_ProcessNetworkJoin()中
    else if ( devState == DEV_NWK_ORPHAN ||
    devState == DEV_NWK_SEC_REJOIN_CURR_CHANNEL ||
    devState == DEV_NWK_TC_REJOIN_CURR_CHANNEL ||
    devState == DEV_NWK_TC_REJOIN_ALL_CHANNEL ||
    devState == DEV_NWK_SEC_REJOIN_ALL_CHANNEL ||
    +++ devState == DEV_NWK_BACKOFF)
    并入了对 devState == DEV_NWK_BACKOFF的处理