打通 zigbee 传输速度的任督二脉
2013 年 10 月 14 日
前言:
Zigbee 是一个短距离,低功耗,低速率的通信协议,其优势是拥有强大的组网能力。
了解其特性的人都知道,zigbee 每次发送一包无线数据,其最大应用数据段是非常少,差不
多只有 100 来个字节。并且由于在 zigbee 网络中所有的数据都是经过父节点转发的,从而
导致延迟非常大。
应用现状:
由于其低速率的特性,目前大部分应用都只在开关量的传递这个范畴。如果提升了 zigbee
的传输速度,无疑是能够扩展它的应用范围的。例如可以用在 zigbee 模块对宿主机器远程
代码升级。
Zigbee 低速度的原因:
1、 每个无线数据包只有 100 来个字节,不能通过加大这个大小来提升速度。我尝试过使能
zigbee 的发送大数据包的宏来提升速度,最终结果显示速度并没有提升。
2、 每一包数据都是通过父节点转发,包括回应数据,这样会导致数据的延迟比较大。使用
跳过路由的方式传递是可以不通过父节点转发,但是会出现距离如果太远而对方接收不
到的问题,所以延迟无法避免。
那么如何提升 zigbee 的传输速度呢?
通过下面的几个生活中的例子,相信很快就有答案。
例一:
1
一个水龙头,一个桶,一个人,一个等待接水但是离水龙头很远的大水缸。
现在要将大水缸的水装满,怎么办?
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi
当然是把桶里打满水,然后提到大水缸里面,然后一桶一桶的搬运,直到装满。
对应于我们的 zigbee 现状,和例一非常相近。搬运的工具是一个大小一定的桶,zigbee 中就
是 100 字节的无线数据包。然后就是距离远,导致搬运一桶水需要时间。对应到 zigbee,也
就是传输时间延迟大。经过测试,zigbee 采用这个算法的可靠传输大约在 200~260 字节每秒
之间。
然而 zigbee 就只能采用这种一桶一桶运送,而没有提速空间了吗?当然不是,我们需要利
用好 zigbee 的其他资源,有一个重要的资源就是它的板载内存空间。
请看例二:
一个水龙头,一个挨着水龙头的蓄水池,一个桶,一个人,一个等待接水但是离水龙头很远
的大水缸。
现在要怎么装满水缸呢?
很明显,先打开水龙头,向蓄水池里面放水,然后用桶去提水,搬运到大水缸里。和例一相
比,省下的时间在哪呢?那就是蓄水时间。
在例一中,我们每次搬完水后,都要等水龙头去放满我们的桶,然后才能搬运,而现在不用
了,直接到蓄水池里提水。省掉了部分时间。
对应于 zigbee,蓄水池就是 zigbee 的板载内存,这个内存有大小限制,但是几百个字节肯定
是有的。采用这个方式去传输,速度肯定有很提升。测试算法结果,可靠速度大概在 300~400
字节每秒左右。
然而,即使是这个速度,我相信大家肯定一致认为太慢。以代码升级为例,一个普通的 ARM7
的运行代码,大概在 20KB 左右,预计得一分钟才能升级完成。
那么还有没有提升速度的空间呢,浪费的时间怎么利用?
答案是肯定提升的,既然硬件已经不能改变,性能不能再提升了(100 字节的包大小,板载
2
缓存),那就从算法上下手,把浪费的时间利用上。
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi
请看例三:
一个水龙头,一个挨着水龙头的蓄水池,三个桶,三个人,一个等待接水但是离水龙头很远
的大水缸。
现在要怎么装满水缸呢?
答案很明显,三个人每人从蓄水池提一桶水,然后按顺序通过去往水缸的路,然后把水倒进
水缸,回来继续,直到水缸装满。
例子中的通往水缸的路,就好比无线通道,只能一个一个的过,不能同时。
我们分析一下这个例子中,浪费的时间是怎么利用的呢?原来一个人搬一桶水出去后,很长
时间都在等待他搬完回来。而现在我们却通过三个人的搬运,利用各自的时间空隙,去搬运
水。可以想象的效果是,刚开始,第一个人提水,另外两个等他提好水。然后第一个人提水
出去了,第二个人开始提水。接下来第二个人提水出去,第三个人开始提水,这时第一个人
搬水回来了。然后又重复上面的步骤进行。这样达到的最好效果就是,从蓄水池提一桶水出
来的同时,水缸刚刚就倒进了一桶水。浪费的时间大大的缩短。
这让我想起魔兽争霸里面,五个农民在金矿取黄金的画面,魔兽玩家们都懂的。
对应到 zigbee,三个人就好似三个发送大小为 100 字节的窗口,发送第一个窗口的数据,第
二个窗口就出发了。第二个窗口出发后,第一个窗口的回应到了,第三个窗口又出发了。然
后依次循环,直到结束。
这个算法很类似于网络通信中的一个可靠算法,名叫 GBN 协议。因为 zigbee 协议栈本身可
能没有这么多的 Api 来实现全部的功能,但是只实现例子三,是没有问题的。
我在一个 zigbee 项目中实现了这个通信流程,将最终的可靠通信速度定格在 1300 字节每秒
左右。我测试过 TI 官方的 OTA 升级程序,120KB 的代码,升级大概需要 8 分钟左右,这个
速度是很难接受的。而如果速度为 1300 字节,那么升级时间就可以减少到一分半。
3
结束语
如果大家有什么疑问,可以通过我新浪微博向我提问。如果对我的代码感兴趣,可以在微
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi
博里给我留言。我的微博地址是:http://weibo.com/haoliubi
下期预告:使用快速通信远程为 ZigBee 模块升级(名字待定,以实际为准)。
具体算法的实现,可以参考 GBN 算法。如下图:
图 1 运行中的 GBN 协议
4
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi
这是我的 Zigbee 应用模型:
图 2 应用模型
运行中的应用模型:
图 3 运行中的应用模型
5
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi
下图是我的运行速度测试结果,测试软件是自己使用 Qt 编写:
图 4 通信速度
6
作者微博:子曰好流弊
地 址:http://weibo.com/haoliubi