1. 引言
当前,环境问题是一个全球都关注的热门话题,和人们的生活息息相关。无线传感网络是大量静止或者移动的传感器以某种方式构成的无线网络,把其网络监测的区域各种有用的环境信息通过采集、传输和处理,最后对这些信息进行分析应用。本文基于ZigBee技术 [1] ,设计出的无线传感网络能够部署在监测区域,通过无线通信的方式构成了一个多跳自组织网络,监测周围的环境信息,并将信息实时传递到终端。
2. 基于ZigBee的无线通信技术
2.1. ZigBee无线通信协议
ZigBee是符合IEEE 802.15.4规定的短距离无线通信协议,它的通信参考模型如图1所示。ZigBee协议的底层是遵循IEEE 802.15.4标准的物理层和MAC组成,ZigBee联盟 [2] 在此基础上又增加了网络层和应用层。
(1) 应用层:ZigBee协议的应用层可以为在同一网络的不同设备之间提供数据传输服务,发现设备并绑定设备。(2) 网络层:ZigBee协议中,网络层主要负责网络管理、路由管理、报文以及网络安全管理等任务。(3) MAC层:MAC层主要负责对物理的信道的访问。(4) 物理层:物理层主要负责控制无线收发器的激活和关闭,选择信道的频率,发送和接受数据等等 [3] 。
2.2. ZigBee拓扑结构
ZigBee无线网络结构可以分为星形、树形和网状 [4] 。其中全能设备(FFD)在三种网络中承担协调器的作用,管理网络中的其它网络节点。简化设备(RFD)则只是作为普通网络节点,在网络中与RFD或FFD间进行通信。
(1) 星形拓扑,星形拓扑网络结构的中心节点必须由协调器构成,其它节点则可以说终端设备或路由器,协调器作为整个网络的核心。(2) 树形拓扑,典型的ZigBee的树形拓扑网络由协调器、路由器和终端设备组成,不需要每个每一个网络节点都和协调器相连,可通过点节点与协调器之间的路由器的路由功能进行通信。以路由器的方式扩大这个网路的覆盖范围。(3) 网状拓扑,网状拓扑较为复杂,但同时设计起来,灵活性高,在整个网络中,路由器作为一个很重要的节点,可以根据需要自动创建并维护网络路径,可以和任何节点之间镜像通信,帮助附近的节点传递数据。
2.3. Z-Stack协议栈
Z-Stack协议栈的实现方式是采用分层的思想,分为物理层、介质访问控制层、网络层和应用层。本设计采用TI公司推出的Z-Stack协议栈,如图2是用IAR软件打开的Z-Stack协议栈的目录。

Figure 1. ZigBee reference model for communications
图1. ZigBee的通信参考模型

Figure 2. Z-Stack protocol stack project
图2. Z-Stack协议栈工程
(1) App:应用层目录;(2) HAL:硬件层目录;(3) MAC:MAC层目录;(4) MT:监视测试目录;(5) NWK:网络层目录;(6) OSAL:协议栈的操作系统抽象层;(7) Profile:AF层的目录;(8) Security:安全层的目录;(9) Services:地址处理函数目录;(10) Tools:工程工具的配置目录;(11) ZDO:ZDO目录;(12) ZMac:ZMac目录;(13) ZMain:整个协议栈的主函数目录;(14) Output:输出文件的目录。在Z-Stack协议栈中使用了操作系统的概念,即框架目录中的OSAL层。OSAL采用的是时间片轮转的方法去实现多任务的切换,以此实时处理各种任务。
Z-Stack是基于操作系统设计的,以事件机制加时间片轮询的进行工作构建的。Z-Stack协议栈以ZMain目录中main函数入手,可以看出整个main函数首先进行了相关硬件的初始化已经APP应用的初始化,在初始化完成后,就进行时间片轮询,等待事件发生,然后调用相应的处理函数,完成相应的操作。
整个Z-Stack协议栈工作流程如图3。首先是进行各项初始化,包括初始化系统时钟、检查芯片的工作电压、初始化并配置相应定时器等等;完成系统初始化后就开始进入操作系统的循环等待事件发生。Z-Stack是基于OS进行运作的,每个事件都有相应的初始化函数和处理事件函数,如开发者会用到的GenericApp_Init(taskID),其中参数taskID是Z-Stack根据其优先级分配的ID号,对应的数值越小,则优先级越高。
3. 环境监测系统的系统设计
整个系统分为四大部分,分别是终端部分、Web服务器部分、无线通信部分和传感器部分。整个系统首先通过传感器部分对传感器进行设置并对数据进行采集;接着在无线通信部分就可以将数据按照一

