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;
}
.....
}
}