Zigbee疑难问题定位以及思路方法分享 (四)

        接着上回继续分析公司遗留的问题四,问题四的需求就是,假如其中一个网关坏了,拿了一个新的网关,能够替换接管旧网关下面的所有设备,由于搞ZigBee也有两个月了,802.15协议以及ZigBee协议也蛮熟悉了,抓包也抓过了,对ZigBee通讯多少有些了解。

        实现该问题思路有几点:1、理论上,入网成功后,设备通讯都是短地址,网关时0x0000,数据包里面有panID,推测不同的网络是通过panID来区分的;2、读取device以及协调器内FLASH的NV数据,发现都记录对方的MAC地址,依次类推,如果换网关,用相同的PANID和信道,即使能通讯上,但是如果一旦掉线,或者重启,发送NLME_OrphanJoinRequest包,新网关也不会接管剩下的设备。

        首先试了一下方法1,果然旧网关把PANID与信道导出后,导入到新网关,旧网关下面的设备都上报到新网关上,但是有一点,新网关没有分配旧的网络地址,因此不能查到设备的MAC地址,无法向服务器上报数据(上报数据是用MAC地址来区分不同的设备,因为网络地址会变,MAC地址不会变)。但是可以记住该网络地址,下发给设备信息,这样就很好的传送数据。

        试了一下方法2,果然只有双发都存有对方的MAC地址后,在设备端发送NLME_OrphanJoinRequest,网关才能接管,设备也才同意被接管。

        根据以上两点,有了一些思路,修改地方如下

        1、更换网关后,导入旧网关的信道和panId,赋值给_NIB.nwkPanId与_NIB.nwkLogicalChannel,并执行NLME_UpdateNV刷新网络。

        2、网关端每次收到设备上报的数据,需要通过AddrMgrExtAddrLookup查找该设备网络地址对应的MAC地址,如果查不到,下发给设备端命令,让其走Rejoin的路线(根据上一节,Rejoin步骤已经修改NLME_ReJoinRequest为ZDO_MultipleJoinReq,即重新beacon,然后associate加入之前加入过的网络,判断之前加入的网络是通过panID实现的,因为新旧网络panID一样,因此通过一系列操作,加入成功),从而实现自动绑定到新网关上,从而实现替换,但是有个前提,不能让旧网关与新网关都在一个环境下,如果在一个环境下,需要把新网关重新初始化网络或者更换panID,来实现干扰,802.15协议也是通过panID来区分不同的局域网。

        实验之后,效果很好。

猜你喜欢

转载自blog.csdn.net/moonlinux20704/article/details/95647480