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.

[参考译文] CC2652P:SDK6.30 &amp 中存在一些路由器和#39;非静默重新加入的问题;SDK6.40

Guru**** 2460850 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/1226208/cc2652p-there-are-some-issues-of-router-s-non-silent-rejoin-in-sdk6-30-sdk6-40

器件型号:CC2652P

1,当路由器执行非-Silent-REGION 时,REGUN-TIMEOUT 为0(Nwk_REGUING_TIMEOUT_EVT),这将在"ZDO_JoinConfirmCB"中出现 failed-REGIN。

 可以像这样修复它  

FIX ZD8p_RestoreNetworkState、为路由器重新加入设置有效超时。

uint8_t ZDApp_RestoreNetworkState( void )
{
  ...
      else if( ZG_DEVICE_RTRONLY_TYPE &&
               (zgRouterSilentRejoin == FALSE) )
      {
        devStartMode = MODE_REJOIN;
        _NIB.nwkState = NWK_INIT;
        // set rejoin-timeout to be valid, fixed by luoyiming 2023-05-13
        if(nwk_pollRateTable.PollRateRejoin == 0)
        {
          nwk_pollRateTable.PollRateRejoin = REJOIN_POLL_RATE;
        }
      }
  ...
}

修复了 ZDO_JoinConfirmCB、停止 路由器的 NWK_REGUING_TIMEOUT_EVT 计时器。

void ZDO_JoinConfirmCB( uint16_t PanId, ZStatus_t Status )
{
  (void)PanId;  // remove if this parameter is used.

  nwkStatus = (byte)Status;

  if ( Status == ZSUCCESS )
  {
    if ( ZSTACK_END_DEVICE_BUILD
      || (ZSTACK_ROUTER_BUILD && BUILD_FLEXABLE && ((_NIB.CapabilityFlags & ZMAC_ASSOC_CAPINFO_FFD_TYPE) == 0)))
    {
      neighborEntry_t *pItem;

      // We don't need the neighbor table entries.
      // Clear the neighbor Table to remove beacon information
      nwkNeighborInitTable();

      // Force a neighbor table entry for the parent
      pItem = nwkNeighborFindEmptySlot();
      if ( pItem != NULL )
      {
        memset( pItem, 0x00, sizeof ( neighborEntry_t  )  );
        pItem->neighborAddress = _NIB.nwkCoordAddress;
        osal_cpyExtAddr( pItem ->neighborExtAddr, _NIB. nwkCoordExtAddress );
        pItem->panId = _NIB. nwkPanId;
        pItem->linkInfo.rxLqi = DEF_LQI;
        pItem->linkInfo.txCounter = DEF_LINK_COUNTER;
        pItem->linkInfo.txCost = DEF_LINK_COST;
      }
    }

    // Stop NWK auto poll for Router, fixed by luoyiming 2023-05-13
    if( ZG_DEVICE_RTRONLY_TYPE )
    {
      OsalPortTimers_stopTimer(NWK_TaskID, NWK_AUTO_POLL_EVT);
    }

    if ( devState == DEV_HOLD )
    {
      ZDApp_ChangeState( DEV_NWK_JOINING );
    }
  }

  // Pass the join confirm to higher layer if callback registered
  if (zdoCBFunc[ZDO_JOIN_CNF_CBID] != NULL )
  {
    zdoJoinCnf_t joinCnf;

    joinCnf.status = Status;
    joinCnf.deviceAddr = _NIB.nwkDevAddress;
    joinCnf.parentAddr = _NIB.nwkCoordAddress;

    zdoCBFunc[ZDO_JOIN_CNF_CBID]( (void*)&joinCnf );
  }

  // Notify ZDApp
  ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_IND, sizeof(OsalPort_EventHdr), (byte*)NULL );

}

2、如果路由器操作不安全的重新加入、它将再次请求 APS-LINK 密钥、可以这样进行修复

  if ( events & ZDO_DEVICE_AUTH )
  {
    ZDApp_StoreNwkSecMaterial();
    
    ZDApp_DeviceAuthEvt();

    // Don't exchange key for unsecured-rejoin, fixed by luoyiming 2023-05-13
    if(!bdb_isDeviceNonFactoryNew())
    {
      bdb_setNodeIsOnANetwork(TRUE);
      
      bdb_reportCommissioningState(BDB_COMMISSIONING_STATE_JOINING, TRUE);
    }

    // Return unprocessed events
    return (events ^ ZDO_DEVICE_AUTH);
  }

3、当路由器执行非静默重新加入时、如果路由器无法发现其网络的任何父网络,它将离开当前网络。 可以像这样修复它

    case ZDO_NWK_DISC_CNF:
      if (devState != DEV_NWK_DISC)
      {
        break;
      }
      if ( ZG_BUILD_JOINING_TYPE && ZG_DEVICE_JOINING_TYPE )
      {
        //Rejoin or resume
        if(bdb_isDeviceNonFactoryNew())
        {
          if(bdb_rejoinNwk() == ZSuccess)
          {
            return;
          }
          else
          {
            if(ZG_DEVICE_ENDDEVICE_TYPE)
            {
              bdb_parentLost();
            }
            //Router change to orphan state when discover failed, fixed by luoyiming 2023-05-13
            else if(ZG_DEVICE_RTRONLY_TYPE)
            {
              ZDApp_ChangeState( DEV_NWK_ORPHAN );
            }
          }
          return;
        }

        if(nwk_getNwkDescList())
        {
          bdb_nwkDiscoveryAttempt(TRUE);
        }
        else
        {
          bdb_nwkDiscoveryAttempt(FALSE);
        }
      }
    break;

void ZDApp_ProcessNetworkJoin( void )
{
  if ( (devState == DEV_NWK_JOINING) ||
      ((devState == DEV_NWK_ORPHAN)  &&
       (ZDO_Config_Node_Descriptor.LogicalType == NODETYPE_ROUTER)) )
  {
    ...
  }
  else if ( devState == DEV_NWK_ORPHAN ||
            devState == DEV_NWK_SEC_REJOIN_CURR_CHANNEL ||
            devState == DEV_NWK_TC_REJOIN_CURR_CHANNEL ||
            devState == DEV_NWK_TC_REJOIN_ALL_CHANNEL ||
            devState == DEV_NWK_SEC_REJOIN_ALL_CHANNEL )
  {
    // results of an orphaning attempt by this device
    if (nwkStatus == ZSuccess)
    {
       .......
    }
    else
    {
      .........

      //Router change to orphan state when rejoin failed, fixed by luoyiming 2023-05-13
      if(ZG_DEVICE_RTRONLY_TYPE)
      {
        ZDApp_ChangeState( DEV_NWK_ORPHAN );
      }
    }
  }
  else if ( devState != DEV_HOLD )
  {

  }
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Aries:

    1.感谢您的报告,我意识到这是一个错误,并已提交了一个请求单软件开发团队。
    2.当前应用程序假定正在进行信任中心(TC)/不安全重新加入,因为 NWK 密钥不可用或不正确,因此请求新的 APS 链接密钥。
    3.如果路由器找不到要重新加入的原始网络,现有操作将重新启动加入过程,类似于合理的 ZED 丢失网络行为。

    2和3是自定义应用决策。

    此致。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    路由器的重新加入应与终端设备的重新加入相同。 加入网络时、路由器必须记住 Trust-Center 的 Ext-PANID 和 APS-Key。 当对 Trust-Center 的 NWK-Key、PANID、逻辑通道进行更改时、路由器应进行安全-重新加入或非安全-重新加入、以查找新的 NWK-KEY、新的 PANID 和信任中心的新逻辑通道。