摘要 无线传感器网络WSN(Wireless Sensor Network)由部署在监测区域内大量廉价的传感器节点组成,通过无线通信方式形成multihop自组织的网络系统,其目的是协作地感知、采集和处理网络覆盖区域中感知对象的信息,并发送给观察者。本文从分析无线传感器节点Mica和其上运行的操作系统TinyOS出发,着重描述无线传感器网络节点应用程序体系结构和消息通信机制。
关键词 TinyOS 无线传感器 nesC Mica节点
1 节点组成
节点是无线传感器网络中部署到研究区域中用于收集和转发信息、协作完成指定任务的对象。每个节点上运行的程序可以是完全相同的,唯一不同的是其ID。
1.1 节点构成
无线传感器节点由传感器模块、处理器模块、无线电通信模块和能量供应模块4部分组成,整个结构如图1所示。
图1 无线传感器节点构成框图
本质上,无线传感器节点就是一个网络化的分布式嵌入式系统,通过无线信道实现网络间的通信。为了减少通信量,在本地完成必要计算进行数据融合,从而协作完成部署空间数据的采集。在应用上体现以网络为中心,节点的功能通过网络来体现。因而传统的嵌入式设计思想在无线传感器网络中遇到许多挑战:节点中运行程序存在大量并行和节点协同计算。
1.2 节点特点
无线传感器网络是应用相关性网络,不同应用领域使用不同的网络技术实现。由于无线传感器节点是用于监测的,分布密度大且范畴广,因此必须低成本、低功耗和小尺寸。从现有技术条件来看,值得考虑的是节点成本和能源补给。节点不可能采用太高的频率,因为频率与能量的消耗是正相关的,频率高则能量消耗大。另外无线电通信模块能量消耗也大,传送距离同能量消耗也是正相关的,因而须在发送距离和节点数之间做出权衡。
1.3 Mica节点
加州大学伯克利分校主持开发的低功耗无线传感器节点Mica,处理器芯片采用Atmel公司的****R系列(TI公司的 MSP430也是不错的选择),无线电收发模块采用TR1000或CC10000,外加相应传感器接口,实现了无线传感器节点,如图2所示。节点间通过无线电方式进行通信,协作完成指定任务;节点自身通过ADC通道来感知外界数据。
图2 Mica节点实物图
Mica节点上可感知多个不同物理量:光强度、温度、地磁强度等。
无线传感器网络与现在传感器技术最大的不同在于,将现有的传感器技术进行网络化,使传感器技术应用更好,为现在传感器技术提供更新的解决方法。
2 节点上微型操作系统
无线传感器网络节点存储容量有限。通过研究发现,要满足其自身网络运行的需要,可以使用一种新的嵌入式系统和嵌入式软件来实现。
2.1 操作系统需求
从对节点结构分析不难看出,无线传感器节点硬件简单,可以直接在硬件上进行编程。但这在工程实践中产生许多问题:应用程序开发的难度大大增加,程序员必须对硬件十分了解;程序员无法继承现有的软件成果,延长开发周期;无法形成规模化,使用新的芯片,上层模块都必须改写。
从现有软件技术来看,无线传感器可以直接使用现有的嵌入式操作系统。现有嵌入式操作系统大多是实时操作系统,很少考虑能源供应,而无线传感器一个致命点就是能源供应无法解决;现有嵌入式操作系统大多所占用空间很大,而无线传感器另一个致命点又是存储容量有限。
无线传感器节点有两个突出特点:一个是消息到达的并发性,很密集,即存在多个需要同时执行的逻辑控制,需要操作系统在较短时间内完成这些频繁发生的操作;另一个是无线传感器节点模块化程序高,要求操作系统为应用程序对硬件控制提供方便操作。
2.2 TinyOS操作系统
操作系统就是为用户提供一个良好的用户接口。基于以上分析,研发人员在无线传感器节点处理能力和存储能力有限情况下设计一种新型的嵌入式系统TinyOS,具有更强的网络处理和资源收集能力,满足无线传感器网络的要求。
为满足无线传感器网络的要求,研究人员在TinyOS中引入4种技术:轻线程、主动消息、事件驱动和组件化编程。
轻线程主要是针对节点并发操作可能比较频繁,且线程比较短,传统的进程/线程调度无法满足(使用传统调度算法会产生大量能量用在无效的进程互换过程中)的问题提出的。
主动消息是并行计算机中的概念。在发送消息的同时传送处理这个消息的相应处理函数ID和处理数据,接收方得到消息后可立即进行处理,从而减少通信量。
整个系统的运行是因为事件驱动而运行的,没有事件发生时,微处理器进入睡眠状态,从而可以达到节能的目的。
组件就是对软硬件进行功能抽象。整个系统是由组件构成的,通过组件提高软件重用度和兼容性,程序员只关心组件的功能和自己的业务逻辑,而不必关心组件的具体实现,从而提高编程效率。
2.3 TinyOS操作系统的实现
TinyOS操作系统最初是用C语言实现的,产生的目标代码比较长。后来研究设计出基于组件化和并行模型的nesC语言,产生的目标代码相对较小。用nesC语言可开发TinyOS操作系统和其上运行的应用程序。
2.3.1 接口
接口(interface)是一个双向通道,表明接口具有的功能和事件通知能力是双向的,向调用者提供命令和实现命令者进行事件通告。
interface name {
asy commandresult_t Cname(pram p);
asy eventresult_tEname(pram p);
}
其示意图如图3所示。
图3 接口示意图
在接口中声明命令和事件实现不同的功能,命令是接口具有的功能,事件是接口具有通告事件发生的能力。Asy可以命令或事件在中断处理程序中调用。
接口体现事件驱动功能和模块化。通过事件通告让使用接口者对事件进行响应;任何满足接口功能的实现者都可被其他需要这个接口功能的组件调用。
2.3.2 组件
组件是配线文件或模块文件,是逻辑功能的抽象。程序员完全可直接调用组件进行程序开发。
配线文件只是完成组件之间的接口连接,模块文件则具体实现接口中的命令和事件。在这两个文件中都可使用provides、uses语句。provides表明这个组件可以提供哪些接口,实现这些接口的命令和事件通知。uses表明这个组件使用哪些接口,组件可以接口中提供的命令和实现对接口中事件进行响应。组件结构如图4所示。
图4 组件结构图
基于组件的思想,一个组件可通过多个组件实现一定的逻辑功能,对外声明需要哪些接口和提供哪些接口。图5所示为由组件A、B和C形成的新功能组件D。
图5 组件D结构图
2.3.3 并行模型
通过任务(task)和中断处理事件(interrupt hander event)来体现TinyOS并行处理能力。任务(task)会加入一个FIFO队列中,执行过程中,任务间没有竞争;但中断处理程序可以打断任务执行。TinyOS采用二级调度机制来满足无线传感网络运行特点,整个程序调度过程如图6所示。组件中完成任务提交,由操作系统完成调度。
图6 TinyOS程序结构框图
基于以上分析,一个节点上应用程序的框图如图7所示。操作系统只是在后台提供队列服务。
图7 应用程序结构框图
3 具体实现说明
现以节点收发计数器中的数值为例,更为详细地说明网络协议是如何通过主动消息传递来实现的。
程序要求节点启动以后,开始让计数器计数,每秒向外广播自己的计数值,同时接收其他节点上计数器的值。
3.1 main组件
TinyOS应用程序从main组件开始,完成main组件的StdControl接口的3个命令init()、start()和stop()的具体实现。这个接口中命令执行次序可用init*(start|stop)*,应用程序执行前执行init()完成必要初始化工作,start是这个程序要完成的工作,stop是系统关闭前所要执行的动作。这个接口是TinyOS应用程序标准接口,与硬件操作相关的其他组件必须用到这个接口,实现接口中的命令。
3.2 使用的接口
StdControl接口完成应用程序启动及相关硬件初始化。
interface StdControl {
command result_t init();
command result_t start();
command result_t stop();
}
Timer接口实现计数功能。
interface Timer {
command result_t start(char type, uint32_t interval);
//设定触发类型和计数值
command result_t stop()
//中止计数器
event result_t fired();
//计数器定时触发事件
}
SendMsg接口发送消息。
interface SendMsg {
command result_t send(uint16_t address, uint8_t length, TOS_MsgPtr msg);
//发送消息
event result_t sendDone(TOS_MsgPtr msg, result_t success);
//消息发送完成以后事件
}
ReceiveMsg接口接收消息。
interface ReceiveMsg {
event TOS_MsgPtr receive(TOS_MsgPtr m);
//接收到消息事件
}
3.3 使用的组件
组件Main, test5M,TimerC,GenericComm as Comm实现逻辑功能。Main是系统必需的。test5M提供接口的命令并实现对调用接口事件的响应。GenericComm完成消息的发送和对接收消息的通告。其配线文件如下:
Main.StdControl -> test5M.StdControl;
Main.StdControl -> TimerC.StdControl;
test5M.Timer -> TimerC.Timer[unique("Timer")];
test5M.SubControl->Comm;
test5M.Send -> Comm.SendMsg;
test5M.Receive->Comm.ReceiveMsg;
3.4 test5M模块文件
test5M模块接口如下:
module test5M {
provides {
interface StdControl;
}
uses {
interface Timer;
interface SendMsg as Send\[uint8_t id\];//发送消息接口
interface ReceiveMsg as Receive\[uint8_t id\];//接收消息
interface StdControl as SubControl;//子组件:完成发送初始化
}
}
provides声明这个组件所实现接口中命令和通告相关事件的产生。需要实现StdControl接口中命令init()、start()和stop()。
Uses声明这个组件调用接口中命令并对接口中事件进行响应。所需要响应的事件为Timer接口的fired()事件、SendMsg接口的sendDone事件和ReceiveMsg接口的receive事件。
3.5 通信实现
test5M发送和接收消息是通过组件GenericComm来实现的。GenericComm通过调用其他组件实现从消息包到主动消息、字节级数据传数、位级数据传送到无线电收发模块的功能。在此不再深入分析其实现过程,采用随机后退的CSMA/AD的MAC协议,只要明白组件GenericComm就可以完成消息的收发。
GenericComm提供了256个消息收发接口,也就是说系统可以使用256种消息,或者说256种状态进行转换。由于系统是非阻塞模式,一旦消息到达组件test5M中,receive事件就会立刻调用,因此在这个事件中实现不同消息的转换,从而实现通信双方的握手:
event TOS_MsgPtr Receive.receive\[uint8_t id\](TOS_MsgPtr m) {
switch(id) {
case 1: //状态转换1
case 2: //状态转换2
}
return m;
}
结语
分析无线传感器节点Mica和其上运行的TinyOS操作系统出发,描述无线传感器网络节点体系结构,通过应用程序开发说明其通信模型建立思路,着重描述无线传感器网络节点应用程序体系结构和消息通信机制。