XBee在小规模的ZigBee网络中,任意两点间的数据传输很快,用户几乎没有感觉数据传输有“寻址”的过程。这实际上是得益于XBee模块中的路由表。任意节点向目标节点发送数据,并不需要每次都寻址,而是会通过之前通讯记录下来的路由表,先将数据发给通往目标接点的“下一跳”,直到最终到达目标节点。由于XBee可以存储80个路由表,因此也就意味着80个以内的节点的网络,可以实现任意两点间的快速通讯。

这路由表是怎么建立的呢?在网络刚刚形成时,任意的两点并不知道之间如何传输数据。ZigBee网络内的数据传输,有一个最佳路由的发现过程,这是基于 Ad-hoc On demand Distance Vector (AODV) 路由协议。通过AODV,节点将记录下了它到目标地址所需的“下一跳”节点,存储在路由表中。一旦这个表建立了,下次通讯时,节点首先会利用该路由表来传输数据,只有当信息发不通时,它才会再次尝试AODV寻址,从而更新路由表,这也就是ZigBee网络可以自主路由和mesh网络能自愈的原因。

AODV的实现过程可以参考这个视频: 在一个大型的ZigBee网络中,由于节点的数量超过了XBee路由表的承载限制,有一部分节点需要AODV寻址才能发送成功,因此网络中会充斥着大量的AODV寻址包,不仅效率降低,而且收发的实时性也大大受到影响。这时就需要采用Source Routing的方式来传输数据。有了Source Routing,采用ZigBee组建大型的网络才变得可行和高效。

简单地说,Source Routing就是允许中心节点通过应用程序存储远路由表并用指定路由发送信息的数据传输方式。在学习Source Routing之前,我们还需要简单地了解一下Many To One的传输方式。

  • Many To One传输方式

在一个大型的网络,有时只需周边节点向中心节点发送数据,因为并不需要任意节点间的通读,各节点大多只需存储向中心点发送数据的“下一跳”,因此虽然节点的数据大大超过了XBee路由表,但由于目标节点只有一个,并不需要AODV寻址。通常中心节点只需定期广播一个数据包,以便新加入的或有需要的周边节点来自动更新路由表。中心点可用AR参数设置定期广播的时间,通常这个值用不着太短,30分钟左右即可,当网关设置了AR后,远端节点收到过MTO路由广播包后,在发送数据前,会自动发送0xA1 (Route Record Indicator)帧,在Source Routing中,网关可以利用它来创建0x21帧,以便XBee模块能将它添加到Source Routing Table中。

  • Source Routing

当中心节点除了接收数据外,还需要能向所有的目标节点发送数据时,就需要采用Source Routing的传输方式了。要实施Source Routing,主要是实现以下几点:

- 中心节点需定期发送Many to One广播(AR<0xFF)
- 远端节点收到过MTO的广播包,在发送数据前会向中心节点发一个0xA1路由记录帧
- 当路由记录帧穿过Many to One路由时,每个节点会添加自己的16位短地址到路由记录帧中
- 当路由记录帧到达目标节点时,它带有发送节点的Mac地址和所有途经跳点的16位地址
- 中心节点程序可以在程序中存储或更新路由记录帧,以便后续使用,在XBee内部有先进先出的Source Routing table,在向远端节点发送数据前,可先发一个0x21帧,以便确保XBee能用Source Routing方式发送数据。

使用Source Routing

  • 网关或中心节点必须用API模式
  • 网关或中心节点必须发周期的Many to one广播包(AR!=0xFF)
  • 网关或中心节点的CPU程序需存储或更新收到的远端节点的路由记录表0xA1帧
    • 远端节点向中心节点发起一次数据传输即可形成路由记录帧,从中心节点发起下面这些命令(ND,DN),也可得到路由记录帧。
    • 发送Source Routing数据包,可先发一个0x21帧,然后同一目标多发;如果不同目标地址,每次需先发个0x21帧再发数据帧。