zigbee的最大特点在于自组网,而这个自组网的功能实现主要依靠路由的转发功能,路由转发的其中一个条件是当设备离协调器太远的时候,这个设备会通过一个中间路由进行转发,网络中有多个路由的情况下,会选择一个离协调器最短的路径。
最近在做一个项目,设备运行环境容易受到障碍物屏蔽信号,为了解决这个问题,我采取了两个措施:1.给zigbee加PA芯片,增强zigbee的发送和接收的信号。2.利用zigbee路由转发数据,达到绕开障碍物的目的。第一种措施没问题,第二种措施我有点困惑,通过路由转发是没问题,问题在于这样做的话,协调器能否知道最初的源地址是哪个吗?我程序里面一律通过设备的短地址来区分哪个设备的,如果短地址经过路由转发了会更改的话,协调器不是不知道谁是"数据发起人"了。
带着上面的疑问,我决定做一个实验去验证路由器是否会改变短地址。实验采用一个路由器,一个终端,和一个协调器,协调器和stm32单片机连接。我用Packet Sniffer工具抓取zigbee的通讯数据帧,如下图所示:
由图可知网络中有两个设备短地址分别为0x9758和0x41BD,0x9758是终端(数据发起人),0x41BD是路由中继器,数据的流向是:0x9758 --> 0x41BD --> 0x0000, 从抓获的数据帧来看和协调器0x0000最近的设备是0x41BD,最终是路由0x41BD发送数据给协调器0x0000的,那么协调器会不会认为路由0x41BD是数据发起人呢?答案是不会的,我把数据通过协调器发送给stm32,数据里面的设备地址有0x9758和0x41BD,说明协调器是收到两个设备的短地址,路由转发没有替换设备的短地址的,只是起一个“透传”的作用。最后一个疑问,协调器是怎么知道数据是哪个设备是“数据发起人”?再深入分析上面的数据帧,发现有个“NWK Src. Address”这个短地址并没有随着路由的转发而改变,由此可以追踪到最初发数据的那个设备是0x9758。至此,问题解决了。我们是可以通过设备的短地址作为设备的标识,而不用管路由转发的问题。