Home 1.2.0协议中,父节点删除了子节点的AssocList后,会向子节点发LeaveReq。
时间:10-02
整理:3721RD
点击:
父节点删除子节点后,又收到了子节点的Data request命令包,父节点会根据Data request返回一个LeaveReq命令,这条命令没有目标extAddr。
所以我在函数里面做了一个这样的处理:节点收到没有目标IEEE地址的LeaveInd命令,不采用ASSOC JOIN的方式入网,而是采用Rejoin的方式寻找一个父节点。
void ZDO_LeaveInd( NLME_LeaveInd_t* ind )
{
uint8 leave;
// Parent is requesting the leave - NWK layer filters out illegal
// requests
if ( ind->request == TRUE )
{
if (osal_ExtAddrEqual(ind->extAddr,NLME_GetExtAddr()))
{
// Only respond if we are not rejoining the network
if ( ind->rejoin == FALSE )
{
// Notify network of leave
NLME_LeaveRsp_t rsp;
rsp.rejoin = ind->rejoin;
if ( ZSTACK_ROUTER_BUILD )
{
rsp.removeChildren = ind->removeChildren;
}
else if ( ZSTACK_END_DEVICE_BUILD )
{
rsp.removeChildren = 0;
}
NLME_LeaveRsp( &rsp );
}
if ( ZSTACK_END_DEVICE_BUILD )
{
// Stop polling and get ready to reset
NLME_SetPollRate( 0 );
}
// Prepare to leave with reset
ZDApp_LeaveReset( ind->rejoin );
}
else
{
retryCnt = 0;
devStartMode = MODE_RESUME;
_tmpRejoinState = true;
osal_cpyExtAddr( ZDO_UseExtendedPANID, _NIB.extendedPANID );
zgDefaultStartingScanDuration = BEACON_ORDER_60_MSEC;
ZDApp_NetworkInit( 0 );
}
}
else
{
leave = FALSE;
// Check if this device needs to leave as a child or descendent
if ( ind->srcAddr == NLME_GetCoordShortAddr() )
{
if ( ( ind->removeChildren == TRUE ) ||
( ZDO_Config_Node_Descriptor.LogicalType ==
NODETYPE_DEVICE ) )
{
leave = TRUE;
}
}
else if ( ind->removeChildren == TRUE )
{
// Check NWK address allocation algorithm
//leave = RTG_ANCESTOR(nwkAddr,thisAddr);
}
if ( leave == TRUE )
{
// Prepare to leave with reset
ZDApp_LeaveReset( ind->rejoin );
}
else
{
// Remove device address(optionally descendents) from data
ZDApp_LeaveUpdate( ind->srcAddr,
ind->extAddr,
ind->removeChildren );
}
}
// Pass the leave indication to higher layer if callback registered.
if (zdoCBFunc[ZDO_LEAVE_IND_CBID] != NULL)
{
(void)zdoCBFunc[ZDO_LEAVE_IND_CBID](ind);
}
}
采用join和rejoin对于父设备来说都没问题,不管怎么样,父设备都会去update自己的Association list,而且每次都会当成一个新的设备加入。
对于节点来说就是短地址的问题,如果join的方式新的短地址,rejoin就是原先的地址。
