Other Parts Discussed in Thread: CC2530
终端设备和路由器加入协调器网络之后,
1.如果协调器断电了,终端节点会加入路由器,如果协调器又上电了,发现协调器无法控制终端了?为什么?因为PANID和协调器不一样了吗?
2.如果把终端节点设置为只加入协调器(永远不加入路由器),那协调器断电再上电,终端节点能不能加入协调器?
3.如何把终端设备设置为只加入协调器,即使有路由也不加入路由器,协调器断电时一直再尝试加入协调器?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Other Parts Discussed in Thread: CC2530
终端设备和路由器加入协调器网络之后,
1.如果协调器断电了,终端节点会加入路由器,如果协调器又上电了,发现协调器无法控制终端了?为什么?因为PANID和协调器不一样了吗?
2.如果把终端节点设置为只加入协调器(永远不加入路由器),那协调器断电再上电,终端节点能不能加入协调器?
3.如何把终端设备设置为只加入协调器,即使有路由也不加入路由器,协调器断电时一直再尝试加入协调器?
NLME_GetCoordShortAddr 确实是获取父节点的地址,
你的coordinator 是0x0000 ,coordinator 掉线后,end device 会连入路由。这是你无法选择,当你一个设备入网时会选择一个信号质量最好的入网,这是你无法改变的,你直接尝试做些逻辑看看能不能实现。
改动后的函数如下,是否正确?
void ZDO_beaconNotifyIndCB( NLME_beaconInd_t *pBeacon )
{
// Pass the beacon Indication to another task if it registers the callback
// Otherwise, process the beacon notification here.
if (zdoCBFunc[ZDO_BEACON_NOTIFY_IND_CBID] != NULL )
{
zdoCBFunc[ZDO_BEACON_NOTIFY_IND_CBID]( (void*)pBeacon );
}
else
{
networkDesc_t *pNwkDesc;
networkDesc_t *pLastNwkDesc;
uint8 found = false;
// Add the network to the Network Descriptor List
pNwkDesc = NwkDescList;
pLastNwkDesc = NwkDescList;
while (pNwkDesc)
{
if ((pNwkDesc->panId == pBeacon->panID) &&
(pNwkDesc->logicalChannel == pBeacon->logicalChannel))
{
found = true;
break;
}
pLastNwkDesc = pNwkDesc;
pNwkDesc = pNwkDesc->nextDesc;
}
// If no existing descriptor found, make a new one and add to the list
if (found == false)
{
pNwkDesc = osal_mem_alloc( sizeof(networkDesc_t) );
if ( !pNwkDesc )
{
// Memory alloc failed, discard this beacon
return;
}
// Clear the network descriptor
osal_memset( pNwkDesc, 0, sizeof(networkDesc_t) );
// Initialize the descriptor
pNwkDesc->chosenRouter = 0;//默认INVALID_NODE_ADDR;
pNwkDesc->chosenRouterDepth = 0;//默认0xFF;
// Save new entry into the descriptor list
if ( !NwkDescList )
{
NwkDescList = pNwkDesc;
}
else
{
pLastNwkDesc->nextDesc = pNwkDesc;
}
}
// Update the descriptor with the incoming beacon
pNwkDesc->stackProfile = pBeacon->stackProfile;
pNwkDesc->version = pBeacon->protocolVersion;
pNwkDesc->logicalChannel = pBeacon->logicalChannel;
pNwkDesc->panId = pBeacon->panID;
pNwkDesc->updateId = pBeacon->updateID;
// Save the extended PAN ID from the beacon payload only if 1.1 version network
if ( pBeacon->protocolVersion != ZB_PROT_V1_0 )
{
osal_cpyExtAddr( pNwkDesc->extendedPANID, pBeacon->extendedPanID );
}
else
{
osal_memset( pNwkDesc->extendedPANID, 0xFF, Z_EXTADDR_LEN );
}
// check if this device is a better choice to join...
// ...dont bother checking assocPermit flag is doing a rejoin
if ( ( pBeacon->LQI > gMIN_TREE_LQI ) &&
( ( pBeacon->permitJoining == TRUE ) || ( _tmpRejoinState ) ) )
{
uint8 selected = FALSE;
uint8 capacity = FALSE;
#if defined ( ZIGBEEPRO )
if ( ((pBeacon->LQI > pNwkDesc->chosenRouterLinkQuality) &&
(pBeacon->depth < MAX_NODE_DEPTH)) ||
((pBeacon->LQI == pNwkDesc->chosenRouterLinkQuality) &&
(pBeacon->depth < pNwkDesc->chosenRouterDepth)) )
{
selected = TRUE;
}
#else
if ( pBeacon->depth < pNwkDesc->chosenRouterDepth )
{
selected = TRUE;
}
#endif
if ( ZSTACK_ROUTER_BUILD )
{
capacity = pBeacon->routerCapacity;
}
else if ( ZSTACK_END_DEVICE_BUILD )
{
capacity = pBeacon->deviceCapacity;
}
//if ( ( (capacity) || ( pBeacon->sourceAddr == _NIB.nwkCoordAddress ) ) && (selected) )
if ( ( (capacity) || ( pBeacon->sourceAddr == 0x0000) ) && (selected) )
{
// this is the new chosen router for joining...
pNwkDesc->chosenRouter = pBeacon->sourceAddr;
pNwkDesc->chosenRouterLinkQuality = pBeacon->LQI;//这里要改?
pNwkDesc->chosenRouterDepth = 0;//默认pBeacon->depth;
}
if ( pBeacon->deviceCapacity )
pNwkDesc->deviceCapacity = 1;
if ( pBeacon->routerCapacity )
pNwkDesc->routerCapacity = 1;
}
}
}
另外,
1.该函数的下面是否要修改?
// Initialize the descriptor
pNwkDesc->chosenRouter = 0;//默认INVALID_NODE_ADDR;
pNwkDesc->chosenRouterDepth = 0;//默认0xFF;
2.LQI需要修改吗?Depth改为0是否可以?
pNwkDesc->chosenRouter = pBeacon->sourceAddr;
pNwkDesc->chosenRouterLinkQuality = pBeacon->LQI;//这里要改?
pNwkDesc->chosenRouterDepth = 0;//默认pBeacon->depth;
2.做了上述修改后,终端在协调器断电后不会加入路由,再协调器再次上电后会加入协调器,是否可以实现?