跳转至

IEEE 802.15.4/ZigBee

进一步在WiFi、蓝牙等协议的基础上,针对自组网的需求,ZigBee协议逐渐发展起来。主要特点是近距离、低功耗的传输,同时还在上层协议基础上可以支持自组网等不同形式的组网功能。 当然现在来看,ZigBee协议的特点已经没那么明显了,蓝牙也具备低功耗的传输特点,同时也支持自组网的网络功能了。 ZigBee协议也算是我研究阶段起步学习的协议,也是我研究了很久的协议了。作为研究物联网协议的一个起点,我觉得从ZigBee开始还是很不错的,规模不是那么庞大,中间技术也没有那么复杂,有开源的实现方式,有很多具体解释文件,有较新的论文和研究。

1. ZigBee协议起源

ZigBee的名称来源于蜜蜂的八字舞,蜜蜂在发现花丛后会通过一种特殊的肢体语言来告知同伴新发现的食物源位置等信息,这种肢体语言就是ZigBee舞蹈,蜜蜂依靠这样的方式构成了群体中的通信网络。 ZigBee,又称为IEEE 802.15.4标准,其目标是实现类似于蜂群的低功耗、低复杂度、低速率、自组织的短距无线通信网络,为个人或者家庭范围内不同设备之间的低速互连提供统一标准。

2. ZigBee协议特点

ZigBee是一种无线连接,可工作在2.4GHz(全球流行)、868MHz(欧洲流行)和915 MHz(美国流行)3个频段上,分别具有最高250kbit/s、20kbit/s和40kbit/s的传输速率,可以看出来速度并不是很高,因为一开始ZigBee针对的应用就是较低速率需求的场景。 它的传输距离在10-180m的范围内(室内一般不超过60米 室外一般不超过180米)。作为一种无线通信技术, ZigBee的传输速率低,发射功率仅为1mW,而且采用了休眠模式,功耗低,因此ZigBee设备非常省电。据估算,ZigBee设备仅靠两节5号电池就可以维持长达6个月到2年左右的使用时间。当时实际使用的时候也知道,这个是跟协议应用场景是很相关的,如果应用中要求数据传输的频率高、或者网络比较密集(想象为什么),使用时间会明显缩短,我之前的研究很多就是为了最大限度的优化能量的消耗。 当时设计的时候是想往低成本的路线上走,因为速率的要求较低,随着现在越来越多技术的发展,这一优势未必有那么明显了。 典型的搜索设备时延30ms,休眠激活的时延是15ms,活动设备信道接入的时延为15ms。

ZigBee支持冲突避免的载波多路侦听技术(carrier sense multiple access with collision avoidance, CSMA/CA),避开了发送数据的竞争和冲突。如果你想学习CSMA/CA的实现,建议参考一下这个部分的代码,理解会大大加深。 ZigBee提供了基于循环冗余校验(CRC)的数据包完整性检查功能,支持鉴权和认证,采用了AES-128的加密算法,各个应用可以灵活确定其安全属性。

3. ZigBee协议栈

无线传感网作为物联网的一个典型的应用,最近的几年来受到了非常广泛的关注。由于IEEE 802.15.4/ZigBee通信协议的低功耗、低复杂度、自组织网特性,该通信协议是最早出现在无线传感网领域的无线通信协议,也是无线传感网领域最为著名的无线通信协议。由于传感网和物联网的一些相似点,作为物联网的一个应用,无线传感网的网络协议也能为物联网的协议设计提供一些启发。

同因特网的协议架构类似,这一部分我们将从协议栈的角度来介绍IEEE 802.15.4/ZigBee协议,主要包括开放系统互连(OSI)五层模型的物理层、介质访问控制层、网络层、传输层,以及应用层。其中802.15.4主要规定了物理层和链路层的规范,物理层包括射频收发器和底层控制模块,介质访问控制子层为高层提供了访问物理信道的服务接口。ZigBee主要提供了在物理层和链路层之上的网络层、传输层和应用层规范。

802.15.4/ZigBee体系结构

图. 802.15.4/ZigBee体系结构

  • 物理层: 主要负责电磁波收发器的管理、频道选择、能量和信号侦听及利用等。 物理层也规定了可以使用的频段范围,到2006年为止,802.15.4协议主要使用了3个频段:868.0-868.6MHz,主要为欧洲采用,单信道;902-928MHz,北美采用,10个信道,支持扩展到30;2.4-2.4835GHz,世界范围内通用,16个信道。后来根据各个地区的不同需求和应用背景,也有一些新的可用频段加入。 802.15.4因为采用直接序列扩频技术(回忆一下什么是直接序列扩频,如果忘了,返回[TODO])。

  • 介质访问层: 介质访问控制层(MAC)主要采用带冲突避免的载波侦听多路访问方式(CSMA/CA,Carrier Sense Multiple Access with Collision Avoidance)。 这种方式类似802.11中采用的方式,是在传输之前,先侦听介质中是否有使用同一信道的载波存在,若不存在说明信道空闲,将直接进入数据传输状态; 若系统检测到存在载波,则在随机退避一段时间后重新检测信道,退避的时间长短由具体的协议指定。 采用这样的协议简化了协议的设计和实现过程,但是对带宽的利用率有一定的影响,尤其是在数据量较大的自组织网络中问题更加明显,比如,隐藏终端(hidden terminal)问题就会显得非常明显,从而降低网络通信的效率和信道的利用率。

