楊 陽,王 桐,崔 穎
(哈爾濱工程大學(xué) 信息與通信工程學(xué)院,哈爾濱 150001)
VANETs[1]作為一種新興技術(shù)有著廣闊的前景,即使沒有中央基站也能實(shí)現(xiàn)車輛間通信.其目標(biāo)是提高交通安全和駕駛滿意度、降低事故率.VANETs環(huán)境下車輛之間以信息或圖像的通信方式共享有關(guān)道路危險(xiǎn)、與其他車輛的交通事故的信息.AODV-UU-0.9.6是目前最新的一種應(yīng)用于嵌入式系統(tǒng)的AODV協(xié)議源代碼,將AODV-UU-0.9.6移植到嵌入式系統(tǒng)上,不僅可以利用嵌入式系統(tǒng)占用內(nèi)存小、可剪裁等優(yōu)勢(shì),還可以使AODV路由協(xié)議脫離模擬仿真應(yīng)用到現(xiàn)實(shí)場(chǎng)景中.要解決這個(gè)問題需要設(shè)計(jì)出適合的無線網(wǎng)絡(luò)平臺(tái).
目前已有很多科研機(jī)構(gòu)以及公司投入到無線傳感器網(wǎng)絡(luò)平臺(tái)的研究中,設(shè)計(jì)出很多實(shí)用高效的無線傳感器網(wǎng)絡(luò)平臺(tái).El等開發(fā)一個(gè)用于智能電網(wǎng)監(jiān)控網(wǎng)絡(luò)實(shí)時(shí)數(shù)據(jù)采集的系統(tǒng),測(cè)試結(jié)果表明提高了吞吐量和較低的端到端數(shù)據(jù)傳輸延遲[2].Kha等搭建了一個(gè)MANET測(cè)試臺(tái)在該測(cè)試臺(tái)對(duì)其提出的RELIABLE-AODV路由協(xié)議進(jìn)行了測(cè)試,與AODV相比RELIABLE-AODV的吞吐量提高了10%,PDR提高了7%[3].加州大學(xué)的研究人員搭建了一臺(tái)無線Mesh網(wǎng)絡(luò)實(shí)驗(yàn)床MeshNet,在實(shí)驗(yàn)床中的每一個(gè)節(jié)點(diǎn)都運(yùn)行改進(jìn)的AODV路由協(xié)議,改進(jìn)協(xié)議采取新的衡量指標(biāo)將網(wǎng)絡(luò)的可靠性作為路由度量[4].周錦陽等人設(shè)計(jì)出一款嵌入式平臺(tái),將AODV路由協(xié)議進(jìn)行修改將其應(yīng)用于視頻傳輸,其修改的AODV路由協(xié)議具有穩(wěn)定、高效的特性,滿足開發(fā)者快速穩(wěn)定的使用需求[5].趙陽使用S3C2410開發(fā)板,將AODV路由協(xié)議移植到S3C2410嵌入式開發(fā)板上,并進(jìn)行了多跳實(shí)驗(yàn)在此基礎(chǔ)上提出了AODV路由協(xié)議的改進(jìn)方案并進(jìn)行驗(yàn)證,仿真結(jié)果表明改進(jìn)后的協(xié)議對(duì)路由性能有顯著的提升[6].大連理工大學(xué)設(shè)計(jì)并搭建了一款實(shí)驗(yàn)床ARTS,整個(gè)ARTS試驗(yàn)床系統(tǒng)由路由模塊、數(shù)傳模塊以及無線網(wǎng)卡模塊組成, 通過視頻傳輸實(shí)驗(yàn)、網(wǎng)絡(luò)拓?fù)鋱D像化實(shí)驗(yàn)以及異網(wǎng)融合實(shí)驗(yàn)對(duì)試驗(yàn)床的性能進(jìn)行了測(cè)試,驗(yàn)證了Ad hoc網(wǎng)絡(luò)的可行性[7].
Linux網(wǎng)絡(luò)體系結(jié)構(gòu)如圖1.結(jié)構(gòu)分為兩部分組成:用戶空間和內(nèi)核空間.應(yīng)用層位于整個(gè)體系結(jié)構(gòu)的最上端,內(nèi)核空間主要由五個(gè)部分組成,分別是系統(tǒng)調(diào)用接口、協(xié)議無關(guān)接口、網(wǎng)絡(luò)協(xié)議、設(shè)備無關(guān)接口以及設(shè)備驅(qū)動(dòng)[8].
圖1 Linux網(wǎng)絡(luò)體系結(jié)構(gòu)
系統(tǒng)調(diào)用接口為應(yīng)用層的應(yīng)用程序提供訪問內(nèi)核空間的接口.協(xié)議無關(guān)接口利用Socket來實(shí)現(xiàn),通過調(diào)用Socket中的API函數(shù)實(shí)現(xiàn)對(duì)不同協(xié)議的支持[9].網(wǎng)絡(luò)協(xié)議中包含了Linux系統(tǒng)支持的多種協(xié)議如TCP、IP協(xié)議.設(shè)備無關(guān)接口的功能是實(shí)現(xiàn)設(shè)備與其上層設(shè)備之間的通信,將不同的硬件設(shè)備與協(xié)議聯(lián)系在一起,通過為底層網(wǎng)絡(luò)設(shè)備提供通用函數(shù)使其可以對(duì)高層協(xié)議棧進(jìn)行操作.設(shè)備驅(qū)動(dòng)主要用來管理網(wǎng)絡(luò)設(shè)備的設(shè)備驅(qū)動(dòng).
Socket由美國(guó)加州伯克利分校開發(fā),隨著TCP/IP網(wǎng)絡(luò)的不斷發(fā)展已成為網(wǎng)絡(luò)通信中常用的的一種技術(shù),Sockets接口是一個(gè)源于4.4BSD的C語言API.當(dāng)使用不同協(xié)議時(shí)需要使用不同的接口,這樣增大了開發(fā)的難度,Socket為應(yīng)用程序與運(yùn)輸層協(xié)議提供可以交互的接口通過這個(gè)接口實(shí)現(xiàn)統(tǒng)一化.將Socket在應(yīng)用層與運(yùn)輸層之間抽象化,如圖2所示,Sockets接口通常用于與UDP和TCP交互,而不是直接與IP交互.通過Socket可以實(shí)現(xiàn)將傳輸層底層的服務(wù)提供給應(yīng)用層.Socket本身是一個(gè)TCP/IP協(xié)議棧數(shù)據(jù)結(jié)構(gòu),由文件描述符在本地引用[10].Socket可以分為流式套接字(SOCK_STREAM)、數(shù)據(jù)報(bào)套接字(SOCK_DGRAM)以及原始套接字(Raw Socket),應(yīng)用程序代碼可以通過Sockets接口與TCP/IP協(xié)議實(shí)現(xiàn)交互[11].
圖2 Socket抽象化
Netfilter是目前在Linux操作系統(tǒng)中普遍采用的防火墻解決方案,Netfilter是在Linux內(nèi)核防火墻功能模塊中實(shí)現(xiàn)的功能模塊[12].經(jīng)過Linux2.4~2.6系列的開發(fā),其安全性已通過廣泛考驗(yàn).Netfilter是一種核心的網(wǎng)絡(luò)服務(wù),用于擴(kuò)展底層架構(gòu)的結(jié)構(gòu),并且能夠根據(jù)各種標(biāo)準(zhǔn)過濾數(shù)據(jù)包.Netfilter可以看作是網(wǎng)絡(luò)協(xié)議棧中的另一個(gè)模塊,可以操作一系列的網(wǎng)絡(luò)包“鉤子”.鉤子是數(shù)據(jù)包通過該協(xié)議棧的遍歷中定義良好的點(diǎn).在每一點(diǎn)上,協(xié)議都將使用數(shù)據(jù)包和鉤子調(diào)用Netfilter框架.然后,內(nèi)核模塊可以對(duì)數(shù)據(jù)包執(zhí)行各種操作,再讓其通過協(xié)議棧.Netfilter框架結(jié)構(gòu)如圖3所示.
圖3 Netfilter框架結(jié)構(gòu)
每次經(jīng)過鉤子函數(shù)處理過后產(chǎn)生一個(gè)判決,分別是NF_ACCEPT、NF_DROP、NF_QUEUE、NF_STOLEN或者是NF_REPEAT[13].其各自含義如下:
1)NF_ACCEPT:接收該數(shù)據(jù)包,進(jìn)行下一步操作.
2)NF_DROP:丟掉該數(shù)據(jù)包.
3)NF_QUEUE:將數(shù)據(jù)包放入隊(duì)列.
4)NF_STOLEN:不在傳送該數(shù)據(jù)包.
5)NF_REPEAT:重復(fù)調(diào)用當(dāng)前鉤子函數(shù).
Linux系統(tǒng)的搭建過程主要包括:搭建交叉編譯環(huán)境、Linux內(nèi)核剪裁、制作目標(biāo)板文件系統(tǒng)鏡像以及目標(biāo)板的燒寫四個(gè)步驟,各步驟的簡(jiǎn)要介紹如下:
1)搭建交叉編譯環(huán)境
本設(shè)計(jì)所使用的交叉編譯工具鏈版本是arm-linux-gcc-4.5.1,將該gcc壓縮包下載后解壓到文件夾中安裝即可,安裝后修改其環(huán)境變量,在修改環(huán)境變量后通過arm-linux-gcc-v命令查看gcc安裝結(jié)果.輸入命令后顯示如圖4,顯示結(jié)果證明該gcc安裝成功.
圖4 gcc安裝檢測(cè)結(jié)果
2)Linux內(nèi)核剪裁
內(nèi)核是Linux系統(tǒng)的核心部分,用戶不僅可以按照個(gè)人需求對(duì)內(nèi)核進(jìn)行剪裁,甚至可以將其應(yīng)用到不同的架構(gòu)中.本設(shè)計(jì)采用的Linux內(nèi)核版本是Linux-3.5版本,該內(nèi)核可以通過從官網(wǎng)下載得到.將Linux-3.5內(nèi)核解壓到文件夾下打開內(nèi)核配置界面,內(nèi)核配置界面如圖5所示,在這里可以按照需求對(duì)Linux內(nèi)核進(jìn)行配置、剪裁,make編譯Linux內(nèi)核最后在/arch/arm/boot文件下得到系統(tǒng)移植所需的zImage文件.
圖5 內(nèi)核配置界面
3)制作目標(biāo)板文件系統(tǒng)鏡像
系統(tǒng)移植需要生成rootfs_qtopia_qt4.img鏡像文件,這個(gè)鏡像內(nèi)放著linux系統(tǒng)執(zhí)行的命令文件,工程師制作的程序文件等.本設(shè)計(jì)采用make_ext4fs工具打包制作目標(biāo)板文件系統(tǒng)鏡像.
4)目標(biāo)板的燒寫
將Superboot4412.bin文件通過SD-Flasher燒寫工具寫入到SD卡中并進(jìn)行分區(qū),將編譯內(nèi)核生成的zImage、rootfs_qtopia_qt4.img以及ramdisk-u.img文件新建目錄/images/linux中,打開電源移植成功的Linux系統(tǒng)顯示如圖6所示.
圖6 Linux系統(tǒng)移植結(jié)果
本文選擇的是型號(hào)為RTL8188CU的一款USB無線網(wǎng)卡,從官網(wǎng)上下載RTL8188CU網(wǎng)卡的驅(qū)動(dòng)程序編譯加載到內(nèi)核中,在終端用make menuconfig命令配置內(nèi)核,如圖7所示,完成USB接口驅(qū)動(dòng)配置好內(nèi)核后make編譯,將新生成的zImage文件拷入SD卡中,插好SD卡后完成燒寫重新啟動(dòng)系統(tǒng).
圖7 RT8192CU網(wǎng)卡的驅(qū)動(dòng)加載
將USB無線網(wǎng)卡插入開發(fā)板,用lsusb命令查看開發(fā)板接入的USB模塊,查看到Realtek生產(chǎn)的設(shè)備,顯示如圖8所示,即USB無線網(wǎng)卡移植成功.
圖8 USB無線網(wǎng)卡移植測(cè)試結(jié)果
AODV-UU[14]是由瑞典的烏普薩拉大學(xué)開發(fā)的AODV路由協(xié)議,該源代碼可在Linux系統(tǒng)的用戶空間以及NS-2模擬環(huán)境中運(yùn)行,該協(xié)議目前最新版本為AODV-UU-0.9.6.該協(xié)議的主要目的是在實(shí)驗(yàn)場(chǎng)景下實(shí)現(xiàn)AODV路由協(xié)議,經(jīng)過多個(gè)版本的更新其功能也在不斷更新,AODV-UU利用了Linux內(nèi)核用戶空間的強(qiáng)大功能,并且AODV-UU還支持Netfilter框架以及Socket通信機(jī)制,易于代碼的調(diào)試可移植到其他系統(tǒng)中.
AODV路由協(xié)議在嵌入式系統(tǒng)的實(shí)現(xiàn)框架如圖9所示,AODV路由協(xié)議的實(shí)現(xiàn)主要依靠Socket、Netfilter、aodvd模塊以及kaodv.ko模塊.用戶空間的aodvd模塊用于實(shí)現(xiàn)內(nèi)核的路由功能,在內(nèi)核空間中的kaodv.ko模塊定義了Netfilter包過濾機(jī)制中鉤子函數(shù)的回調(diào)函數(shù).
圖9 AODV實(shí)現(xiàn)框架
aodvd模塊主要負(fù)責(zé)AODV路由協(xié)議中的算法功能,例如路由請(qǐng)求、路由發(fā)現(xiàn)、路由維護(hù)以及Hello包等功能.kaodv模塊主要用來處理經(jīng)過Netfilter過濾處理后進(jìn)入網(wǎng)絡(luò)的數(shù)據(jù)包.此外kaodv模塊還對(duì)用戶空間發(fā)出的指令進(jìn)行處理,執(zhí)行更新、刪除路由表等操作對(duì)內(nèi)核空間的路由表進(jìn)行維護(hù).前文介紹過Socket用來為不同的協(xié)議提供統(tǒng)一的接口,而Netfilter將來自于網(wǎng)絡(luò)中的數(shù)據(jù)包通過5個(gè)鉤子函數(shù)處理后交由kaodv模塊進(jìn)行處理.
本設(shè)計(jì)采用AODV-UU系列代碼作為AODV路由協(xié)議在ARM開發(fā)板上的移植源代碼,將AODV-UU-0.9.6編譯生成相應(yīng)的kaodv.ko以及aodvd模塊,將生成的模塊在Linux系統(tǒng)運(yùn)行以實(shí)現(xiàn)AODV路由協(xié)議.
本設(shè)計(jì)選擇的AODV路由協(xié)議代碼為AODV-UU-0.9.6,這是目前最新也是最完善的一個(gè)Linux系統(tǒng)下的路由協(xié)議.此AODV路由協(xié)議可以作為用戶空間守護(hù)進(jìn)程運(yùn)行,維護(hù)內(nèi)核中的路由表.Netfilter用于捕獲數(shù)據(jù)包,Socket作為實(shí)現(xiàn)通信的接口,其工作原理已經(jīng)在前面說明.我們需要對(duì)Linux內(nèi)核進(jìn)行裁剪使其支持Netfilter及Socket功能.
使用make menuconfig命令打開對(duì)內(nèi)核進(jìn)行配置,添加的選項(xiàng)如表1所示.
表1 Linux內(nèi)核添加選項(xiàng)
在內(nèi)核添加好需要的選項(xiàng)后,直接使用make命令編譯就可以在/arch/arm/boot文件夾下生成我們需要的zImage文件,到此AODV路由協(xié)議移植需要的內(nèi)核編譯完成.
在編譯之前需要對(duì)AODV-UU-0.9.6代碼進(jìn)行修改.修改后在AODV-UU-0.9.6代碼主目錄下使用make arm命令進(jìn)行編譯.最終生成所需的aodvd以及kaodv.ko模塊.
如圖10所示,本設(shè)計(jì)采用多個(gè)Tiny4412開發(fā)板以及一臺(tái)筆記本電腦作為傳輸節(jié)點(diǎn)搭建一個(gè)Ad hoc網(wǎng)絡(luò),將Tiny4412開發(fā)板固定在實(shí)驗(yàn)小車上面,每輛實(shí)驗(yàn)小車都保持在一定的區(qū)域內(nèi)活動(dòng),為網(wǎng)絡(luò)中的每一個(gè)傳輸節(jié)點(diǎn)配置IP地址,其中節(jié)點(diǎn)間的IP地址均為同一網(wǎng)段,每個(gè)路由節(jié)點(diǎn)IP設(shè)置如表2所示.網(wǎng)絡(luò)中每個(gè)節(jié)點(diǎn)都運(yùn)行AODV路由協(xié)議,實(shí)現(xiàn)節(jié)點(diǎn)間的多跳傳輸并對(duì)每一個(gè)節(jié)點(diǎn)的往返時(shí)間以及丟包率等性能參數(shù)指標(biāo)進(jìn)行測(cè)試.
圖10 AODV路由協(xié)議總體測(cè)試設(shè)計(jì)
表2 節(jié)點(diǎn)IP配置
無線網(wǎng)絡(luò)有Ad hoc和Infrastructure兩種建網(wǎng)模式,Ad hoc模式又可叫作點(diǎn)對(duì)點(diǎn)模式,Infrastructure又可以稱作接入點(diǎn)模式.當(dāng)無線網(wǎng)絡(luò)中的設(shè)備需要其他的設(shè)備共享資源時(shí),則需要使用Ad hoc模式,通過無線網(wǎng)卡無需路由器以及任何接入點(diǎn)設(shè)備.MANET就是在Ad hoc模式下運(yùn)行,下面將介紹Ad hoc模式的配置方法.
ifconfig wlan0 up//這里默認(rèn)USB無線網(wǎng)卡設(shè)備名為wlan0
iwconfig wlan0 channel 3//將Ad hoc通道設(shè)置為3
iwconfig wlan0 mode ad-hoc//將無線網(wǎng)卡設(shè)置為Ad hoc模式
iwconfig wlan0 essid “adhoc”//將熱點(diǎn)名稱設(shè)置為adhoc
ifconfig wlan0 192.168.3.102//將無線網(wǎng)卡IP設(shè)置為192.168.3.102
iwconfig
此時(shí)無線網(wǎng)卡已經(jīng)配置為Ad hoc模式,終端顯示如圖11所示.
圖11 Ad hoc模式配置顯示
1)連通性測(cè)試
按照4.2方法將網(wǎng)絡(luò)中的節(jié)點(diǎn)配置為Ad hoc模式,并設(shè)定不同的IP地址.通過insmod命令將kaodv.ko模塊加載到內(nèi)核當(dāng)中去,并運(yùn)行aodvd程序.AODV路由協(xié)議的運(yùn)行結(jié)果如圖12所示.
圖12 AODV路由協(xié)議運(yùn)行結(jié)果
圖12為T1節(jié)點(diǎn)運(yùn)行AODV路由協(xié)議結(jié)果,當(dāng)節(jié)點(diǎn)T1運(yùn)行協(xié)議后會(huì)向目的節(jié)點(diǎn)發(fā)送RREQ請(qǐng)求尋找路由,并不斷發(fā)送HELLO包,當(dāng)發(fā)現(xiàn)T2節(jié)點(diǎn)時(shí)將其作為下一跳節(jié)點(diǎn)并將T2節(jié)點(diǎn)加入到路由表當(dāng)中,建立由T1節(jié)點(diǎn)到T2節(jié)點(diǎn)的路由鏈路.
2)路由性能檢測(cè)
我們可以通過ping包的方式對(duì)路由協(xié)議性能進(jìn)行測(cè)量,ping通過向某一IP地址發(fā)送數(shù)據(jù)包測(cè)試該地址是否有相應(yīng),并統(tǒng)計(jì)相應(yīng)的往返時(shí)間(Round-Trip Time,RTT)以及丟包率性能指標(biāo).
當(dāng)網(wǎng)絡(luò)節(jié)點(diǎn)數(shù)為5時(shí),單鏈的節(jié)點(diǎn)跳數(shù)N=1、2、3、4,AODV路由協(xié)議往返時(shí)間以及丟包率的測(cè)試結(jié)果如圖13、14所示.
圖13 往返時(shí)間測(cè)試結(jié)果
從圖13中可知RTT隨跳數(shù)增加而增大,主要由于網(wǎng)絡(luò)節(jié)點(diǎn)隨避障小車移動(dòng)網(wǎng)絡(luò)拓?fù)洳粩嘧兓?,跳?shù)的增多鏈路斷裂的可能性也會(huì)增加,路由鏈路會(huì)出現(xiàn)斷裂現(xiàn)象重新啟動(dòng)路由發(fā)現(xiàn)造成了延時(shí)增大,并且一般完成路由發(fā)現(xiàn)的時(shí)間要大于數(shù)據(jù)傳輸時(shí)間,重啟路由發(fā)現(xiàn)過程將花費(fèi)大量的時(shí)間,因此隨著跳數(shù)的增多RTT增長(zhǎng)也明顯.如圖14所示,測(cè)得的丟包率隨跳數(shù)增加呈現(xiàn)增大趨勢(shì),車輛的移動(dòng)造成鏈路斷裂以及節(jié)點(diǎn)數(shù)量的增多是丟包率上升的主要原因.
圖14 丟包率測(cè)試結(jié)果
本文提出了一種AODV路由協(xié)議在嵌入式系統(tǒng)上的實(shí)現(xiàn)方案,在PC機(jī)上完成AODV-UU源代碼的交叉編譯,實(shí)現(xiàn)了AODV路由協(xié)議在嵌入式開發(fā)板上的運(yùn)行,對(duì)嵌入式開發(fā)平臺(tái)的往返時(shí)間、丟包率等性能指標(biāo)進(jìn)行了測(cè)試,測(cè)試結(jié)果表明該無線網(wǎng)絡(luò)平臺(tái)的時(shí)延以及丟包性能指標(biāo)良好.