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