CC2530 rejoin back off (z-stack home 1.22a)

请查看ZDApp.cz中的code

if( events & ZDO_REJOIN_BACKOFF )
  {
    if( devState == DEV_NWK_BACKOFF )
    {
      ZDApp_ChangeState(DEV_NWK_DISC);
      // Restart scan for rejoin
      ZDApp_StartJoiningCycle();
      osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinScan );
    }
    else
    {
      // Rejoin backoff, silent period
      ZDApp_ChangeState(DEV_NWK_BACKOFF);
      ZDApp_StopJoiningCycle();
      osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinBackoff );
    }

    return ( events ^ ZDO_REJOIN_BACKOFF);
  }
void ZDApp_SetRejoinScanDuration( uint32 rejoinScanDuration )
{
  zgDefaultRejoinScan = rejoinScanDuration;
}

/*********************************************************************
 * @fn      ZDApp_SetRejoinBackoffDuration()
 *
 * @brief   Sets rejoin backoff duration for rejoin for an end device
 *
 * @param   rejoinBackoffDuration - milliseconds
 *
 * @return  none
 */
void ZDApp_SetRejoinBackoffDuration( uint32 rejoinBackoffDuration )
{
  zgDefaultRejoinBackoff = rejoinBackoffDuration;
}
分析一下:

ZDApp_SetRejoinBackoffDuration();设置了周期rejoin的时间,在osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinBackoff );中使用,而ZDApp_SetRejoinScanDuration();设置了扫描时间,在 osal_start_timerEx( ZDAppTaskID, ZDO_REJOIN_BACKOFF, zgDefaultRejoinScan );中使用。

下面这两部分则是具体实施的过程:

      // Restart scan for rejoin

     ZDApp_ChangeState(DEV_NWK_DISC);
     ZDApp_StartJoiningCycle();
 

      ZDApp_ChangeState(DEV_NWK_BACKOFF);
      ZDApp_StopJoiningCycle();

如何添加自己的功能:

1.首先设置:

-DREJOIN_BACKOFF=xxxx
/* Rejoin retry backoff scan timer duration in milliseconds - default 15 minutes according to HA test spec */
-DREJOIN_SCAN=xxxx

我们这里设置为 REJOIN_BACKOFF=100

2.接下来控制ZDApp_StartJoiningCycle and ZDApp_StopJoiningCycle

       case DEV_NWK_ORPHAN:
                     if(!Firstjoined)
                     {
                      Rejoin_item = Scan_5min_cycle;
                      osal_start_timerEx( zclEmerButton_TaskID, USER_REJOIN_EVT,300000 );// 5 minu scan time out  300000
                     }
                break;
3.在任务程序控制

 if(events & USER_REJOIN_EVT)
  {      
    switch (Rejoin_item)
    {
      case Warning_checkout:
          if(zclEmerButton_NwkState != DEV_END_DEVICE) // 
          {
             ZDApp_StartJoiningCycle();
          }
        break;
        
      case Scan_5min_cycle:
          if(zclEmerButton_NwkState != DEV_END_DEVICE) // 
          {
            if(OrphanWarning)
            {
              ZDApp_StartJoiningCycle();
            }
            else
            {
              ZDApp_StopJoiningCycle() ;
            }
          }
        break;
        
      default:
        break;       
    }
     return ( events ^ USER_REJOIN_EVT );
  }


如果是用orphan Notification来做keep alive的消息的话,那么周期是按照orphan scan的周期来的,跟poll rate没有关系。

如果使用data request来做keep alive的话,那么就跟poll rate有关系

建议使用data request来做keep alive



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值