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.

解决打开NWK_MANAGER后协调器PANID会变的问题

Other Parts Discussed in Thread: Z-STACK

解决原理,NWK MANAGER检测PANID冲突的原理是扫描beacon,router随时随地都能收到beacon,然后根据beacon判断有没有PANID冲突,ShortAddress冲突。

但是beacon帧没有加密,判断该帧的正确性只能依赖CRC,CRC误检的概率不如AES高,因此网内节点多了,总有router会存在误检。

消除误检的办法就是一个router检测到PANID冲突不算冲突,在同一分钟内多个Router都检测到了才算冲突。

修改方案如下:

#if defined ( NWK_MANAGER )
uint8_t ZDNwkMgr_PanIdConflictCounter = 0; //add by luoyiming, 2019-08-20
#endif // NWK_MANAGER


uint32_t ZDNwkMgr_event_loop( byte task_id, uint32_t events )
{



  ...


  //clear network-report command counter after 1-minute, add by luoyiming 2019-08-20
  if ( events & ZDNWKMGR_PANID_CONFLICT_EVT )
  {
#if defined ( NWK_MANAGER )
    ZDNwkMgr_PanIdConflictCounter = 0;
#endif
    return ( events ^ ZDNWKMGR_PANID_CONFLICT_EVT );
  }

  ...
}


void ZDNwkMgr_ProcessNetworkReport( ZDNwkMgr_NetworkReport_t *pNetworkReport )
{
  ...
  
  if ( pNetworkReport->reportType == NWKREPORT_PANID_CONFLICT )
  {
    ...
    //Filter the false network-report command, add by luoyiming 2019-08-20
    ZDNwkMgr_PanIdConflictCounter ++;
    if ( !OsalPortTimers_getTimerTimeout( ZDNwkMgr_TaskID, ZDNWKMGR_PANID_CONFLICT_EVT ) )
    {
      OsalPortTimers_startTimer( ZDNwkMgr_TaskID, ZDNWKMGR_PANID_CONFLICT_EVT, ONE_MINUTE );
    }
    if( ZDNwkMgr_PanIdConflictCounter < ZDNWKMGR_PANID_CONFLICT_THRESHOLD )
    {
      return;
    }
    
    .....

  }
}