请查看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