1 引言
无线传感器网络WSN(Wireless Sensol Network)是计算机、通信和传感器三项技术相结合的产物,是目前计算机科学领域一个非常活跃的研究分支。2003年2月美国技术*论杂志(《Technology Review》)*出对人类未来生活产生深远影响的十大新技术,无线传感器网络被列为第一。通过无线传感器网络,能够实时地监测、感知和采集其节点部署区的观察者感兴趣的感知对象的各种信息(如温度、湿度、应变、挠度、振动等物理现象),并对这些信息进行处理后以无线的方式发送出去,通过无线网络最终发送给观察者。无线传感器网络在军事侦察、医疗护理、 智能家居、 工业生产控制、 环境监测等领域有着广阔的应用前景。桥梁结构健康监测系统是一个特殊的环境监测系统。
桥梁是交通运输网络的重要组成部分,一旦桥梁出现坍塌, 造成的经济损失和灾害将十分巨大。如加拿大(魁北克,1907 年) 、美国(塔科马海峡,1940 年) 、韩国(汉江圣水,1994年) 、中国的綦江彩虹桥(1999 年)、中国的江苏常州运河大桥[3](2007 年)等。因此, 及时获取桥梁结构状态参数(应变、挠度、振动等),开展状态参数监测及安全*估工作, 对全面分析和了解桥梁工作状态、实现事故预先报警、预防突发性灾难、避免人员伤亡和确保基础设施安全意义非常重大。
2 系统的体系结构
本系统采用同构型体系结构,如图1 所示,它包括传感器节点、网关、互联网和监控中心等。传感器节点主要分布在桥体中,节点具有信息获取、信号处理、路由计算和信息转发的功能。通过网络自组织和多跳路由,将数据向网关发送。网关可以使用多种方式与外部网络通信,如Internet、卫星或移动通信网络等。
图1 传感器网络的体系结构
3 网络节点设计
在不同应用中, 传感器网络节点的组成不尽相同, 但一般都由传感器模块、处理器模块、无线通信模块和能量供应模块四部分组成。对于我们研究的桥梁结构健康监测系统,传感器部分有内模块和外模块之分, 内模块检测温度、湿度等常规状态参数;外模块一般要在建桥过程中一起规划安装。这里我们提出两种传感器外模块方案:光纤传感器埋入式和桥梁钢筋电阻检测式。 光纤传感器埋入式是1989 年美国Brown University 的Mendez 等人首次提出,随后美国、欧洲、日本等国家的一些学者开始将这一高新技术应用于土木工程的研究,并取得了很好的成果。桥梁钢筋电阻检测方案是我们新提出来的,其应用更简单有效。光纤传感器埋入式方案的特点是,光纤传感器耐腐蚀性强、耐久性好,因其体积小、重量轻、结构简单,故埋入土木工程结构后对基体材料特性几乎没有影响。 利用单模和多模光纤传感器可以探测混凝土构件(如梁、板、柱)实体结构的应力、应变、挠度、弯曲、凝结、裂缝、蠕变以及整个结构的位移等参数。桥梁钢筋电阻检测方案的使用条件是要求被测钢筋不短路(用绝缘材料做钢筋箍),通过测试桥梁结构中的关键钢筋阻值变化情况判断桥梁的状态变化。
处理器模块选用Atmel 公司的8 位低功耗AVR 微处理器芯片atmega128L 作为传感器节点的CPU, 负责数据的存储和处理。无线通信模块采用支持IEEE 802.15.4 协议的无线收发芯片CC2420。 CC2420 在硬件上实现了IEEE 802.15.4 的MAC 子层安全操作, 跟处理器之间通过SPI 接口访问。电源部分则采用3 节7 号锂电池供电。[page]
4 TinyOS 的研究与移植
TinyOS 是由UCBerkeley 开发的一种基于组件的开源嵌入式操作系统,其应用领域是无线传感器网络。在传感器网络中, 传感器节点有两个突出的特点: 一是并发性强, 可能存在多个需要同时执行的逻辑控制; 二是节点的模块化程度高。这两个特点给设计面向传感器网络的操作系统提出了新的挑战。针对这些特点, 加州大学伯克利分校开发出了适合无线传感网络的组件化编程语言nesC 和微型操作系统TinyOS, 引入了轻量级线程( lightweight thread) 、主动消息( active message) 、事件驱动( event-driven) 模式、 组件化编程( componentbased programming ) 等技术, 很好地利用了传感器节点的有限资源。目前这个系统被国内外大学和研究机构广泛应用。
4.1 TinyOS 的组件模型
TinyOS 基于组件化编程语言nesC 实现, 将模块化/组件化编程同基于事件驱动的执行联系起来。可以将TinyOS 及在其上运行的应用程序看成是由许多功能独立且相互有联系的软件组件构成, 一个组件提供一些接口。接口中包含命令和事件,命令是接口具有的功能,接口使用者可以通过关键字call 来调用命令; 事件是接口具有事件通告的能力, 可以通过关键字signal 来通知使用者事件发生, 事件在接口使用者的组件中实现。组件又分为模块文件(module)和配线文件(configuration)两种。模块文件具体实现接口中的命令和事件; 配线文件则完成组件之间的接口连接。一般一个应用程序,只能有一个顶层配件。
4.2 TinyOS 的调度机制
TinyOS 的调度机制比较简单, 按照轻量级线程( 即任务) 以FIFO 的方式调度, 线程之间不允许强占; 当有硬件中断到来时,可以打断用户的轻量级线程, 对硬件中断进行快速响应。任务可以调用下层命令, 可以向上层发信号通知事件发生, 也可以在组件内部调度其他任务。任务的原子性, 使得TinyOS 只需要维护一个任务堆栈就可以了。这种方法在资源极其有限的传感器节点中显得十分有效。TinyOS 是事件驱动型的操作系统。当一个任务完成后, 就可以触发一个事件, TinyOS就会自动调用相应的处理函数。因此, CPU 只有在有事件触发时才唤醒处理, 其余时间都可以处于睡眠状态, 从而可以大大降低系统的能耗。
4.3 TinyOS 通信机制
TinyOS 的通信方式采用主动消息模型(AM)。AM是面向消息通信的一种通信模式, 它是基于地址的, 并且支持信息确认和分发。为了在应用层实现更加复杂的通信协议, 需要把主动消息模型实现为TinyOS 的一个基本通信组件, 这样既可以屏蔽下层不同的通信硬件, 也可以为上层提供统一的通信原语, 方便应用开发。当数据通过网络到达传感器节点时, 首先要进行缓存, 然后主动消息的分发(dispatch)层把缓存中的消息交给上层处理。因为nesC不支持动态分配内存, 所以要求每个应用程序在消息被释放以后, 必须能返回一块未用的内存, 来接收下一个将要到来的消息。因此, 主动消息通信组件需要维持一个额外的消息缓存。在TinyOS 中, 每次消息发送后, 接收方都会发送一个同步的确认消息。为了节省开销,在主动消息的最底层生成确认包,并且每次仅仅发送一个随机数序列作为确认。
4.4 TinyOS的移植处理
TinyOS 操作系统的移植主要考虑硬件处理器是否支持对nesC(gcc) 的编译, 以及对TinyOS 中与硬件平台相关部分的处理。我们选用Atmel 公司的AVR 芯片作为微处理器, gcc对AVR 有良好的支持, 因此不需要做nesC 从GCC 里的解耦。TinyOS 有三层硬件抽象结构(HAA) , 分别为硬件描述层(HPL) 、硬件改编层(HAL) 和硬件接口层(HIL) 。分层结构和组件化描述提高了可移植性, 并简化了应用层软件的开发。越底层的跟硬件越相关, 上层的组件调用下层提供的接口。HPL层主要是对硬件资源的描述, 通过内存或I/O 映射端口与硬件建立通讯。它隐藏了硬件的复杂性, 为上层提供显示硬件能力的接口; HAL则是在HPL基础上对硬件特定功能的封装, 是与硬件相关的功能函数接口; HIL则是与硬件无关的功能函数接口。
据上分析,移植时, 只需要根据我们硬件平台的资源修改HPL和HAL开头的文件即可, 在HPL文件中加入硬件资源的描述, 在HAL文件中修改硬件资源的功能函数。
5 网络通信协议
目前, 通信协议特别是链路层的MAC协议和网络层的路由协议是传感网络研究的热点。针对不同的应用, 研究人员提出了不同的MAC 协议和路由协议, 这些协议各有长处。本系统在网络层采用CTP(Collection Tree Protocol) 路由协议, 链路层则采用LEEP( Link Es timate ExchangeProtocol)协议来计算双向链路质量, 以给上层的路由选择提供基础。通讯协议抽象层结构如图2。
图2 系统通讯协议层结构
[page]
5.1 CTP协议的实现
CTP协议是基于树的多跳协议。把网络中的节点抽象为树,每棵树有一个根节点, 负责收集这棵树所有节点的信息。网络中节点通过路由梯度值(ETX)逐跳地选择路由, 直至到达根节点。根节点的ETX为0, 每个子节点的ETX值等于父节点的ETX值加上该节点到它父节点的路径ETX值。因此, ETX值是沿着往根节点的方向递减的, CTP选择路径ETX值最小的路径作为路由。
CTP的实现是基于下层链路估计结果的。链路估计会维护一个邻节点表, 表中存储了每个邻节点的路径ETX 值。CTP协议中的CtpRoutingEngine 组件实现了路由的选择, 它根据邻节点的ETX值为数据传输选择下一个路由。另一个关键的组件函数CtpForwardingEngine, 该组件主要是维护一个消息发送队列, 往下层发送本地产生的或者转发过来的数据包; 该组件还能够检测重复发送的数据包, 以抑制重复发包。
实现的四个关键函数是: 数据包接收(SubReceive.receive())、数据包转发(forward())、包传输(sendTask())和发送完成事件(SubSend.sendDone())。
函数SubReceive.receive ()决定是否要转发包。通过维护一个最近收到的包缓存来检查是否有重复包。如果判定一个包不是重复包, 则调用forward()函数。
forward()函数封装好要发送的包。这个函数同时检查是否有回环。发送时将包放到发送队列中去, 若队列满了, 就丢弃该包, 并把C位置1。如果队列为空, 则立即post 发送任务。
sendTask()检查发送队列头部的数据包, 封装好后提交给AM层。发送完成后, sendDone()函数检查发送的结果。如果该数据包已经被确认过了, 则将该包从队列中取出。如果是本地的包, 发送事件通知给上层的客户。如果是转发来的包, 则将它放到转发消息池中。如果队列中还有包的话, 就启动一个随机时钟, 重新post发送任务。
5.2 LEEP协议的实现
LEEP 是一种链路估计交换协议, 主要是用来计算某节点与邻节点之间的双向链路质量。节点A→B的链路质量是指B成功接收到A发送的数据包的概率。节点(A, B)间的双向链路质量是A→B的链路质量(in-bound 链路质量)与B→A的链路质量(out-bound 链路质量) 的乘积。
6 结束语
基于无线传感器网络的桥梁结构健康监测系统,我们对传感器节点的设计和支持系统运行的嵌入式操作系统TinyOS的移植问题进行了研究。还有两个问题需要进一步深入研究,一个是传感器网络的休眠节能技术需要解决网络各节点的同步问题;第二个问题是建立桥梁结构健康*估专家系统,能够根据传感器网络汇总的大量桥梁结构信息作出准确的分析判断,从而实现事故预报警,预防突发性灾难,确保桥梁安全。
上一篇:利用I2C总线实现ATmega88的在应用编程
下一篇:基于AVR单片机帆板控制系统的设计
推荐阅读最新更新时间:2024-03-16 13:15