#define STACK_PROFILE_MAX 2
ZStatus_t ZDO_NetworkDiscoveryConfirmCB( byte ResultCount,
networkDesc_t *NetworkList )
{
networkDesc_t *pNwkDesc;
ZDO_NetworkDiscoveryCfm_t msg;
byte i;
uint8 stackProfile;
uint8 stackProfilePro;
uint8 selected;
#if defined ( ZDO_MGMT_NWKDISC_RESPONSE )
//目标设备网络扫描响应
if ( zdappMgmtNwkDiscReqInProgress )
{
zdappMgmtNwkDiscReqInProgress = false;
ZDO_FinishProcessingMgmtNwkDiscReq( ResultCount, NetworkList );
return ( ZSuccess );
}
#endif
// process discovery results
stackProfilePro = FALSE;
selected = FALSE;
for ( stackProfile = 0; stackProfile < STACK_PROFILE_MAX; stackProfile++ ) //用来循环不同的协议版本,还有很多地方不明白
{
pNwkDesc = NetworkList; /*所发现的网络不论属于那个协议栈,都是加在同一个链表里NetworkList,故针对新一个协议版本,都得重新开查找所有网络*/
for ( i = 0; i < ResultCount; i++, pNwkDesc = pNwkDesc->nextDesc )
{
if ( zgConfigPANID != 0xFFFF ) {
/*uint8 zgConfigPANID = ZDAPP_CONFIG_PAN_ID; 在f8wConfig.cfg里面有ZDAPP_CONFIG_PAN_ID配置,一般为0XFFFF
如果 ZDAPP_CONFIG_PAN_ID被定义为0xFFFF,那么协调器将根据自身的IEEE地址建立一个随机的PAN ID,如果ZDAPP_CONFIG_PAN_ID 没有被定义为0xFFFF,那么协调器建立网络的PAN ID将由ZDAPP_CONFIG_PAN_ID指定,本IF分支的功能是:检查内层循环本次循环所指网络的PAN ID与配置文件指定所需要的PAN ID是否匹配,不如不匹配后面的事件都不用做了。注意PAIN ID只用了低14位*/
if ( pNwkDesc->panId != ( zgConfigPANID & 0x3FFF ) )
continue;
}
if ( nwk_ExtPANIDValid( ZDO_UseExtendedPANID) == true )
{
// If the extended Pan ID is commissioned to a non zero value
// Only join the Pan that has match EPID
if ( osal_ExtAddrEqual( ZDO_UseExtendedPANID, pNwkDesc->extendedPANID) == false )
continue;
}
if ( ZSTACK_ROUTER_BUILD )
{
/* 本段注释为个人理解,错误之处,请高手指点。 每一个网络的容量是有限制的,pNwkDesc->routerCapacity 指本网络还允许添加多少个路由器,pNwkDesc->deviceCapacity 指本网络还允许添加多个终端设备。 */
if ( stackProfilePro == FALSE )
{
if ( !pNwkDesc->routerCapacity )
continue;
}
else
{
if ( !pNwkDesc->deviceCapacity )
continue;
}
}
else if ( ZSTACK_END_DEVICE_BUILD )
{
if ( !pNwkDesc->deviceCapacity )
continue;
}
// check version of zigbee protocol 检查ZIGBEE协议的版本
if ( pNwkDesc->version != _NIB.nwkProtocolVersion )
continue;
// check version of stack profile
if ( pNwkDesc->stackProfile != zgStackProfile )
{
if ( pNwkDesc->stackProfile == ZIGBEEPRO_PROFILE )
stackProfilePro = TRUE;
if ( stackProfile == 0 )
continue;
}
break;
} //内层循环结束
if (i < ResultCount) //如果在当前协议栈版本号下找到了匹配的网络,则不需要再找下一个版本了
{
selected = TRUE;
break;
}
// break if selected or stack profile pro wasn't found
if ( (selected == TRUE) || (stackProfilePro == FALSE) )
break;
}//外层循环结束
if ( i == ResultCount ) //找不到可以加入的网络
msg.hdr.status = ZDO_FAIL; // couldn't find appropriate PAN to join !
else //已经找到网络
{
/* msg为下面类型
typedef struct
{
osal_event_hdr_t hdr;
uint8 panIdLSB;
uint8 panIdMSB;
uint8 logicalChannel;
uint8 version;
uint8 extendedPANID[Z_EXTADDR_LEN];
} ZDO_NetworkDiscoveryCfm_t;
*/
msg.hdr.status = ZDO_SUCCESS;
msg.panIdLSB = LO_UINT16( pNwkDesc->panId ); //保存网络PAN ID
msg.panIdMSB = HI_UINT16( pNwkDesc->panId );
msg.logicalChannel = pNwkDesc->logicalChannel;
msg.version = pNwkDesc->version; //保存网络版本号
osal_cpyExtAddr( msg.extendedPANID, pNwkDesc->extendedPANID );
}
ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (byte *)&msg );
//发送消息到ZDO层,请到ZDO事件处理函数里查看ZDO_NWK_DISC_CNF这一事件的处理方式。
return (ZSuccess);
} // ZDO_NetworkDiscoveryConfirmCB