关于 NLME_LeaveReq()和AssocRemove()使用问题
我想实现当路由器或终端掉电或丢失的时候,协调器强制路由器、终端离开网络同时清除其AssociatedDevList[]。当重新上电的时候,路由器、终端设备重新加入到协调器中。预编译NV_RESTORE。
做了如下实验:当关掉终端设备、路由器一段时间后,通过调试发现协调器成功清除离线路由器、终端的AssociatedDevList[]。之后给终端设备上电,终端设备能重新加入了协调器,在AssociatedDevList[]可以找到其信息;但是给路由器重新上电,路由器却没有能重新加入到协调器中,在AssociatedDevList[]找不到其信息。不知道问题在哪里,为何同样的程序终端设备和路由器却有不同的结果!
请教TI员工了!
程序如下:
AddrMgrEntry_t addrEntry;
NLME_LeaveReq_t req;
addrEntry.user = ADDRMGR_USER_DEFAULT;
addrEntry.index = index;
if (AddrMgrEntryGet( &addrEntry ))
{
req.extAddr = addrEntry.extAddr;
//osal_memcpy(req.extAddr, addrEntry.extAddr, 8);
req.removeChildren = TRUE; //-true 子设备也脱离,false只脱离当前设备
req.rejoin = TRUE; //允许设备重新加入网络,false 不允许设备重新加入网络
req.silent = FALSE;
NLME_LeaveReq( &req );
AssocRemove(addrEntry.extAddr);
ZDApp_NVUpdate();
}
路由一旦加入网络以后,保存了网络信息。
之后重新上电也不会有加网的过程,这个是跟end device有区别的。
谢谢你的回复!让路由器重新加入到协调器中或者说将信息添加到AssociatedDevList[],是否有办法呢?
让其重新加网好了,不使用保存的参数加网
谢谢你的回复。如果不预编译NV_RESTORE,路由器重新上电后,就有可能添加到其它网络中,这又不是我想需要的了。
理解你的需求。
你可以使能NV功能,然后通过下面方式让节点重新加网。
// Set the NV startup option to force a "new" join.
zgWriteStartupOptions( ZG_STARTUP_SET, ZCD_STARTOPT_DEFAULT_NETWORK_STATE );
// The device has been in the UNAUTH state, so reset
// Note: there will be no return from this call
SystemResetSoft();
如果你为了让节点重新加入到原先的网络,你可以在节点入网选择的时候,选择你记忆的那个网络就可以了
void ZDApp_ProcessOSALMsg( osal_event_hdr_t *msgPtr
if ( ( (pChosenNwk = ZDApp_NwkDescListProcessing()) != NULL ) && (zdoDiscCounter > NUM_DISC_ATTEMPTS) )
这里会挑选扫描到的网络。