表 3 典型无线传感网节点各个模块能量消耗

设备 状态 电流
CPU 工作(active) 1.8mA
空闲(idle) 54.5\muA
内置flash 编程(program) 3mA
擦除(erase) 3mA
无线收发模块 发送数据(TX,0dBm) 17.4mA
接收数据和侦听(RX) 19.7mA
空闲(idle) 21\muA

为了节能,ZigBee中还可以增加一些额外的设计。 表3展示了一个典型的无线传感网节点通信模块各个部分在不同状态下的电流。由这个表可以看出传感网中的能量消耗有很大一部分来自节点上无线收发模块的能量消耗,即数据的发送和接收。无线收发器件(radio transceiver)工作时通常处于三种状态,发送,侦听和空闲状态。如表3无线收发模块上主要能量消耗是在传送数据状态、侦听状态和接收数据状态上,这几个部分所消耗的能量是基本差不多的。传感网节点在没有数据传输和接收的时候,节点也需要侦听信道以判断可能到来的数据包。因此能量也会消耗在侦听信道上面,这样的侦听就叫做空闲侦听(idle listening)。注意空闲侦听(idle listening)和空闲(idle)是两个不同概念,空闲侦听是指节点处于侦听状态,但是并未侦听到任何数据,从而浪费掉了能量;空闲状态是指节点物理地关闭一些硬件功能,从而达到较低的能耗。研究表明空闲侦听将占据无线传感网节点能量消耗的主要部分,因此如何减少空闲侦听是一个无线通信协议能够适用于传感网以及其他低功耗的网络首先需要考虑的一个重要问题。

这样在实际数据访问控制层的设计可以使用采样侦听(sampling listening)实现低功率侦听协议(LPL,low power listening)。采样侦听是指节点的无线收发模块在没有数据的时候不需要一直处于侦听状态,可以用采样的办法来获取信道的信息,在非采样时间,无线通信模块可以处于空闲状态,从而能够减少由于没有数据而一直保持侦听状态所消耗的能量。这样就类似于一个门卫本来一直要守在门口看看是不是有人进来,现在变成了睡一段时间再看一下。当然这样带来的问题就是发送者在发送数据的时候接收者不一定处于侦听状态,因此不能正确的接收数据。通常采用的解决办法是通过延长发送者的发送时间来解决这个问题。假设接收者采样周期为T,发送者在发送数据的时候保持发送数据的时间长度不少于T的话,接收者就能够采样到发送者发送的数据,从而能够正常接收发送者发送过来的数据。图7展示了采样侦听中发送者和接收者的工作模式。当然也可以采用有调度的模式,发送者和接收者进行同步,发送者在接收者采样的时间里进行数据传输,如图7中所示。

采样侦听发送者和接收者的工作模式

图. 采样侦听发送者和接收者的工作模式

  • 网络层: 网络层在介质访问控制层和应用层之间起着重要的作用,它使得应用层的数据能够利用介质访问控制层到达最终的目的地。 在ZigBee中,网络层的主要功能包括路由,新节点和路径的发现以及决定一个节点属于某一个子网络等等。 网络层采用的基本路由协议是按需距离矢量路由协议(AODV)。 在AODV中,为了寻找源节点(source)到目的节点(destination)的一条路径,源节点广播一个路由请求给它的所有邻居,邻居节点在收到消息后,再广播收到的消息给它们的邻居,如此直到消息到达目的节点。 当目的节点收到路由请求消息以后,目的节点返回一个路由回复给源节点,这个回复不再是广播的方式发送到源节点,而是沿着路由请求数据包从源节点到目的节点的路径,这样源节点就可以按照这条路径发送消息到目的节点了。 在按需距离矢量路由协议中,源节点只有在有包需要发送时,才会建立到目的节点的路由。 这不同于传统的互联网路由协议,互联网上的每个路由器都维护了一个路由表,这个路由表维护着到不同节点或者区域网络的路由路径,这个路由表会定期地更新。 之所以采用这样的架构是由于因特网上的网络结构相对稳定以及路由器的功能相对较强大,同时也与互联网应用的需求更加高有关。 而在自组织的网络中,网络结构很难固定且每个节点的存储空间非常有限,因此采用固定的路由表将会带来存储和更新的开销。

关于ZigBee协议的开发案例其实有很多,我之前也写过很多相关的代码,也发表过相关的论文,大家可以参考TinyOS系统里面的实现来进行具体理解,我们在这一部分就不具体展开讲了。