功能概述 由于A(yíng)d Hoc網(wǎng)絡(luò )無(wú)中心、動(dòng)態(tài)拓撲等特點(diǎn),它需要各個(gè)節點(diǎn)都具有路由轉發(fā)功能。本文開(kāi)發(fā)的Ad Hoc網(wǎng)絡(luò )節點(diǎn)通過(guò)在ARM平臺上移植路由協(xié)議而實(shí)現了數據包轉發(fā)功能。 ![]() 圖1 節點(diǎn)轉發(fā) 以圖1所示的網(wǎng)絡(luò )進(jìn)行功能示意,其中A、B、D是普通的移動(dòng)電腦終端,C是本文開(kāi)發(fā)的ARM平臺。A和D是通信的端點(diǎn),D不在A(yíng)的一跳范圍之內(A的覆蓋范圍如圖中虛線(xiàn)所示)。假設開(kāi)始時(shí)B成為了A和D的中繼節點(diǎn),完成A、D之間的數據轉發(fā)功能。當B節點(diǎn)出現故障時(shí),C能自動(dòng)代替B成為新的中繼節點(diǎn),維持A、D之間的通信。 該ARM平臺除了路由協(xié)議以外,同時(shí)完成了ftp、iptables等工具的移植,還可以繼續增添語(yǔ)音、視頻等服務(wù)。 硬件平臺 以處理器為核心,無(wú)線(xiàn)網(wǎng)卡收到數據包后交給上層處理,需要發(fā)出的數據包也由處理器控制無(wú)線(xiàn)網(wǎng)卡來(lái)發(fā)出。當然SDRAM、閃存、電源這些模塊也是系統不可缺少的。 本文采用ARM920T為內核的三星處理器S3C2410A。S3C2410A 是32位低功耗RISC處理器,同時(shí)支持Thumb16位壓縮指令集,其工作頻率為203MHz。S3C2410A有292個(gè)管腳,集成了許多片上功能,例如以太網(wǎng)控制器、UART控制器、可編程I/O口及中斷控制器等。 考慮到接口體積,該平臺選用USB接口的華碩WL-167g無(wú)線(xiàn)網(wǎng)卡,提供無(wú)線(xiàn)通信功能。 硬件平臺設計結構如圖2所示。 ![]() 圖2 硬件平臺結構圖 在硬件調試中一個(gè)應該注意的問(wèn)題就是S3C2410A的nWait引腳在不使用時(shí)應接上拉電阻,否則系統在啟動(dòng)模式時(shí)將不能正常啟動(dòng)。 軟件平臺 vivi是韓國MIZI公司開(kāi)發(fā)的Bootloader,適用于A(yíng)RM9處理器,其作用是初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環(huán)境設置成一個(gè)合適的狀態(tài),以便為運行操作系統準備正確的環(huán)境。引導程序執行完后會(huì )將控制權交給內核(zImage),內核是操作系統的核心,內核需要的各種配置文件、數據及上層軟件都存放在根文件系統之中。整個(gè)軟件平臺的結構如圖3所示。 ![]() 圖3 軟件平臺示意圖 內核鏡像的生成 這里不贅述內核生成方法,需要注意此過(guò)程容易遇到三類(lèi)錯誤:一是編譯出錯,應該檢查庫文件是否齊全,另外gcc版本太高也會(huì )導致編譯錯誤,重新安裝低版本gcc后即可解決;二是內核配置應將Default kernel command string設置為noinitrdroot=/dev/mtdblock3 console=ttySAC0,115200init=/linuxrc,“console=ttySAC0,115200”使內核啟動(dòng)期間的信息全部輸出到串口0上,波特率為115200,“mtdblock3”代表第4個(gè)Nand閃存分區,該分區為根文件系統,init是指定啟動(dòng)腳本,“init=/linuxrc”表示啟動(dòng)初始化文件位置;三是應該在drivers/mtd/nand/s3c2410.c中,設置NAND_ECC_SOFT =NAND_ECC_NONE,這樣就關(guān)閉了ECC校驗。因為內核是通過(guò)vivi寫(xiě)到Nand閃存中的,vivi使用的軟件ECC算法與內核中校驗算法不同。 無(wú)線(xiàn)網(wǎng)卡驅動(dòng)的移植 本文使用華碩USB無(wú)線(xiàn)網(wǎng)卡WL-167g,其網(wǎng)卡驅動(dòng)是rt73。 移植步驟如下: a、下載RT73_Linux_STA_Drv1.0.4.0.tar.gz,解壓后生成Module和WPA_Supplicant兩個(gè)目錄,將目錄Module中的所有文件都拷貝到內核源碼包drivers/usb/net/rt73下,修改Makefile如下編譯選項: KDIR := path/linux-2.6.18 path為內核源碼包所在路徑。 b、由于要在內核源碼包里進(jìn)行交叉編譯,所以修改linux-2.6.18 /drivers/usb/net/Kconfig,加入以下內容: config RT73 tristate“support for rt73 wireless usb device” depends on USB && NET && USB_USBNET c、修改drivers/usb/net/Makefile,加入rt73的編譯項: obj-$(CONFIG_RT73)+= rt73 d、對內核重新進(jìn)行配置, 將配置界面中新增的“support for rt73 wireless usb device”選為模塊。 e、make modules 在drivers/usb/net/rt73目錄下生成rt73.ko驅動(dòng)文件,將rt73.ko放到根文件系統中,再燒寫(xiě)到ARM板上無(wú)線(xiàn)網(wǎng)卡即可正常工作。 f、無(wú)線(xiàn)網(wǎng)卡的配置 無(wú)線(xiàn)網(wǎng)卡有managed、Ad-hoc兩種模式。managed模式稱(chēng)為基礎設施模式,又稱(chēng)接入點(diǎn)模式;Ad-hoc模式稱(chēng)為點(diǎn)對點(diǎn)模式或無(wú)中心模式,用來(lái)在無(wú)線(xiàn)網(wǎng)卡之間進(jìn)行一跳通信。Ad Hoc網(wǎng)絡(luò )就是在A(yíng)d-hoc模式基礎上通過(guò)網(wǎng)絡(luò )協(xié)議使得該網(wǎng)絡(luò )支持多跳通信,因此該模式的使用和性能對AdHoc網(wǎng)絡(luò )的影響至關(guān)重要,以下是Ad-hoc模式配置方法,rausb0表示無(wú)線(xiàn)網(wǎng)卡: 1)、ifconfig rausb0 10.0.1.1 up 設置節點(diǎn)IP為10.0.1.1。 2)、iwpriv rausb0 set AdhocOfdm=2 設置rausb0為11g only模式,即54M速率模式,這是802.11g所能支持的最高速率。 3)、iwconfig rausb0 channel 3 設置信道為3。 4)、iwconfig rausb0 mode ad-hoc essid bcnl 設置網(wǎng)卡模式為ad-hoc,essid為“bcnl”。 上述配置過(guò)程中使用的“iw”開(kāi)頭的命令都是無(wú)線(xiàn)工具集中的命令,其源碼包是wireless_tools.29.tar.gz,經(jīng)過(guò)交叉編譯后即可使用。 AODV路由協(xié)議的移植 本文使用的代碼是aodv-uu-0.9.5.tar.gz。AODV分為兩個(gè)部分,一個(gè)是內核態(tài)模塊kaodv.ko,一個(gè)是用戶(hù)態(tài)模塊aodvd。AODV主要部分工作在用戶(hù)態(tài),用于維護內核路由表。 AODV需要內核支持,在內核配置時(shí)要選上netfilter選項。先編譯內核態(tài)模塊kaodv.ko,步驟如下: a、將aodv-uu-0.9.5/lnx目錄的內容拷到內核源碼包linux-2.6.18/net/ipv4/kaodv目錄下,修改linux-2.6.18/net/ipv4/Kconfig,添加如下內容: config KAODV_UU tristate "support for aodv-uu adhoc routing protocol" b、在linux-2.6.18/net/ipv4/Makefile末尾添加如下的編譯選項: obj-$(CONFIG_KAODV_UU) += kaodv/ c、make menuconfig,找到如下的目錄項: Networking ---> Networking support Networking options ---> support for aodv-uu adhoc routing protocol選為模塊編譯。 d、make modules將生成kaodv.ko。以下介紹用戶(hù)態(tài)aodvd編譯: 將aodv-uu-0.9.5/Makefile做適當修改,使其在交叉編譯的環(huán)境下只編譯用戶(hù)態(tài)部分。 將得到的kaodv.ko和aodvd拷貝到根文件系統中,再燒寫(xiě)到ARM板上。 insmod kaodv.ko ./ aodvd 這樣aodv協(xié)議就運行起來(lái)了。在協(xié)議移植中有兩點(diǎn)需要注意:一是Makefile中ARM_CCFLAGS=-mbig-endian應該注釋掉,否則運行時(shí)會(huì )產(chǎn)生大小端混亂的問(wèn)題;二是將kaodv.ko和aodvd分開(kāi)編譯,因為同時(shí)編譯時(shí)總是提示編譯器缺少文件,甚至用其他交叉編譯器依然不能解決問(wèn)題,而這些錯誤大多是編譯內核模塊產(chǎn)生的。 測試和結論 為簡(jiǎn)單起見(jiàn),本測試使用兩個(gè)筆記本和一個(gè)ARM平臺組建成Ad Hoc網(wǎng)絡(luò ),如圖4所示,A節點(diǎn)IP為10.0.1.1,B節點(diǎn)IP為10.0.1.2,C節點(diǎn)IP為10.0.1.3(經(jīng)測試將ARM平臺做通信端,A或C做中繼,網(wǎng)絡(luò )同樣可以正常運行)。 ![]() 圖4 測試拓撲示意圖 為了簡(jiǎn)單地實(shí)現C節點(diǎn)不在A(yíng)節點(diǎn)一跳范圍內,可以使用iptables實(shí)現過(guò)濾。 在A(yíng)節點(diǎn)執行: iptables –A INPUT –p ALL –m mac –mac-source C.mac –j DROP 在C節點(diǎn)執行: iptables –A INPUT –p ALL –m mac –mac-source A.mac –j DROP 以上的C.mac、A.mac是C和A的實(shí)際mac地址,這樣A節點(diǎn)拒絕C發(fā)給它的數據包,C節點(diǎn)也拒絕A發(fā)給它的數據包,保證二者一跳不可達。 在C節點(diǎn)ping -R 10.0.1.1,鏈路不通,說(shuō)明過(guò)濾成功,B沒(méi)有進(jìn)行數據包轉發(fā)。 在各節點(diǎn)上運行AODV后,在C節點(diǎn)ping -R 10.0.1.1,結果如圖5所示。 ![]() 圖5 測試結果 可見(jiàn),B正確地進(jìn)行了數據包轉發(fā),AODV協(xié)議正常運行,ARM平臺成功運行。 在A(yíng)節點(diǎn)執行lftp10.0.1.3,并下載普通文件。這樣數據包由中間的ARM平臺B轉發(fā),下載完成后,查看C節點(diǎn)的日志文件/var/log/vsftpd.log,發(fā)現上傳和下載的速率基本相同,有將近700kBps的速率,達到5.4Mbps的速率。粗略估算聚合物電池供電能使ARM平臺穩定運行8小時(shí)。 通過(guò)以上測試,搭建一個(gè)Ad Hoc網(wǎng)絡(luò )的ARM平臺的目標已經(jīng)達到。通過(guò)對有多個(gè)ARM平臺的AdHoc網(wǎng)絡(luò )進(jìn)行測試,發(fā)現當某節點(diǎn)感知無(wú)線(xiàn)信號很弱時(shí),無(wú)線(xiàn)網(wǎng)卡的essid存在自動(dòng)變化的情況。究其原因,應該是當前無(wú)線(xiàn)網(wǎng)卡驅動(dòng)設計機制問(wèn)題,這不利于A(yíng)d Hoc網(wǎng)絡(luò )的穩定性,本項目組下一步的工作就是要繼續深入研究并改進(jìn)ARM平臺上的無(wú)線(xiàn)驅動(dòng)接入模塊,以構建性能更加優(yōu)良的AdHoc網(wǎng)絡(luò )平臺。 參考文獻 1. 陳林星, 曾曦, 曹毅. 移動(dòng)Ad Hoc網(wǎng)絡(luò ). 電子工業(yè)出版社 2. 于宏毅. 無(wú)線(xiàn)移動(dòng)自組織網(wǎng)絡(luò ). 人民郵電出版社 3. 張紀坤. 嵌入式Linux系統開(kāi)發(fā)技術(shù)詳解. 人民郵電出版社 作者:新疆昌吉93846部隊 趙利杰 來(lái)源:電子設計應用2009年第11期 |