1. 引言
随着科学技术的发展,物联网逐渐发展起来,而无线传感器网络作为物联网的关键技术,具有广阔的应用前景和巨大的商业应用价值。无线传感器网络是一种分布式传感网络 [1],已在多个领域如智能交通 [2]、环境监测 [3] 等领域得到应用。在有的无线传感器网络中,节点的能量由电池提供,系统需要根据用户的需要,由较多的传感器节点相互合作才能完成,这些传感器节点之间必定会进行数据传输,这些传输将会消耗较多的能量。无线传感器网络具有动态、低速、低能耗、硬件资源受限、无人值守等特点,通过对参与节点进行可信度评估并进行后续处理,可以显著提高网络的鲁棒性和可靠性,而评估可信度的前提就是对WSN中数据包的溯源路径进行重建。传统的方法是基于WSN节点自身,通过分组路径中各节点将自身NODE ID叠加到所转发的分组中,最后在基站(Base Station, BS)进行解码,最终恢复出原始路径。然而,在分组转发过程中消耗的能量远远大于数据处理过程中消耗的能量,因此,随着路径的增长,传统溯源方式会导致转发的分组中数据过载,从而过度消耗节点能量,这对于资源受限的WSN环境是不能接受的,因此,如何减少能量的消耗对于无线传感网的设计尤为重要。
近年来,针对WSN中的溯源问题,各国学者纷纷展开研究,并且都提出了一些解决方案。由于受到节点能量、传输带宽、存储空间以及环境变化等因素的影响,不同方法的性能表现出很大的差异。毛健 [4] 等人提出了一种基于生成树的溯源数据压缩方法,其基本思想是在字典中存放WSN拓扑图的生成树并对其建立索引,在数据包传输过程中传输的是生成树的索引而不是完整的生成树。在大规模稀疏WSN中采用该方法,溯源数据在文件大小和传输能耗等方面都优于已知的其它溯源数据编码技术。徐芹宝 [5] 等人提出一种基于路径索引差分的溯源编码方法,进一步提高了溯源的平均压缩比,不仅可以有效克服已知的溯源编码方法对网络拓扑结构变化敏感的问题,而且可以实现更高的溯源平均压缩比。Sy Denh等提出了一种叫做CAPTRA (Coordin Ated Packet TR Aceback)的方法 [6],CAPTRA利用节点发送分组信息时的广播特性,将分组信息分散存储在附近的监听节点中。当需要取回信息时,转发节点和监听节点交换信息,最终就能构造出整条路径。
为了尽可能降低节点的能量消耗,本文提出了基于嗅探进行溯源的方式,在基于CTP协议 [7] 的多跳网络中部署嗅探节点,根据嗅探节点接收到的信息得到路径信息,从而实现溯源,有效减少了节点中能量的消耗。
2. CTP协议
CTP是一种基于树状结构的汇聚协议 [8],网络中的一些节点设为根节点,其余节点根据路由梯度选择父节点作为下一跳,隐式地选择根节点,最终形成到根节点的路由。基于TinyOS的CTP协议总体框架,如图1所示,包含三部分:链路估计器、路由引擎和转发引擎。位于底层的链路估计器用于估计节点与邻居节点之间的链路质量并维护邻居表,CTP中使用ETX (Expected number of Transmission)来表示链路质量的估计值,ETX越小,则链路质量越好。路由引擎则根据链路估计器的信息选择父节点并维护路由表路由引擎的操作,有两个主要任务和一个主要事件:updateRouteTask被定期调用并选择一个新的父对象,sendBeaconTask将当前路由信息广播到邻居,主要事件是接收邻居的信标,该信标将更新邻居表。链路估计器和路由引擎之间可以通过接口LinkEstimator和CompareBit交流,其中,LinkEstimator.getQuality()的返回值越小,则通信链路质量越好。转发引擎、维护转发队列并选择队头的包转发给父节点,并在发生错误时进行重传。转发引擎对其传输包进行计时。它区分四种传输情况:转发、成功、确认失败和环路检测。在每种情况下,转发引擎在发送下一个数据包之前都要等待一段随机的时间。其目标是防止相关流量(例如,路由转发数据包中的节点)干扰自身。
3. 系统设计
3.1. 系统软件设计
3.1.1. 基于CTP协议实现多跳转发
本次设计中多跳网络部署是基于CTP协议的,因此,首先需要在“multihopsend”文件夹下的“Makefile”中编写代码:
COMPONENT=multihopsendAppC
CFLAGS += -I$(TOSDIR)/lib/net/ -I$(TOSDIR)/lib/net/ctp-I$(TOSDIR)/lib/net/4bitle
include $(MAKERULES)
然后分别在“multihopsendAppC.nc”和“multihopsendC.nc”中添加组件和接口,最后在“multihopsendC.nc”中添加实现多跳转发的主组件。基于CTP的多跳转发实现流程可用图2表示,调用RadioControl.startDone()后进行判断,若节点的ID为1,则调用RootControl.setRoot()将该节点设置为根节点,只能由根节点从Receive接口接收消息;若节点ID不是1,说明不是根节点,则需要继续转发。

