馬新濤 李洪平
(1、中國海洋大學(xué)信息科學(xué)與技術(shù)學(xué)院,山東 青島 2661002、中國海洋大學(xué)海洋遙感所,山東 青島 266100)
本文中所要設(shè)計實現(xiàn)的嵌入式網(wǎng)關(guān)需要完成的功能就是連接兩個不同協(xié)議的無線網(wǎng)絡(luò),實現(xiàn)數(shù)據(jù)的轉(zhuǎn)發(fā)?;赯igBee網(wǎng)絡(luò)協(xié)議的無線傳感器節(jié)點采集有用數(shù)據(jù),并通過ZigBee網(wǎng)絡(luò)將數(shù)據(jù)準(zhǔn)確傳輸至ZigBee協(xié)調(diào)器,網(wǎng)關(guān)通過讀串口操作將協(xié)調(diào)器的數(shù)據(jù)寫入緩沖區(qū),最后將緩沖區(qū)的數(shù)據(jù)通過與網(wǎng)關(guān)相連的usb無線網(wǎng)卡打包送入無線局域網(wǎng)。網(wǎng)關(guān)本質(zhì)上是一個RS232協(xié)議轉(zhuǎn)換為802.11g協(xié)議的協(xié)議轉(zhuǎn)換器。
我們選用了聯(lián)智公司基于EP9301處理器的開發(fā)板DG9301。DG9301開發(fā)板的主要組件包括:EP9301 ARM9處理器,16M的FLASH 和32M的SDRAM,兩個RS232串行接口,一個自適應(yīng)的10M/100M以太網(wǎng)接口,24個引出的GPIO引腳,支持用戶外接,標(biāo)準(zhǔn)的 JTAG 接口,2個 USB host,5路 12bit的模擬輸入等等。
2.2.1 開發(fā)方式介紹
由于目標(biāo)板不具備一定的處理器能力和存儲空間,所以只有在宿主機上對即將在目標(biāo)機上運行的應(yīng)用程序進(jìn)行編譯,生成可以在目標(biāo)機上運行的代碼格式,然后移植到目標(biāo)板上,才可以完成程序開發(fā),即目前嵌入式程序開發(fā)的Host/Target模式。宿主機采用的是運行redhat9.0系統(tǒng)的x86通用PC機平臺,并安裝交叉編譯環(huán)境。
2.2.2 搭建交叉編譯環(huán)境
所謂交叉編譯,簡單地說就是在一個平臺上生成在另一個平臺上執(zhí)行的代碼,即在宿主機上對應(yīng)用程序進(jìn)行交叉編譯,生成可以在目標(biāo)板上執(zhí)行的代碼。制作交叉編譯器可行性較高的方法是采用現(xiàn)成的、有專門的機構(gòu)維護的交叉工具鏈,出現(xiàn)問題容易得到技術(shù)支持。在這里,我們?nèi)砸悦嫦駾G9301的開發(fā)為例:
首先,將資料光盤中的arm-linux-gcc-3.3.tar拷貝到開發(fā)機的根目錄,并將文件解壓縮。
然后,再把資料光盤中的arm-elf-gcc-3.2.1-full.tar.bz2拷貝到開發(fā)主機的根目錄,并將文件解壓縮。
最后,為了不每次設(shè)置PATH,將下面這行加到開發(fā)主機的.bash_profile文件中:
PATH =/usr/local/arm/3.3/bin:/usr/local/arm/3.2.1-elf/bin:$PATH
至此,PC機的交叉編譯環(huán)境就已經(jīng)建立起來了,可以用arm-linux-gcc命令編譯在PC機上編輯好的程序,然后下載到目標(biāo)板上測試執(zhí)行。
2.2.3 搭建NFS環(huán)境
首先,在裝有redhat9.0的PC主機上執(zhí)行setup命令,彈出菜單界面后選中System services進(jìn)入系統(tǒng)服務(wù)選項菜單,在其中選中[*]nfs,然后退出setup界面返回到命令提示符下。
編輯/etc/exports文件,將這個默認(rèn)的空文件修改為只有一行內(nèi)容:/(rw),保存退出后執(zhí)行如下命令以啟動NFS服務(wù):service nfs restart,如果每個啟動項的結(jié)果都顯示為OK,則說明配置成功。
2.2.4 配置TFTP服務(wù)
進(jìn)入System services菜單界面,選中tftp一項,并去掉ipchains和iptables兩項服務(wù)。
然后,退出setup界面,執(zhí)行service xinetd restart命令以啟動TFTP服務(wù)。
前面已經(jīng)介紹過,嵌入式網(wǎng)關(guān)的功能在本質(zhì)上是實現(xiàn)RS232串口到無線局域網(wǎng)的數(shù)據(jù)轉(zhuǎn)發(fā),所以應(yīng)用層軟件實際上就是讀串口數(shù)據(jù),借助于公共緩沖區(qū),打成標(biāo)準(zhǔn)的TCP數(shù)據(jù)包,利用無線網(wǎng)卡實現(xiàn)數(shù)據(jù)的發(fā)送。
在Linux系統(tǒng)中,串口的驅(qū)動由Linux內(nèi)核的drivers文件夾內(nèi)的serial.c來實現(xiàn)。在Linux下,/dev是提供給應(yīng)用層的接口,Linux通過識別/dev下串口設(shè)備的主設(shè)備號和次設(shè)備號,配合找到底層的串口驅(qū)動,并進(jìn)行調(diào)用。而我們需要做的就是在應(yīng)用層借助read()和write()函數(shù)進(jìn)行讀串口程序的開發(fā)。
讀串口程序設(shè)計大致可以分為打開串口、配置串口、讀串口三個步驟。其中,打開串口可以使用open_port函數(shù)來實現(xiàn)。配置串口可以使用set_opt函數(shù)來實現(xiàn)。讀串口操作可以使用read()函數(shù)來實現(xiàn)。
Linux中的網(wǎng)絡(luò)編程是通過socket接口來進(jìn)行的。系統(tǒng)在pc機與ARM開發(fā)板之間通過一個可靠的面向連接的網(wǎng)絡(luò)套接字服務(wù),使得嵌入式網(wǎng)關(guān)可以通過連有無線網(wǎng)卡的usb口與連有無線ap的pc機進(jìn)行數(shù)據(jù)交換。
在客戶端/服務(wù)器模式中,一個服務(wù)程序通常在一個指定的地址監(jiān)聽對服務(wù)的請求,當(dāng)一個客戶對這個服務(wù)的地址提出了連接請求。此時,服務(wù)程序被激活,它創(chuàng)建一個子進(jìn)程為客戶提供服務(wù),而父進(jìn)程繼續(xù)在原地址監(jiān)聽。在子進(jìn)程完成了相應(yīng)的操作后,服務(wù)器關(guān)閉此連接套接字,并結(jié)束此子進(jìn)程。
在這里,我們的嵌入式網(wǎng)關(guān)被看作是客戶端,無線局域網(wǎng)的pc節(jié)點被看作是服務(wù)器端。通過socket編程和讀串口程序的綜合,可以在實現(xiàn)服務(wù)器和客戶端網(wǎng)絡(luò)連接的基礎(chǔ)上,完成讀串口寫網(wǎng)口的操作以及數(shù)據(jù)的轉(zhuǎn)發(fā)、傳輸和接收。
在client.c程序編輯完成后,使用Linux下ARM的交叉編譯工具arm-linux-gcc將其編譯成ARM芯片上可運行的應(yīng)用程序client:arm-linux-gcc-o client client.c
然后再將client通過網(wǎng)口下載到ARM開發(fā)板上。同時在服務(wù)器端編輯編譯server程序,配置好雙方的ip地址之后就可以執(zhí)行應(yīng)用程序?qū)崿F(xiàn)開發(fā)板和主機之間的通訊。實驗證明,我們可以在服務(wù)器端接收到來自ZigBee協(xié)調(diào)點的數(shù)據(jù)信息。
測試成功后我們還需要將客戶端應(yīng)用程序client添加到ramdisk文件系統(tǒng)中,然后再將其壓縮的映像文件ramdisk.gz下載燒寫到開發(fā)板的flash上。同時,我們還需要修改系統(tǒng)腳本/etc/rc.sysinit,使開發(fā)板能夠在系統(tǒng)啟動后自動加載無線網(wǎng)卡驅(qū)動和客戶端應(yīng)用程序client。
和通用計算機不同,嵌入式系統(tǒng)是面向應(yīng)用、產(chǎn)品和用戶的。本文就是結(jié)合實際需求,以應(yīng)用為基礎(chǔ),詳細(xì)介紹了嵌入式設(shè)備--網(wǎng)關(guān)開發(fā)設(shè)計和實現(xiàn)的整體過程,并在實際項目中得到了檢驗,希望能對其他嵌入式系統(tǒng)產(chǎn)品的開發(fā)有一定的借鑒意義。
[1]許先斌,熊慧軍,李洲,等.基于 ARM9 的嵌入式Linux開發(fā)流程的研究[J].微計算機信息,2006:87-89.
[2]尤盈盈,孟利民.構(gòu)建嵌入式Linux交叉編譯環(huán)境[J].計算機與數(shù)字工程,2006:30-32.
[3]李駒光,鄭耿,江澤明.嵌入式 Linux 系統(tǒng)開發(fā)詳解[M].清華大學(xué)出版社,2006:166-182.
[4]王丹,祝躍飛,李勤,等.基于 Linux2.6 內(nèi)核的嵌入式VPN網(wǎng)關(guān)實現(xiàn)[J].微電子學(xué)與計算機,2006:137-140.
[5]孫瓊.嵌入式Linux應(yīng)用程序開發(fā)詳解[M].人民郵電出版社,2006.
[6]俞冬麗.基于嵌入式Linux系統(tǒng)的網(wǎng)絡(luò)編程技術(shù)[J].中國科技信息,2006:77-80.