嵌入式环境下基于AODV的VANET通信机制研究
2020-08-31杨阳,王桐,崔颖
杨 阳,王 桐,崔 颖
(哈尔滨工程大学 信息与通信工程学院,哈尔滨 150001)
VANETs[1]作为一种新兴技术有着广阔的前景,即使没有中央基站也能实现车辆间通信.其目标是提高交通安全和驾驶满意度、降低事故率.VANETs环境下车辆之间以信息或图像的通信方式共享有关道路危险、与其他车辆的交通事故的信息.AODV-UU-0.9.6是目前最新的一种应用于嵌入式系统的AODV协议源代码,将AODV-UU-0.9.6移植到嵌入式系统上,不仅可以利用嵌入式系统占用内存小、可剪裁等优势,还可以使AODV路由协议脱离模拟仿真应用到现实场景中.要解决这个问题需要设计出适合的无线网络平台.
目前已有很多科研机构以及公司投入到无线传感器网络平台的研究中,设计出很多实用高效的无线传感器网络平台.El等开发一个用于智能电网监控网络实时数据采集的系统,测试结果表明提高了吞吐量和较低的端到端数据传输延迟[2].Kha等搭建了一个MANET测试台在该测试台对其提出的RELIABLE-AODV路由协议进行了测试,与AODV相比RELIABLE-AODV的吞吐量提高了10%,PDR提高了7%[3].加州大学的研究人员搭建了一台无线Mesh网络实验床MeshNet,在实验床中的每一个节点都运行改进的AODV路由协议,改进协议采取新的衡量指标将网络的可靠性作为路由度量[4].周锦阳等人设计出一款嵌入式平台,将AODV路由协议进行修改将其应用于视频传输,其修改的AODV路由协议具有稳定、高效的特性,满足开发者快速稳定的使用需求[5].赵阳使用S3C2410开发板,将AODV路由协议移植到S3C2410嵌入式开发板上,并进行了多跳实验在此基础上提出了AODV路由协议的改进方案并进行验证,仿真结果表明改进后的协议对路由性能有显著的提升[6].大连理工大学设计并搭建了一款实验床ARTS,整个ARTS试验床系统由路由模块、数传模块以及无线网卡模块组成, 通过视频传输实验、网络拓扑图像化实验以及异网融合实验对试验床的性能进行了测试,验证了Ad hoc网络的可行性[7].
1 嵌入式系统网络体系结构
1.1 Linux嵌入式系统网络体系结构
Linux网络体系结构如图1.结构分为两部分组成:用户空间和内核空间.应用层位于整个体系结构的最上端,内核空间主要由五个部分组成,分别是系统调用接口、协议无关接口、网络协议、设备无关接口以及设备驱动[8].
图1 Linux网络体系结构
系统调用接口为应用层的应用程序提供访问内核空间的接口.协议无关接口利用Socket来实现,通过调用Socket中的API函数实现对不同协议的支持[9].网络协议中包含了Linux系统支持的多种协议如TCP、IP协议.设备无关接口的功能是实现设备与其上层设备之间的通信,将不同的硬件设备与协议联系在一起,通过为底层网络设备提供通用函数使其可以对高层协议栈进行操作.设备驱动主要用来管理网络设备的设备驱动.
1.2 Socket通信机制
Socket由美国加州伯克利分校开发,随着TCP/IP网络的不断发展已成为网络通信中常用的的一种技术,Sockets接口是一个源于4.4BSD的C语言API.当使用不同协议时需要使用不同的接口,这样增大了开发的难度,Socket为应用程序与运输层协议提供可以交互的接口通过这个接口实现统一化.将Socket在应用层与运输层之间抽象化,如图2所示,Sockets接口通常用于与UDP和TCP交互,而不是直接与IP交互.通过Socket可以实现将传输层底层的服务提供给应用层.Socket本身是一个TCP/IP协议栈数据结构,由文件描述符在本地引用[10].Socket可以分为流式套接字(SOCK_STREAM)、数据报套接字(SOCK_DGRAM)以及原始套接字(Raw Socket),应用程序代码可以通过Sockets接口与TCP/IP协议实现交互[11].
图2 Socket抽象化
1.3 Netfilter包过滤机制
Netfilter是目前在Linux操作系统中普遍采用的防火墙解决方案,Netfilter是在Linux内核防火墙功能模块中实现的功能模块[12].经过Linux2.4~2.6系列的开发,其安全性已通过广泛考验.Netfilter是一种核心的网络服务,用于扩展底层架构的结构,并且能够根据各种标准过滤数据包.Netfilter可以看作是网络协议栈中的另一个模块,可以操作一系列的网络包“钩子”.钩子是数据包通过该协议栈的遍历中定义良好的点.在每一点上,协议都将使用数据包和钩子调用Netfilter框架.然后,内核模块可以对数据包执行各种操作,再让其通过协议栈.Netfilter框架结构如图3所示.
图3 Netfilter框架结构
每次经过钩子函数处理过后产生一个判决,分别是NF_ACCEPT、NF_DROP、NF_QUEUE、NF_STOLEN或者是NF_REPEAT[13].其各自含义如下:
1)NF_ACCEPT:接收该数据包,进行下一步操作.
2)NF_DROP:丢掉该数据包.
3)NF_QUEUE:将数据包放入队列.
4)NF_STOLEN:不在传送该数据包.
5)NF_REPEAT:重复调用当前钩子函数.
2 Linux系统底层模块开发设计
2.1 Linux系统搭建
Linux系统的搭建过程主要包括:搭建交叉编译环境、Linux内核剪裁、制作目标板文件系统镜像以及目标板的烧写四个步骤,各步骤的简要介绍如下:
1)搭建交叉编译环境
本设计所使用的交叉编译工具链版本是arm-linux-gcc-4.5.1,将该gcc压缩包下载后解压到文件夹中安装即可,安装后修改其环境变量,在修改环境变量后通过arm-linux-gcc-v命令查看gcc安装结果.输入命令后显示如图4,显示结果证明该gcc安装成功.
图4 gcc安装检测结果
2)Linux内核剪裁
内核是Linux系统的核心部分,用户不仅可以按照个人需求对内核进行剪裁,甚至可以将其应用到不同的架构中.本设计采用的Linux内核版本是Linux-3.5版本,该内核可以通过从官网下载得到.将Linux-3.5内核解压到文件夹下打开内核配置界面,内核配置界面如图5所示,在这里可以按照需求对Linux内核进行配置、剪裁,make编译Linux内核最后在/arch/arm/boot文件下得到系统移植所需的zImage文件.
图5 内核配置界面
3)制作目标板文件系统镜像
系统移植需要生成rootfs_qtopia_qt4.img镜像文件,这个镜像内放着linux系统执行的命令文件,工程师制作的程序文件等.本设计采用make_ext4fs工具打包制作目标板文件系统镜像.
4)目标板的烧写
将Superboot4412.bin文件通过SD-Flasher烧写工具写入到SD卡中并进行分区,将编译内核生成的zImage、rootfs_qtopia_qt4.img以及ramdisk-u.img文件新建目录/images/linux中,打开电源移植成功的Linux系统显示如图6所示.
图6 Linux系统移植结果
2.2 无线网卡模块驱动移植
本文选择的是型号为RTL8188CU的一款USB无线网卡,从官网上下载RTL8188CU网卡的驱动程序编译加载到内核中,在终端用make menuconfig命令配置内核,如图7所示,完成USB接口驱动配置好内核后make编译,将新生成的zImage文件拷入SD卡中,插好SD卡后完成烧写重新启动系统.
图7 RT8192CU网卡的驱动加载
将USB无线网卡插入开发板,用lsusb命令查看开发板接入的USB模块,查看到Realtek生产的设备,显示如图8所示,即USB无线网卡移植成功.
图8 USB无线网卡移植测试结果
3 AODV路由协议编译移植
3.1 AODV-UU相关概述
AODV-UU[14]是由瑞典的乌普萨拉大学开发的AODV路由协议,该源代码可在Linux系统的用户空间以及NS-2模拟环境中运行,该协议目前最新版本为AODV-UU-0.9.6.该协议的主要目的是在实验场景下实现AODV路由协议,经过多个版本的更新其功能也在不断更新,AODV-UU利用了Linux内核用户空间的强大功能,并且AODV-UU还支持Netfilter框架以及Socket通信机制,易于代码的调试可移植到其他系统中.
3.2 AODV路由协议实现方案
AODV路由协议在嵌入式系统的实现框架如图9所示,AODV路由协议的实现主要依靠Socket、Netfilter、aodvd模块以及kaodv.ko模块.用户空间的aodvd模块用于实现内核的路由功能,在内核空间中的kaodv.ko模块定义了Netfilter包过滤机制中钩子函数的回调函数.
图9 AODV实现框架
aodvd模块主要负责AODV路由协议中的算法功能,例如路由请求、路由发现、路由维护以及Hello包等功能.kaodv模块主要用来处理经过Netfilter过滤处理后进入网络的数据包.此外kaodv模块还对用户空间发出的指令进行处理,执行更新、删除路由表等操作对内核空间的路由表进行维护.前文介绍过Socket用来为不同的协议提供统一的接口,而Netfilter将来自于网络中的数据包通过5个钩子函数处理后交由kaodv模块进行处理.
本设计采用AODV-UU系列代码作为AODV路由协议在ARM开发板上的移植源代码,将AODV-UU-0.9.6编译生成相应的kaodv.ko以及aodvd模块,将生成的模块在Linux系统运行以实现AODV路由协议.
3.3 AODV路由协议的交叉编译
本设计选择的AODV路由协议代码为AODV-UU-0.9.6,这是目前最新也是最完善的一个Linux系统下的路由协议.此AODV路由协议可以作为用户空间守护进程运行,维护内核中的路由表.Netfilter用于捕获数据包,Socket作为实现通信的接口,其工作原理已经在前面说明.我们需要对Linux内核进行裁剪使其支持Netfilter及Socket功能.
使用make menuconfig命令打开对内核进行配置,添加的选项如表1所示.
表1 Linux内核添加选项
在内核添加好需要的选项后,直接使用make命令编译就可以在/arch/arm/boot文件夹下生成我们需要的zImage文件,到此AODV路由协议移植需要的内核编译完成.
在编译之前需要对AODV-UU-0.9.6代码进行修改.修改后在AODV-UU-0.9.6代码主目录下使用make arm命令进行编译.最终生成所需的aodvd以及kaodv.ko模块.
4 AODV路由协议实际测试及结果
4.1 AODV协议测试整体设计
如图10所示,本设计采用多个Tiny4412开发板以及一台笔记本电脑作为传输节点搭建一个Ad hoc网络,将Tiny4412开发板固定在实验小车上面,每辆实验小车都保持在一定的区域内活动,为网络中的每一个传输节点配置IP地址,其中节点间的IP地址均为同一网段,每个路由节点IP设置如表2所示.网络中每个节点都运行AODV路由协议,实现节点间的多跳传输并对每一个节点的往返时间以及丢包率等性能参数指标进行测试.
图10 AODV路由协议总体测试设计
表2 节点IP配置
4.2 无线网卡测试及其参数配置
无线网络有Ad hoc和Infrastructure两种建网模式,Ad hoc模式又可叫作点对点模式,Infrastructure又可以称作接入点模式.当无线网络中的设备需要其他的设备共享资源时,则需要使用Ad hoc模式,通过无线网卡无需路由器以及任何接入点设备.MANET就是在Ad hoc模式下运行,下面将介绍Ad hoc模式的配置方法.
ifconfig wlan0 up//这里默认USB无线网卡设备名为wlan0
iwconfig wlan0 channel 3//将Ad hoc通道设置为3
iwconfig wlan0 mode ad-hoc//将无线网卡设置为Ad hoc模式
iwconfig wlan0 essid “adhoc”//将热点名称设置为adhoc
ifconfig wlan0 192.168.3.102//将无线网卡IP设置为192.168.3.102
iwconfig
此时无线网卡已经配置为Ad hoc模式,终端显示如图11所示.
图11 Ad hoc模式配置显示
4.3 测试结果及分析
1)连通性测试
按照4.2方法将网络中的节点配置为Ad hoc模式,并设定不同的IP地址.通过insmod命令将kaodv.ko模块加载到内核当中去,并运行aodvd程序.AODV路由协议的运行结果如图12所示.
图12 AODV路由协议运行结果
图12为T1节点运行AODV路由协议结果,当节点T1运行协议后会向目的节点发送RREQ请求寻找路由,并不断发送HELLO包,当发现T2节点时将其作为下一跳节点并将T2节点加入到路由表当中,建立由T1节点到T2节点的路由链路.
2)路由性能检测
我们可以通过ping包的方式对路由协议性能进行测量,ping通过向某一IP地址发送数据包测试该地址是否有相应,并统计相应的往返时间(Round-Trip Time,RTT)以及丢包率性能指标.
当网络节点数为5时,单链的节点跳数N=1、2、3、4,AODV路由协议往返时间以及丢包率的测试结果如图13、14所示.
图13 往返时间测试结果
从图13中可知RTT随跳数增加而增大,主要由于网络节点随避障小车移动网络拓扑不断变化,跳数的增多链路断裂的可能性也会增加,路由链路会出现断裂现象重新启动路由发现造成了延时增大,并且一般完成路由发现的时间要大于数据传输时间,重启路由发现过程将花费大量的时间,因此随着跳数的增多RTT增长也明显.如图14所示,测得的丢包率随跳数增加呈现增大趋势,车辆的移动造成链路断裂以及节点数量的增多是丢包率上升的主要原因.
图14 丢包率测试结果
5 结 语
本文提出了一种AODV路由协议在嵌入式系统上的实现方案,在PC机上完成AODV-UU源代码的交叉编译,实现了AODV路由协议在嵌入式开发板上的运行,对嵌入式开发平台的往返时间、丢包率等性能指标进行了测试,测试结果表明该无线网络平台的时延以及丢包性能指标良好.