微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > z-stack 3.0.0和z-stack 3.0.1的End Device的bdb模式存在bug

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

时间:10-02 整理:3721RD 点击:

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一下。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top