Figure 3. Z-Stack system flow chart
图3. Z-Stack系统工作流程图
定网络拓扑路径,从终端节点出发,最终传送到协调器节点,协调器在接到数据后,通过串口将数据上传到PC机;在Web服务器这部分,调用Linux系统下读写串口函数,对协调器上传的数据进行读取,并调用文件读写函数处理数据,存放在本地数据库;在终端这部分,可以对数据进行管理、查询并做出相应的环境预报,同时可以方向发生控制信号对传感器部分进行远程控制 [5] 。图4是系统的整体方案。
硬件模块采用TI公司提供的CC2530。CC2530是用于2.4 GHz的IEEE 802.15.4 ZigBee等技术的SoC解决方案。在建立大范围的网络节点时,为其解决成本。在本设计中,是增强型CC2530单片机为核心,组建具备数据采集、数据通信功能的无线传感网络 [6] 。
3.1. 采集节点
采集节点硬件模块主要由CC2530和各类传感器(如温度传感器、湿度传感器、烟雾传感器和气压传感器等等)以及电源模块组成,如图5所示。采集节点在网络结构中定位为终端节点,长时间工作在野外环境,具有超低功耗的运行模式,一般采用普通的5号电池就可以在野外工作6~24个月。
3.2. 路由器节点和协调器节点
协调器和路由器模块的硬件基本相同,均是采用CC2530作为整个电路的核心。需要区别的是,协
调器会通过串口将接收到的数据发送给PC机,PC机则通过串口读写软件显示收到的数据。如图6为路由器节点和协调器节点。
4. 环境监测系统的软件设计
4.1. 软件模块
整个软件部分由底层协议Z-Stack协议栈、Linux系统下Web服务器和手持终端组成,手持终端上运行Android系统 [7] 。
整个系统从终端节点开始,由采集几点上传感器采集数据,通过Z-Stack协议把采集到数据传输到协调器,协调器则通过串口向PC机上传采集数据。在Web服务器上,Linux系统通过读串口数据函数把数据存储在本地,等待用户访问和控制。在Android系统部分,手持终端通过用户模式,登录Linux系统下的Web服务器,获取数据,得到需要采集环境的环境数据。
在使用Z-Stack协议栈API之前,需要进行一些简单的初始化,如图7所示。打开App目录下SampleApp.c文件,找到SampleApp_Init函数,在函数开头加入串口初始化和需要外借温度传感器I/O口初始化。
在完成初始化后,在SampleApp.c源文件中找到SampleApp_ProcessEvent函数,加入相应的内容,代码如下。系统通过周期性判断是否有事件发生并处理。当发生事件时,则对时间发生的情况进行解析。当事件为SYS_EVENT_MSG时,可判断事件具体情况为CMD_SERIAL_MSG、KEY_CHANGE、AF_INCOMING_MSG_CMD、ZDO_STATE_CHANGE中的哪一种,并调用相应的函数进行处理。当事件为SAMPLEAPP_SEND_ PERIODIC_MSG_EVT时,在这里加入对原始数据的处理。
4.2. Web服务器
整个服务器部分通过双进程的原理分别进行操作,其中一个进程构建socket网络,并初始化网络各项参数,等待用户访问,另一个进程读取串口发来的数据,并通过文件操作函数,将数据通过文件的形式存放在本地。
在server.c中,由server_start、init_sock和do_process函数组成。server_start函数在函数最开始调用

Figure 6. The coordinator nodes and routing nodes
图6. 协调器节点和路由器节点

Figure 8. Web server is receiving data
图8. Web服务器接受数据
init_sock函数,接下来循环等待用户访问。init_sock函数通过socket网络编程中,socket、bind和listen三个核心函数,完成Web服务器的初始化,最好返回sock_fd的值。do_process函数当有用户访问时,通过getpeername函数获取用户IP等一些信息,并对用户请求做出相应的处理。
4.3. Android终端
在整个系统中,Android终端属于用户操作,通过访问Web服务器获取监测环境的一些数据,并在手持终端上显示出来。手持终端通过类似网址访问模式。
5. 系统调试
在Linux系统下eclipse编程工具获取的协调器通过串口上传的数据,并调用Linux系统时间函数获取本地时间得到原始数据。如图8所示。
6. 总结
本系统是在CC2530单片机和Z-Stack协议栈的基础上,实现了基于ZigBee环境监测系统。(1) 主要借助IAR软件开发环境对Z-Stack协议栈的关键API函数进行剖析,并在相应位置加入需应用的代码。(2) 基于ZigBee无线通信技术 [8] - [12] ,实现了环境监测系统的Web服务器。(3) 实现Android客户端对环境监测系统进行控制。
基金项目
本文由湖北省教育厅科研项目B2013032支持。