Figure 2. Multi-hop forwarding flow chart
图2. 多跳转发流程图
3.1.2. 实现嗅探功能
实现嗅探功能的程序位于TinyOS2.1/apps/BaseStation中,BaseStation是充当简单活动消息的应用程序串行和无线电链路之间的桥梁。它取代了GenericBaseTinyOS1.0和TinyOS1.1的TOSBase。在串行连接上,BaseStation发送和接收简单活动消息(不是特定的无线电数据包);在无线电链路上,它发送无线电活动消息。BaseStation会将其已编译的组ID复制到消息中从串行连接移动到无线电,并会过滤掉传入的不包含该组ID的无线电消息。BaseStation包括双向队列,并确保一条消息进入队列后,它将最终留在另一条消息上。队列使BaseStation可以更多地处理负载峰值。仅当该消息成功入队以传递到无线链路后,BaseStation才确认该消息通过串行链路到达。首先,需要在“Makefile”中进行预设置:CFLAGS += -DCC2420_NO_ACKNOWLEDGEMENTS;CFLAGS += -DCC2420_NO_ADDRESS_RECOGNITION;即允许基站嗅探来自任何发射机的数据包并防止基站错误地确认数据包。然后在对应文件中添加实现嗅探功能并通过串口转发的主组件,实现流程可用图3表示。

Figure 3. Flow chart of sniffing implementation
图3. 嗅探实现流程图
3.2. 系统硬件设计
首先,进行基于CTP协议的多跳转发部署:将汇聚节点与mib520编程器相连后插入PC机,打开各节点的开关,打开串口助手接收数据。
然后,进行嗅探节点设计,由于本次设计中是要实现消息从无线电桥接到串行,因此,需要将嗅探节点与mib520编程器连接后插入PC机,打开各节点的开关,打开串口助手接收数据。
将编程器通过USB插入PC机时,由于mib520编程器能够将USB虚拟为串口,因此,PC机成功识别到该USB接口后,应该能够在设备管理器的端口和通用串行总线控制器中分别看到USB Serial Port (COM4和COM5)、USB Serial Converter A和B。
4. 实验结果
4.1. 实验设置
如图4所示,利用指令下载对应程序到节点,其中Micaz为本次设计所用的节点,mib510为编程板,本次设计所用的编程板为mib520,这里写mib510即可,因为mib520引用了mib510的设置,如下:
#$Id: mib520.extra,v 1.1 2008-04-23 20:31:58 sallai Exp $
# The MIB520 uses the same protocol as the MIB510, so we
# just include mib510.extra
MIB510 = $(MIB520)
include $(TINYOS_MAKE_PATH)/avr/mib510.extra
在ubuntu中dev文件夹下存储了设备文件,包括计算机的所有外部设备,其中dev/ttyUSB0为USB转串口终端,接USB转串口线可以使用该端口设备。

Figure 4. Schematic diagram of code download
图4. 代码下载示意图
本次设计中使用的是mib520编程器,提供的是USB接口,该编程板能够实现将USB接口虚拟为串口。下载程序时会提示无法找到dev/ttyUSB0,因此需要进行USB转串口操作,转换步骤如下。
首先,利用sudo apt-get install minicom命令安装minicom,并利用sudo apt-get install lrzsz命令安装lrzsz软件包。安装完成后配置minicom。
如图5所示,运行sudo minicom-s,然后,选择Serial port setup。
如图6所示,选择A将Serial Device修改为:/dev/ttyUSB0;保存后退出。
如图7所示,首先,进入minicom菜单,然后,进入配置文件所在目录,选择“Filenames and paths”,然后分别选择A,B修改Download directory和Upload directory为:mib510 -->PC和PC -->mib510。

Figure 7. USB and serial port conversion
图7. USB与串口转换
4.2. 实验结果和分析
如图8所示,当嗅探节点接收到数据并成功调用串口发送向PC机发送数据后,绿灯会切换亮灭。

Figure 8. Node successfully sniffed data
图8. 节点成功嗅探到数据
同时,在串口助手选择COM5串口,波特率为57600,选择hex显示、加时间戳和分包显示。
串口助手接收到的嗅探数据如图9所示,0x(93)为组件SerialAMSenderC的参数,这里同样结点msg->ID的类型定义为nx_uint16_t;嗅探节点能够嗅探每个节点的数据包,路径中每增加一个节点,嗅探节点能够嗅探到该节点发送的ID号,并将嗅探到的数据入队列后通过串口发送收到PC机,通过观察即可得出路径信息。其中,ID为0x22的节点为发送数据包的节点,ID为0x03的节点为转发节点,ID为0x02的节点为嗅探节点。图9中红色框中数据即为嗅探到的路径信息。
5. 结束语
本次设计首先实现了基于CTP协议的多跳转发,为了方便观察收发的数据,在汇聚节点上增加转发数据包到PC机的程序;在此基础上实现了嗅探节点,可嗅探到其他节点的ID号,并通过串口发送到PC机,通过PC机上的串口助手进行接收后就可以观察数据包转发路径。这样一来,网络中每增加一个节点,嗅探节点都可以嗅探到对应的ID,而不需要每增加一个节点就需要将ID封装到数据包中。随着网络规模的增加,通过嗅探方式实现溯源的方法能够充分发挥节省能量消耗的作用。