ZigBee协议网络层的设计与实现
扫描二维码
随时随地手机看文章
Zigbee是一种新兴的短距离、低速率无线网络技术,主要用于近距离的无线通信,由于具有低功耗、低成本、可扩展以及良好的互操作能力等特性,在工业自动化、建筑自动化以及工业无线领域占有重要地位[1][2][3]。
ZigBee联盟[4]成立于2001年8月,2002年下半年,英国Invensys公司、日本三菱电气公司、美国摩托罗拉公司以及荷兰飞利浦半导体公司等四大公司加盟ZigBee联盟,这一事件成为ZigBee技术的里程碑。到目前为止,加盟ZigBee联盟已经涵盖IT领域以及其它行业的200多家企业,其中还包括来自我国的华为技术有限公司和中国科学院沈阳自动化研究所。
2 协议栈架构
Zigbee协议栈软件采用C语言编写,开发环境采用AVR Studio4.12,硬件平台采用的单片机为Atmega128,射频模块采用CC2420。采用的标准是ZigBee 1.0规范[5], 整个协议栈软件采用单线程,考虑到Atmega128内部RAM只有4K的空间,因此,各模块之间采用共享缓冲区进行通信。Zigbee协议栈软件的架构如图1所示。
每个模块具有一个执行函数,用于接收来自底层模块的数据。在数据接收阶段,底层模块将接收到的数据帧在本层解析后,将需要向上层模块发送的数据存放在共享的接收缓冲区,同时通过全局变量的形式向上层模块提供指示原语;在上层模块的执行函数中,首先通过判断来自底层模块的指示原语确定是否存在来自其它节点的数据,如果存在则解析并处理,同时将需要传递给更高模块的数据放入接收缓冲区,同样通过指示原语通知更高层模块。
500)this.style.width=500;" border="0" />
图1 Zigbee协议栈软件架构
3 网络层的设计与实现
网络层通过两个服务实体分别提供两类服务,它们分别是网络层数据服务和网络层管理服务。1) 数据服务实体:提供数据服务,主要负责数据的发送和接收;2) 管理服务实体:提供管理服务,主要负责网络层的管理和维护,包括网络的发现和创建,设备的加入和离开以及路由的创建与维护。
3.1 数据发送和接收
网络层的数据服务实体负责数据的接收和发送,接收处理模块负责接收数据,发送处理模块负责发送数据。
数据接收和发送处理模块的功能和工作流程如下:
1) 数据接收处理模块
接收处理模块负责从下层接收数据,解析报文的网络层头部,分情况做相应的处理:如果是重复报文,则丢弃;如果是发给本节点的数据报文或者广播报文,则交给上层处理;如果是需要本节点转发的报文,则将报文交给发送处理模块处理。
2) 数据发送处理模块
发送处理模块负责从上层或者接收处理模块中接收数据,根据不同的情况做相应的处理:如果报文的剩余跳数不大于0,则视为“死报文”,丢弃之; 否则需要进行报文发送。首先查找路由表,如果找到了到目的节点的有效路由表项,则根据路由信息将报文发送出去;如果没有,则根据报文的路由发现选项决定是否进行路由发现,以及是通过树型路由发送报文还是等待路由回复消息到达后再发送报文,具体的我们将在3.3节的路由发现和维护中进行详细说明。
3.2 网络设备管理
ZigBee的网络中包括协调器设备、路由设备和终端节点设备,其中,协调器设备负责创建网络,路由设备可以参与网络路由和数据转发但是终端节点设备只能作为叶子节点而不能参与路由。设备管理主要包括网络的发现和创建以及节点的加入和离开。
节点进行网络通信的第一步是由协调器设备负责创建网络。协调器节点首先进行信道扫描来进行网络发现,根据扫描结果,选择一个最佳的空闲信道并在该信道上创建网络。在协调器节点创建网络后,非协调器节点就可以加入网络了。具体的步骤如下:1)进行网络发现。如果指定了PANID(Personal Area Network ID,个域网ID),则发现相应ID的个域网才进行加入,否则,加入到最先扫描到的网络。2)选择合适的父节点,发送加入网络请求。从邻居节点中选择合适的节点作为自己的父节点,并向其发出加入网络的请求。3)加入网络。通过父节点加入网络,并获得一个16位的网络层地址。
协调器节点创建网络或者非协调器节点加入网络,其实现的难点和关键在于进行网络发现。我们通过设计有限状态机的方法来进行网络发现,其状态转换如图2所示。
500)this.style.width=500;" border="0" />
图2 网络发现状态转换图
转换图中共有5个状态,各个状态定义如表1所示:
表1网络发现状态定义
500)this.style.width=500;" border="0" />
节点可以通过发送LEAVE_REQUEST请求原语离开网络,也可以通过发送LEAVE_REQUEST请求原语让别的节点离开网络。当节点收到LEAVE_REQUEST请求(来自本节点的应用层或者来自其他节点)时,执行离开网络操作:首先,节点发送离开指示报文LEAVE_INDICATION给所有的邻居节点;然后,邻居节点收到LEAVE_INDICATION后,将该节点从邻居表和路由表等信息中移除;最后,清空本节点网络层信息,离开网络。
500)this.style.width=500;" border="0" />
图3 收到路由请求命令报文后的处理流程
3.3 路由
路由,作为网络层的核心功能之一, 它的设计与开发直接影响着网络的性能,这也是整个协议开发的重点和难点。下面我们将对路由协议的设计,路由发现以及维护分别进行介绍。
当且仅当一个节点要单播发送数据报文但是当前路由表中没有到目的节点的有效路由时,节点向外广播发送路由请求报文RREQ(Route Request)进行路由发现。节点收到路由请求报文后的详细处理流程如图3所示。
当节点收到路由回复报文时,首先查找路由表和路由发现表看是否有对应的项,如果有则更新路由表和路由发现表。如果该节点地址不等于路由回复报文命令负载中的发起节点地址,则需要继续转发该路由回复。节点收到路由回复报文后的详细处理流程如图4所示。
500)this.style.width=500;" border="0" />
图4 收到路由回复命令报文后的处理流程
4 结论
根据ZigBee协议国际规范,设计和开发了具有我国自主知识产权的ZigBee协议栈。本文,我们针对Atmega128闪存空间有限的特点设计了合适的协议栈软件架构;并且重点对协议栈网络层进行了详细的介绍,主要包括服务实体的定义和划分、网络层的功能描述和实现(如数据收发、设备管理以及路由发现与维护)。
本文作者创新点:为了在有限存储空间上实现ZigBee规范定义的诸多功能,设计实现了共享缓冲区进行数据收发;针对无线网络的链路特点,设计实现了适用于工业环境的无线Mesh网络路由协议,在进行路径选择的时候充分考虑链路质量因素,提高了选路的可靠性。