邱璐璐
(南京邮电大学通信与信息工程学院,江苏 南京 210003)
0 引言
无线传感器网络是由部署在监测区域内的大量廉价微型传感器节点,通过无线通信方式组成一个多跳的自组织的网络系统,其目的是协同感知、采集和处理网络覆盖区域中感知对象的信息,并发送给观测者。无线传感器网络技术研究涉及到多个热点学科的前沿领域,比如传感器技术、现代网络技术、嵌入式计算机技术、无线通信技术等。由于无线传感器网络在工业监测、环境检测、医疗监护、军事侦察等众多的领域都有着广阔的应用前景,因而引起了世界各国工业界,学术界和军事部门的重视,并且迅速成为当今世界研究的热点之一。
1 无线传感器网络的主要特点
传感器网络节点硬件一般都由数据采集、数据处理、数据收发和电源等四个单元组成。数据采集单元通过传感器采集外界数据并将其转化为数字信号;数据处理单元是节点的核心模块,负责协调节点各部分的工作,如对数据采集单元采集的数据进行必要的处理和保存,以及数据收发单元工作模式的设置等;数据收发单元负责数据的无线传输以及与数据处理单元的数据交互。上述四大基本模块与相应的操作系统、协议栈和应用程序共同构成一个基本的无线传感器网络节点,众多的网络节点分布在一起,就可以完成无线传感网络的基本功能。
在软件设计方面,本系统以专用嵌入式实时操作系统为依托,来管理、协调传感器节点各硬件部分的工作。上层应用以及各层的通信协议都以节能为中心,必要时可以牺牲其他的一些网络性能指标来获得更高的电源效率。图1所示是一个传感器网络节点的基本组成。
传统的无线网络设计基本上都是为了同时满足人们各种各样的需要,如语音、视频、图像等。而无线传感器网络一般是为了某个特定的需要而设计的,它是一种基于应用的无线网络,与移动通信网、无线局域网、Bluetooth相比,无线传感器网络具有以下主要特点:
(1)电源能量有限:无线网络中,每个节点的电源都是有限的,网络大多工作在无人区或者对人体有伤害的恶劣环境中,一般更换电源几乎都是很困难的事。
(2)计算能力有限:传感器网络节点都采用具有嵌入式特性的处理器,但嵌入式处理器的处理能力,使传感器节点的计算能力比较有限。
(3)无线传感器网络节点数量大,分布范围广,网络中的传感器节点十分密集,数量巨大,有时可能达到几百,几千,甚至更多。
(4)动态性拓扑:传感器网络的拓扑结构可能因为环境或节点电能耗尽等因素而改变,这就要求传感器网络系统能够适应这种变化。
2 TinyOS操作系统
由于无线传感器网络节点的资源十分有限,传统的嵌入式操作系统难以正常有效地运行和工作,特别对能量和内存的需求矛盾比较突出。因此,需要一种全新的嵌入式操作系统来满足无线传感器节点的基本需求。TinyOS操作系统就是美国加州大学伯克利分校的研究人员针对无线传感器网络设计的开源嵌入式操作系统。TinyOS操作系统主要使用了轻量级线程、主动消息通信、事件驱动模式、组件化编程等技术。
TinyOS操作系统最初使用汇编和C语言。但经研究人员进一步的研究及使用后发现,C语言并不能有效和方便地支持无线传感器网络应用程序的开发。因而在经过仔细研究和设计,并在对C语言进行了一定扩展的基础上,提出了支持组件化编程的nesC语言,该语言可以把组件化、模块化思想和基于事件驱动的执行模型结合起来。由于TinyOS操作系统和基于TinyOS操作系统的应用程序全部使用nesC语言编写,因此,在介绍TinyOS操作系统之前,首先介绍一下nesC语言。
3 nesC语言
TinyOS和在其上运行的应用程序可以看成是一个大的“执行程序”,它由许多功能独立且相互有联系的软件组件构成,图2所示是nesC语言的一般程序框架。该系统中的一个组件一般会提供一些接口(假定组件名为ComA),接口可以被认为是这个软件组件实现的一组函数的声明,是单独定义的一组命令和事件,其他组件通过引用相同接口声明来使用这个组件(ComA)的函数,从而实现组件间功能的相互调用,即组件的接口是实现组件间互连的通道。但若组件中实现的函数并未被它在接口中说明,就不能被其他组件所使用。nesC语言的定义中存在两种不同功能的组件:其中组件接口中的函数功能专门在模块的组件文件中实现,而不同组件之间的关系则是专门通过称为配件的组件文件来描述的。
本系统中的接口一般指一系列声明的有名函数的集合,同时,接口也是连接不同组件的纽带。组件的接口通常是双向的,这种接口实际上是提供者组件和使用者组件之间的一个多功能交互通道。接口的提供者所实现的接口的一组功能函数称为命令;接口的使用者需要实现的一组功能函数称为事件。
组件是nesC程序的基本单元,组件可分为模块与配件两种。
其中模块是组件的逻辑功能实体,主要包括命令、事件、任务的具体实现。在TinyOS中,命令都是非阻塞的,它们完成后会通知相关的事件调用。一般情况下,命令调用都是向下的,即应用组件调用那些与硬件紧密结合的组件,事件调用则正好相反。一些特殊的基本事件的调用必须绑定在硬件中断上。nesC语言中还有一类特殊的函数称为任务。在TinyOS系统中,任务是一个可以被调度的实体,类似于传统操作系统中的进程或线程概念。
配件通常可通过一系列其他组件来实现一个组件规范,它主要实现组件间的相互访问方式。配件包括组件列表和连接说明,组件列表定义了实现配件的组件,连接通常可将定义的元素(接口、命令、事件等)联系在一起,以完成组件之间功能的调用。
4 TinyOS系统的工作原理
为了适应无线传感器网络的特点,TinyOS操作系统使用了四个主要技术,组件化编程、轻量级线程、主动消息通信和事件驱动模型。
4.1 组件模型
TinyOS操作系统中的组件有四个相互关联的部分:一组命令处理程序句柄、一组事件处理程序句柄、一个经过封装的私有数据帧和一组简单的任务。任务、命令和事件处理程序在私有数据帧的上下文中执行并切换帧的状态。
TinyOS操作系统中的组件通常分为硬件抽象组件、合成组件、高层次的软件组件三类。其中硬件抽象组件用于将物理硬件映射成为TinyOS操作系统中的组件,无线发送模块是这种组件的代表,它可提供命令以操纵与射频收发器相连的各个单独的I/O引脚,并且发信号给事件以将数据位的发送和接收通知其他组件,图3所示是天线传感器应用程序的组件结构:合成组件可以模拟高级硬件的行为,这种组件的一个例子是图3中的Radio Byte组件,它以字节为单位与上层组件交互,并以位为单位与下层无线发送模块组件交互,最后将无线接口映射到UART设备接口上;高层次的软件组件可完成控制、路由以及数据传输等功能,图3中的主动消息处理模块是这种组件的代表,它可履行在传输前填充包缓存区以及将收到的消息分发给相应的任务的功能。
4.2 轻量级线程
在TinyOS操作系统中,一般的轻量级线程task(即TinyOS操作系统中的任务)可按照FIFO方式进行调度,轻量级线程之间不允许抢占。任务一旦执行,就必须执行完毕,不能被其他任务中断。而硬件处理线程(即中断处理线程)则可以打断用户的轻量级线程和低优先级的中断处理线程,故可对硬件中断快速响应。
4.3 主动消息通信
主动消息通信是一个面向消息通信的高性能通信模型。在无线传感器网络中采用主动消息机制的主要目的是使无线传感器节点的计算能力和通信重叠。为使主动消息更适用于无线传感器网络的需求,主动消息提供了三个最基本的通信机制,其一是带确认的消息传递,其二是有明确的消息地址,其三是消息分发。在TinyOS操作系统中,主动消息通信被视为一个系统组件,它屏蔽了下层各种不同的通信硬件,从而为上层提供了一致的通信原语,可方便开发人员实现各种功能的高层通信组件。
在TinyOS的主动通信中,当数据到达传感器节点时,首先进行缓存,然后由主动消息把缓存中的数据分发到上层应用。TinyOS操作系统不支持动态内存分配,所以要求每个应用程序在其所需的消息被释放后,要能够返回一块未使用的消息缓存,以用于接收下一个将要来到的消息。因为在TinyOS操作系统中,各个应用程序之间的执行是不能抢占的,所以不会出现多个未使用的消息缓存发生冲突,因此,TinyOS操作系统的主动消息通信组件只需要维持一个额外的消息缓存以用于接收下一个消息。如果一个应用程序需要同时存储多个消息,则需要在其私有数据帧上静态分配额外的空间以保存消息。
一般情况下,由于TinyOS操作系统中只提供best-effort消息传递机制.所以需要接收方提供确认反馈信息给发送方,以确定发送是否成功。确认消息可由主动消息通信组件生成,这样比在应用层生成确认消息包更能节省开销,而且反馈时间短。
4.4 事件驱动模型
TinyOS操作系统是事件驱动的操作系统,故当一个任务完成后,就可以使其触发一个事件,然后由TinyOS操作系统自动调用相应的处理函数。事件驱动分为硬件事件驱动和软件事件驱动。硬件事件驱动也就是一个硬件发出中断,然后进入中断处理函数;而软件驱动则是通过signal关键字来触发一个事件。
5 结束语
尽管TinyOS已被广泛使用,而且也得到了相当的认可,但这并不意味着TinyOS能够适用于WSN的所有应用场景。事实上,在某些场合下,TinyOS并不能很好的工作,它也存在不足的地方,比如可能出现过载、导致任务丢失、通信吞吐量下降等。无线传感器网络节点的三个典型任务一般是传感器采集、本地数据发送和作为中继节点转发数据包。当本地任务发生频率过高时,任务队列很快就满了,这时发送或接收任务就可能丢失,从而导致数据包丢失;另外,如果本地任务运行时间过长,则发送或接收数据包的任务也要等待较长时间才能得到处理,这样,会降低通信速率。因此TinyOS的调度策略可能导致问题的出现。而FIFO的调度机制也可能引起一些重要的任务得不到实时响应的问题。对于这些问题的解决,将在以后的文章中进行讨论。