ZDO_NetworkDiscoveryConfirmCB

调用NLME_NetworkDiscoveryRequest()时,会执行ZDO_NetworkDiscoveryConfirmCB()这个函数,这个函数比较复杂,我也有很多东西没有弄懂,先做一个记录,以后再慢慢着磨,慢慢加深理解。

 

#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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值