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.

CC2652R 作为end-device 遇到一直发送data request的问题

Other Parts Discussed in Thread: Z-STACK, CC2652R

使用最新的CC2652R,配合Z-Stack plugin 2.0版本,遇到如下几个问题。附件有ubiqua 2.1抓包文件。

首先CC2652R硬件没有任何问题,进入休眠模式,整机功耗在1uA以内。

1、协议栈data request(poll rate)默认是1S一次,这样对于电池供电的end-device来说太费电了,因为平时也不需要给end-device发数据,所以也不用它请求data request,能否直接设置为0关闭data request?

我试了设置为0,的确不再发送data request了,但是end-device长时间休眠以后,再次外部按键唤醒时,也能发送scene recall,没生效,接着end-device立即就被router leave掉了,请问是什么原因?

后面就出现end-device一直在发送data request,此时end-device功能还都正常,也能发出scene recall,就是一直不停在发data request,不知是哪里问题?

2、还是end-device长时间休眠以后,再次唤醒时,会出现rejoin request的问题,导致第一次的外部按键不能起作用,原因是不是保存在相应router上的end-device age超时了,导致某些信息被清理掉了?请问如何避免,确保end-device长时间休眠以后,第一次外部按键唤醒,也能正常作用。

抓包附件:

network key:

01:02:03:08:09:32:78:86:01:02:03:08:09:32:78:86

TCLK:

5A:69:67:42:65:65:41:6C:6C:69:61:6E:63:65:30:3A

end-device leave.7z

  • 忘记了,当前测试的end-device短地址是0x05DE
  • 能否直接设置为0关闭data request?

    可以直接设置为0关闭data request

    接着end-device立即就被router leave掉了,请问是什么原因?

    應該是child aging把end-device從router leave掉

    一直不停在发data request,不知是哪里问题?

    應該是z-Stack 內部rejoin polling rate或是response polling rate控制不當造成,建議你可以在rejoin成功後,重置polling rate成0

    1. 由于end-device附近有多个router,所以长时间休眠之后,aging超时结果end-device唤醒后发送scene recall的时候,被leave掉了,请问是否有办法避免?
    2. 在rejoin成功之后修改poll rate是不是在ZDApp_ProcessNetworkJoin内部修改?

  • 1. 需要在被age out之前讓device發個信號出來
    2. 建議在ZDO_STATE_CHANGE裡面作
  • 默认是开了child aging的,你可以在 ZGlobals.c中修改
    //=====================================================================

    // Determines if the Child Aging Table Management process is active or not.
    // This feature is optional and it is disabled by default.
    //
    // NOTICE: Before enabling Child Aging make sure to review all the related
    // definitions in this file, especially zgNwkParentInformation.
    uint8 zgChildAgingEnable = TRUE;

    改为zgChildAgingEnable = FALSE;

    如果你要保留child aging功能请在
    //========== Child Aging END DEVICE configuration ===============
    // Values used by End Device when sending End Device Timeout Request
    uint8 zgEndDeviceTimeoutValue = END_DEV_TIMEOUT_VALUE;
    uint8 zgEndDeviceConfiguration = END_DEV_CONFIGURATION;
    请在TIME OUT 发送data request
  • 就是说,如果我保留child aging功能。

    协议栈默认的END_DEV_TIMEOUT_VALUE值是8,对应是256分钟超时,这个值end-device在调用ZDApp_AnnounceNewAddress的时候,通过NLME_SendEndDevTimeoutReq发送给了router/coordinator,就是说router/coordinator知道了我当前的end-device超时时间是256分钟,只要我在256分钟以内发送data request(修改poll rate小于256分钟),就不会被清理掉了,对不对?
  • YK:
    经过一段时间的测试,现在基本可以确定,是最新协议栈Z-Stack plugin 2.2的bug,长时间休眠之后,CC2652R就会出现一直在发送data request的问题。

    初步判断是poll rate切换到rejoin之后,就没切换回来,所以一直是rejoin的poll rate。
  • Hello, Hold

    你大概看一下是不是440这个值?
  • 对的,我ubiqua2.1抓包,看到0x6749 end-device发出的data request 的Timestamp间隔,基本上就在0.5s之间,我看了一下代码,好像也就是rejoin的poll rate和这个比较接近

    我之前都是拔掉end-device的电池,重新上电,这样就会rejoin,之后就不会再一直发data request了,好像应该就是软件的问题。

    然后我又做了个实验,把一直发送data request的end-device的位置挪到了其他router周围,这两个router不在同一区域,信号不会叠加,这样我再按按键发送scene recall,然后就重新rejoin入网了,结果没拔掉电池重新上电,也不发送data request了,很是奇怪。

  • 基本可以确定问题是这样的,出现一直发送data request的bug,但是scene recall控制通讯都还正常,没有问题,就是一直发送data request导致end-device无法完全休眠,很是浪费电池。

    如果重新rejoin进入网络,就不会再一直发送data request了。
  • 你把我这个补丁打上去看看,给我一个反馈:

    在你的ZD_App.c中把下面程序改了:

       if ( ( (ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE) == 0 )
                || ( (ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE)
                  && (zgChildAgingEnable == TRUE) ) )
            {
              if(devStartMode == MODE_REJOIN)
              {
                NLME_SetPollRate( zgRejoinPollRate );
              }
              else
              {
                NLME_SetPollRate( ZDApp_SavedPollRate );
              }

    替换为:

       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,我先按照你的建议修改,
    我需要一段时间的测试。
  • Hello All,

    Now I update fix this issue.

    ZED poll rate set incorrectly if reset from a leave request with rejoin enabled

    Issue description:
    ZED will poll using REJOIN_POLL_RATE instead of POLL_RATE after being reset due to a parent leave request where the rejoin option was set.

    Proposed fix:
    In ZDApp_ProcessNetworkJoin of ZDApp.c, remove NLME_SetPollRate( zgRejoinPollRate ); from if (nwkStatus == ZSuccess) and place in the else statement instead. One must also set the zgRejoinPollRate when device state is DEV_END_DEVICE_UNAUTH

    if ( ZG_SECURE_ENABLED && ( ZDApp_RestoreNwkKey( TRUE ) == false ) )
    {
      if ( ZSTACK_END_DEVICE_BUILD )
      {
         NLME_SetPollRate( zgRejoinPollRate );
      }
      // wait for auth from trust center
      ZDApp_ChangeState( DEV_END_DEVICE_UNAUTH );

x 出现错误。请重试或与管理员联系。