TI中文支持网
TI专业的中文技术问题搜集分享网站

修改一下status change,可以检测入网失败。

在ZDApp.c中,新创建一个函数

/*********************************************************************
 * @fnZDApp_CountinueJoin()
 *
 * @briefcountinue join after a fail-joining
 *
 * @paramnone
 *
 * @returnnone
 */
void ZDApp_CountinueJoin(void)
{devState = DEV_INIT;osal_set_event( ZDAppTaskID, ZDO_STATE_CHANGE_EVT );if(continueJoining){ZDApp_NetworkInit( (uint16)(NWK_START_DELAY+ ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))));}
}

全局搜索有ZDApp_NetworkInit( (uint16)(NWK_START_DELAY+ ((uint16)(osal_rand()& EXTENDED_JOINING_RANDOM_MASK))))的调用,并替换为该函数。

在原先有if(countinueJoining)的地方,连同if(countinueJoining)全部替换为

if((zdoDiscCounter > NUM_DISC_ATTEMPTS) && (NULL == pChosenNwk)){
#ifdef BLACK_LIST// Reset the black list as this when no wpan can be foundzgBlackListInit( TRUE );
#endifzdoDiscCounter = 0;ZDApp_CountinueJoin();}else{zdoDiscCounter++;
#if defined ( MANAGED_SCAN )ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS );
#elseZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY+ ((uint16)(osal_rand()& BEACON_REQ_DELAY_MASK))) );
#endif}

这样,就可以在status change中判断节点是否掉线,是否不能入网。只要检测到DEV_INIT,就说明上次入网失败。TI原版协议栈是基于每次入网必成功的思路,无法检测到入网失败的情况。配合黑名单使用,可以把入网失败的PANID加入黑名单中。

Viki Shi:

感谢分享:)

Aries Lord:

回复 Viki Shi:

state change这个事件,是一个状态机事件,当前状态还要结合上一次状态,才能判断节点是否处于掉线,或者入网未成功。

赞(0)
未经允许不得转载:TI中文支持网 » 修改一下status change,可以检测入网失败。
分享到: 更多 (0)