无线传感网络WSN(Wireless Sensor Network)是由部署在监测区域内的大量廉价微型传感器节点组成的、通过无线通信方式形成的一个多跳的自组织的网络系统。ZigBee凭借低功耗、短延时、自组网等优势已广泛应用于无线传感器网络中,但如何实现ZigBee网络的远程管理和监测逐渐成为该领域的重要研究课题。本文设计了基于ARM平台的ZigBee网关,其目的是实现ZigBee无线网络的远程控制。
1 系统概述
网关主要由无线传感器和以太网服务器两部分组成。无线传感器选用ZigBee CC2530;以太网服务器以STM32作为主处理器,通过串口(UART)连接以太网控制器ENC28J60。
网关总体结构由三部分组成,即硬件层、软件层和应用层[1],如图1所示。硬件层描述了网关中的处理器和无线传感等硬件;软件层是移植μC/OS-II实时内核、嵌入式TCP/IP协议栈LwIP和ZigBee协议栈,实现TCP/IP和ZigBee两种协议栈间协议的双向透明转换,同时封装一些关键应用程序接口(API)函数供应用层程序调用;应用层是用户根据具体的数据要求编写的应用程序,用户根据实际需要使用下层定义的API函数自行扩充相关应用。
2 网关硬件设计
网关的工作流程为:网关内的ZigBee协调器创建一个无线网路,控制区域内ZigBee节点自动搜寻网络,并加入到网络中;当需要远程监控计算机获得某一个节点的数据或者发送某一个指令给节点时,只需向以太网口发送相应的节点地址和指令即可;网关以太网接口获得远程计算机的命令后,就会通过处理器的协议转换通知ZigBee协调器向相应的传感器节点发送指令;传感器节点收到命令后按照指令执行操作,并把数据按相反的路径发送给远程监测计算机。网关的硬件结构如图2所示。
其中,微处理器通过SPI方式与ZigBee和以太网控制器通信,ZigBee节点是监测区域内的传感器节点,自动加入协调器建立的网路中。
2.1 硬件选择
考虑到高性能、低成本等因素,网关选用基于Cortex-M3内核的STM32F103作为主处理器。此系列处理器是增强型处理器,工作频率达到72 MHz,内置高速存储器(高达128 KB的闪存和20 B的SRAM)接口。集成了许多紧耦合系统外设,能满足下一代产品的控制需求。调试模式有串口调试和JTAG接口,本文中采用串口调试方式,节省了开销。多个通信接口:2个I2C接口(SMBus/PMBus)、5个USART接口、3个SPI接口等。这些特性足以满足本网关设计的要求。
CC2530是用于IEEE802.15.4、ZigBee和RF4CE应用的一个真正的片上系统(SoC)解决方案。低功耗、短延时,以非常低的总成本建立庞大的网络节点等特性成为无线传感网络重要技术之一,并且结合了领先的RF收发器的优良性能,业界标准的增强型8051 CPU,系统内具有可编程闪存、8 KB RAM和许多其他强大的功能。2个USART接口,调试接口用于内部电路调试,具有两线串行接口。
2.2 STM32与CC2530的硬件连接
STM32处理器与CC2530的硬件连接[2]如表1所示。
3 网关软件设计
本文设计的网关,按软件平台可分为运行在ZigBee无线模块中的ZigBee协议栈程序和运行在主处理器STM32中的嵌入式以太网服务器程序两部分。其中在STM32中移植?滋C/OS-II实时操作系统,两个不同的网络使用两类协议,即TCP/IP协议和ZigBee协议。
3.1 ZigBee协议栈
ZigBee协调器中运行ZigBee协议栈程序,协议栈采用Z-Stack 2007,其结构包括应用层、网络层、媒介访问控制层和物理层。可以说Z-Stack是一个小型的操作系统,底层和网络层内容已经封装好,只需根据需要修改应用层函数,通过任务轮询机制执行任务。
3.2 μC/0S-II下LwIP的移植
LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的DUNKELS A等开发的一个小型开源的TCP/IP协议栈,实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十KB RAM和40 KB左右的ROM就可以运行,使得LwIP协议栈适合应用在低端嵌入式系统中。
LwIP协议栈把所有与硬件、OS、编译器相关的部分独立出来,放在/src/arch目录下,因此LwIP在?滋C/OS-II上的移植实现只需要修改这个目录下的文件。LwIP成功移植到μC/OS-II操作系统需要修改和编程的部分[3]:
(1)修改与STM32及IAR编译器相关的include文件(cc.h、cpu.h、perf.h);
(2)修改与μC/OS-II相关的一些结构和函数;
(3)lib_arch中库函数的实现;
(4)STM32网络驱动程序编写;
(5)μC/OS-II模拟层相关代码编写。
完成上面的几个部分后就可以在?滋C/0S-II中初始化LwIP,并创建TCP或UDP任务。LwIP的初始化必须在μC/0SII完全启动之后(即在任务中)进行,因为它的初始化用到了信号量等 OS相关的操作。关键代码和说明如下:
main(){
OSInit();
OSTaskCreate(lwip_init_task, &LineNo11, &lwip_init_stk
[TASK_STK_SIZE-1], 0);
OSTaskCreate(usr_task,&LineNo12,&usr_stk[TASK_STK_
SIZE-1],1);
OSStart();
}
3.3 协议转换软件设计
如何使得节点间数据交换透明化是网关应用程序的主要问题,需要设计协议转换。在TCP/IP协议簇中,以太网的数据传输使用硬件地址(MAC)来识别,地址解析协议(ARP)完成IP地址和数据链路层使用的硬件地址之间的转换,参考TCP/IP下的实现机制,在网关软件支持层的ZigBee协议和TCP/IP协议之上添加应用地址适配层和应用协议层。软件结构[4]如图3所示。
应用地址适配层实现ZigBee地址、以太网地址与应用层地址的映射关系,通过创建地址映射表以及相应的软件操作接口来实现;应用协议层在应用地址适配层的基础上,通过制定统一的应用协议,规范数据交换格式;网关应用程序实现网关具体功能,以μC/OS-II任务的形式组织运行。
3.4 μC/OS-II操作系统
μC/OS-II是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统,包含了任务调度、任务管理、时间管理、内存管理和任务间的通信和同步等基本功能。
3.4.1 系统移植
在STM32微处理器平台上移植?滋C/OS-II只需要修改OS_CPU.H、OS_CPU_A.ASM和OS_CPU_C.C 3个文件。OS_CPU.H中修改声明中与微处理器相关的常量、宏和typedef;OS_CPU_A.ASM中实现五个与处理器相关的函数:OS_CPU_SR_Save( )、OS_CPU_SR_Restore( )、OSStart-HighRdy( )、OSCtxSw( )、OSIntCtxSw( );OS_CPU_C.C中有9个钩子函数(空函数)和一个OSTaskStkInit( )函数,OSTask-StkInit( )函数功能是完成新建任务堆栈的初始化。
3.4.2 网关任务函数
网关应用程序是以μC/OS-II任务的形式组织运行的,μC/OS-II中主要任务是接收和处理以太网的指令,实现以太网和ZigBee节点间通信。系统中的主要任务函数包括:以太网数据接收任务TaskEthernetRec()、以太网数据处理任务TaskDealEthernet()、以太网数据发送任务TaskEthernetSend()、ZigBee数据接收任务TaskZigBeeRec()、ZigBee数据处理任务TaskDealZigBee()和ZigBee数据发送任务TaskZigBeeSend()。
任务之间的数据共享通过多个数据队列实现,主要数据队列包括:以太网数据接收缓冲队列QueueEthernetRec()、以太网数据发送缓冲队列QueueEthernetSend()、ZigBee数据接收缓冲队列QueueZigBeeRec()及ZigBee数据发送缓冲队列QueueZigBeeSend()。
通过本网关对两个ZigBee节点采集的温度数据进行简单的控制,取得了理想的控制效果。网关的设计弥补了ZigBee通信距离短的不足,利用低功耗、高性能的STM32微处理器,实现了ZigBee短距离通信的远程控制,增加了ZigBee网络应用的广泛性。软件部分采用?滋C/OS-II操作系统,方便移植到更高性能的ARM9处理器上。该网关所具有灵活性使其可应用在多种不同的工业控制现场,具有较强的实用性。