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.

z-stack 3.0.0和z-stack 3.0.1的End Device的bdb模式存在bug

bug 1.

函数bdb_joinProcess中,NLME_JoinRequest返回SUCCESS时的处理代码

  if(status == ZSuccess)
  {
    // The receiver is on, turn network layer polling off.
    if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE )
    {
      // for an End Device with NO Child Table Management process or for a Router
      if ( ( ZG_DEVICE_RTR_TYPE )  ||
           ( (ZG_DEVICE_ENDDEVICE_TYPE) && ( zgChildAgingEnable == FALSE ) ) )
      {
        NLME_SetPollRate( 0 );
        NLME_SetQueuedPollRate( 0 );
        NLME_SetResponseRate( 0 );
      }
    }
    else
    {
      if ( (ZG_SECURE_ENABLED) && (devStartMode == MODE_JOIN) )
      {
        ZDApp_SavedPollRate = zgPollRate;
        NLME_SetPollRate( zgRejoinPollRate );
      }
    }
  }

挪动至ZDApp.c下的函数ZDO_JoinConfirmCB中,即在该函数的(status==ZSUCCESS)的处理中加入下列处理代码

    if( devState == DEV_NWK_JOINING )
    {
      if ( ZDO_Config_Node_Descriptor.CapabilityFlags & CAPINFO_RCVR_ON_IDLE )
      {
        // for an End Device with NO Child Table Management process or for a Router
        if ( ( ZG_DEVICE_RTR_TYPE )  ||
            ( (ZG_DEVICE_ENDDEVICE_TYPE) && ( zgChildAgingEnable == FALSE ) ) )
        {
          NLME_SetPollRate( 0 );
          NLME_SetQueuedPollRate( 0 );
          NLME_SetResponseRate( 0 );
        }
      }
      else
      {
        if ( (ZG_SECURE_ENABLED) && (devStartMode == MODE_JOIN) )
        {
          ZDApp_SavedPollRate = zgPollRate;
          NLME_SetPollRate( zgRejoinPollRate );
        }
      }
    }

修改原理:EndDevice在Associate的时候,会自带一条Data Request命令来接收Associate Response。EndDevice在调用NLME_JoinRequest函数时会发起Associate Request请求,并在macPib.responseWaitTime(默认值32,时间=32*15.36ms = 491.52ms)后自动产生一个Data Request。如果此时再调用NLME_SetPollRate来设置Data Request,会产生冲突。如果协调器支持白名单验证,在Associate Response时回复拒绝加入命令,End Device会误触发ZDO_SyncIndicationCB函数。

bug2:函数bdb_rejoinNwk不必打开RX。对于EndDevice来说,rejoin命令发出后会自动发出Data Request。以下代码可以屏蔽

    uint8 tmp = true;
    ZMacSetReq( ZMacRxOnIdle, &tmp ); 
  • 不能算是bug,

    1,不会有影响,因为在Associate Request以后的Data Request是直接发送的。

    2,这个时间是非常短的,如果对功耗扣的非常细的话,可以这么优化。

    谢谢!

  • 这个经验不错,MARK一下。

  • 想问一下你上面说的  “如果协调器支持白名单验证,在Associate Response时回复拒绝加入命令”   这个具体怎么理解,我现在用3.0协议栈(2538硬件),更改ZDSECMGR_TC_DEVICE_MAX宏由默认值40调整到100后,入网时ZC回复Associate Response就是拒绝关联,正在查找原因,但是ZC中无法找到处理Associate Response的报文,貌似被封库了,想问下你这个白名单怎么回事,是否和我这个参数有影响

  • ZC內已經有多少個設備連入了?有沒有抓包檔來看一下你的問題?
  • 该值设置为DSECMGR_TC_DEVICE_MAX=40,则网络中可以加到40个,但是DSECMGR_TC_DEVICE_MAX=100,ZC组网后,一个节点也加不进去。

    失败的报文如下:

  • 有沒有抓包檔來看一下你的問題?
  • 您好  附件是抓包报文  用Wireshark抓的,报文的前105条都是ZC设置ZDSECMGR_TC_DEVICE_MAX=80时,一个终端节点申请入网的报文(入网失败),从123条开始是ZC设置ZDSECMGR_TC_DEVICE_MAX=40重新编译下载后,终端节点成功入网的报文。  用的是同一个终端。论坛抓包.rar

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