修改一下status change,可以检测入网失败。
时间:10-02
整理:3721RD
点击:
在ZDApp.c中,新创建一个函数
/*********************************************************************
* @fn ZDApp_CountinueJoin()
*
* @brief countinue join after a fail-joining
*
* @param none
*
* @return none
*/
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 found
zgBlackListInit( TRUE );
#endif
zdoDiscCounter = 0;
ZDApp_CountinueJoin();
}
else
{
zdoDiscCounter++;
#if defined ( MANAGED_SCAN )
ZDApp_NetworkInit( MANAGEDSCAN_DELAY_BETWEEN_SCANS );
#else
ZDApp_NetworkInit( (uint16)(BEACON_REQUEST_DELAY
+ ((uint16)(osal_rand()& BEACON_REQ_DELAY_MASK))) );
#endif
}
这样,就可以在status change中判断节点是否掉线,是否不能入网。只要检测到DEV_INIT,就说明上次入网失败。TI原版协议栈是基于每次入网必成功的思路,无法检测到入网失败的情况。配合黑名单使用,可以把入网失败的PANID加入黑名单中。
感谢分享:)
state change这个事件,是一个状态机事件,当前状态还要结合上一次状态,才能判断节点是否处于掉线,或者入网未成功。
