解决原理,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-20if ( events & ZDNWKMGR_PANID_CONFLICT_EVT ){ #if defined ( NWK_MANAGER )ZDNwkMgr_PanIdConflictCounter = 0; #endifreturn ( 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-20ZDNwkMgr_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;}.....} }
Viki Shi:
感谢提供反馈,在英文E2E那边也建议发一下,可能会收录进known issues
Aries Lord:
回复 Viki Shi:
这个问题是在Home 1.2.2就遇到过,参考了silabs的解决办法,适用于Z-stack 3.6.0以前所有版本。
gaoyang9992006:
这个方法非常棒,多谢分享。