调试目标
-
将网关 A 的网络配置同步到网关 B,不修改 OTP Flash MAC 地址的情况下,让网关 B 正常工作,网关 A 和 B 的子设备可以互通
-
软件工程(原厂提供):JN-AN-1216-Zigbee-3-0-IoT-ControlBridge_NETWORK_RECOVERY ;
-
上位机:软件工程中的 ZGUI ;
-
硬件:
-
2 个协调器( 以下简称 CN( Coordinator New ),CO( Coordinator Old ));
-
2 个子设备( Router or End Device ,以下简称 EPA,EPB );
-
测试流程
-
CO 建立网络,EPA 加入 CO ,能够接受发送 ;
-
ZGUI 连接 CO ,点击 Get PDM 控件,开始将 CO 的 PDM 信息拉取到 ZGUI 中保存,等待完成 ;
-
ZGUI 连接 CN ,点击 Restore PDM 控件,开始将 CO 的 PDM 信息恢复到 CN 中,等待完成 ;
-
将 CO 下电,ZGUI 连接 CN,点击 Permit join 控件,操作 EPB 寻找网络 ;
通过抓包,我们发现,CN 能够和 EPB 关联成功,但是无法分发密钥,原因是 Recovery 完成后,没有注册分发密钥的 Callback 函数。
要解决该问题,需要修改 Coordinator 的代码,在 Recovery 完成软复位后,协议栈初始化完成后,调用下面的函数,注册 Trust Center 分发密钥的 Callback 函数。
ZPS_vTCSetCallback(APP_bSendHATransportKey);
-
完成第 4 步后,CN 能够正常分发密钥了,但是 EPB 入网后,会马上 leave ;
通过抓包,我们发现,Transport Key 报文中 Key Descriptor Payload 中的 Source Address 是 CO 的 MAC 地址,这个地址就是 Trust Center Address ;
而在 ZigBee 协议中,分发密钥的必须是 Trust Center,然而这个 Transport Key 报文的源地址是 CN,造成了 TC Address 和密钥分发方不一致,子设备就会认为该次入网不安全,立即发起离网 :
要解决该问题,需要修改 Coordinator 的代码,在 Recovery 完成软复位后,协议栈初始化完成后,调用下面的函数,将 Trust Center 的地址改为本地。
ZPS_eAplAibSetApsTrustCenterAddress ( ZPS_u64NwkNibGetExtAddr ( ZPS_pvAplZdoGetNwkHandle ( ) ) );
-
完成第 5 步后,EPB 已经能正常入网,也能正常控制,但是我们发现,每次 Link Status 更新时,通过 CO 入网的设备都会广播 Network Status,报文中显示:Address Conflict( 地址冲突 ),这是由于 EPA 中保存的 TC Address 还是 CO 导致的。
解决改问题,目前有两个方法:
-
修改 OTP Flash ,将 CN 的 MAC 地址修改为和 CO 一样
-
-
评论