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 ); 
x 出现错误。请重试或与管理员联系。