摘 要: 為了實(shí)現(xiàn)Linux開發(fā)環(huán)境下的總控制器與Windows開發(fā)環(huán)境下分節(jié)點(diǎn)之間的數(shù)據(jù)進(jìn)行無線傳輸,,提出用Socket的方法解決它們所帶WiFi模塊之間的無線通信,。該方法能夠?qū)崿F(xiàn)數(shù)據(jù)的正常傳輸,并能把數(shù)值準(zhǔn)確地顯示出來,。Socket的使用比較簡(jiǎn)單,,不會(huì)對(duì)整體系統(tǒng)增加太多代碼量。這樣開發(fā)出來的總控制器與分節(jié)點(diǎn)之間的通信,,傳輸速率快,、誤碼率低、容易實(shí)現(xiàn),,具有很強(qiáng)的實(shí)用價(jià)值,。
關(guān)鍵詞: 嵌入式Linux;WiFi,;Socket,;總控制器;分節(jié)點(diǎn)
現(xiàn)如今無線通信的方式越來越多,,組網(wǎng)模式也千姿百態(tài),。一般研究同種操作系統(tǒng)下的Socket或WiFi通信的比較多,但在兩種系統(tǒng)開發(fā)環(huán)境下WiFi之間的通信研究卻并不多,。眾所周知,,Linux操作系統(tǒng)由于其系統(tǒng)源碼的自由和開放性,以及系統(tǒng)性能的穩(wěn)定性,,被廣泛用作服務(wù)器的操作系統(tǒng),。而Windows由于其友好的圖形界面和強(qiáng)大的編程環(huán)境,常被廣泛用作客服端的開發(fā)環(huán)境和操作系統(tǒng)[1],。因此,,研究?jī)纱蟛僮飨到y(tǒng)的實(shí)時(shí)通信問題具有一定的現(xiàn)實(shí)意義。
本文主要研究嵌入式Linux下的ARM與Windows環(huán)境開發(fā)下的STC80C51單片機(jī)之間的無線通信問題,,通過套接字編程由WiFi進(jìn)行傳輸,,成功實(shí)現(xiàn)了兩大開發(fā)環(huán)境下數(shù)據(jù)的無線傳輸,基本解決了兩者之間的通信問題,。
1 Socket原理
Socket通常稱作“套接字”,,用于描述IP地址和端口,,是一個(gè)通信鏈的句柄。在客戶端/服務(wù)器通信模型中,,Socket是網(wǎng)絡(luò)通信的基本操作單元,,一個(gè)Socket描述就是通信連接的一端,在一個(gè)網(wǎng)絡(luò)通信連接中,,兩端通信程序應(yīng)各有一個(gè)Socket對(duì)其進(jìn)行描述,,不同的進(jìn)程通過各自的Socket發(fā)送和接收消息,從而實(shí)現(xiàn)了網(wǎng)絡(luò)通信[2-3],。
Linux Socket支持以下3種常見的套接字類型:(1)流式Socket(SOCK_STREAM),,一種最常用的套接字類型,可以保證數(shù)據(jù)傳輸?shù)目煽啃?,不?huì)出現(xiàn)數(shù)據(jù)丟失,、破損或重復(fù)出現(xiàn)等差錯(cuò),;(2)數(shù)據(jù)報(bào)Socket(SOCK_DGRAM)是一種無連接和不可靠的雙工數(shù)據(jù)傳輸服務(wù),,數(shù)據(jù)通過獨(dú)立的報(bào)文進(jìn)行傳輸,是無序的,,并且不保證數(shù)據(jù)的可靠性和無重復(fù)性,,適用于可靠性要求不高的一些場(chǎng)合;(3)原始Socket(SOCK_RAW),,這種類型的Socket允許對(duì)底層協(xié)議(如IP或ICMP)直接訪問,,它功能強(qiáng)大但使用不太方便,一般用于新協(xié)議的開發(fā),。
Socket的編程方法很多,,但主要有兩種方式——面向連接的TCP協(xié)議方式和無連接的UDP協(xié)議方式。本文采用的是TCP協(xié)議方式,。
2 通信平臺(tái)的搭建
本文研究的是兩個(gè)平臺(tái)的通信,,服務(wù)器是內(nèi)有嵌入式Linux操作系統(tǒng)的ARM開發(fā)板,客戶端是運(yùn)行于Windows操作系統(tǒng)開發(fā)環(huán)境下的單片機(jī),。本文在實(shí)際研究中,,服務(wù)器端選用ARM11系列的S3C6410為開發(fā)平臺(tái),內(nèi)部嵌入Linux2.6.28內(nèi)核版本,,目標(biāo)代碼的編譯平臺(tái)選用裝有Ubuntu12.04操作系統(tǒng)的普通PC,,它們通過交叉編譯和NFS掛載的方式實(shí)現(xiàn)了服務(wù)器端編譯平臺(tái)和運(yùn)行平臺(tái)的正常運(yùn)行;客戶端是在Windows XP系統(tǒng)開發(fā)環(huán)境下的帶有各種傳感器的51單片機(jī),。
為了實(shí)現(xiàn)二者之間的通信,,WiFi模塊在此過程中起到樞紐的作用,因此通信兩端都有一個(gè)WiFi模塊,。在服務(wù)器端的WiFi模塊選用的是Marvell 88w8686[4],,它是一款低成本,、低功耗、自帶數(shù)據(jù)鏈路層的WiFi協(xié)議棧,,內(nèi)部集成了兩個(gè)工作頻率為128 MHz的ARM7 Core,,一個(gè)Core負(fù)責(zé)網(wǎng)絡(luò)數(shù)據(jù)的處理,另一個(gè)Core負(fù)責(zé)處理RF方面的工作,。該模塊通過SDIO接口與ARM開發(fā)板相連,。
客戶端的WiFi 模塊選用海凌科電子有限公司新推出的HLK-RM04模塊[5],是基于通用串行接口的符合網(wǎng)絡(luò)標(biāo)準(zhǔn)的低成本嵌入式模塊,。通過該模塊,,傳統(tǒng)的串口設(shè)備在不需要更改任何配置的情況下,即可通過Internet 網(wǎng)絡(luò)傳輸自己的數(shù)據(jù),。模塊通過雙9針工頭串口線與單片機(jī)相連,,功能結(jié)構(gòu)圖如圖1所示,由于該模塊內(nèi)置了TCP/IP協(xié)議棧,,能夠?qū)崿F(xiàn)用戶串口,、以太網(wǎng)、無線網(wǎng)(WiFi)3個(gè)接口之間的轉(zhuǎn)換,。
至此,,整個(gè)系統(tǒng)的通信平臺(tái)的搭建已經(jīng)完成,系統(tǒng)的整體結(jié)構(gòu)功能框圖如圖2所示,,從圖中可以看出WiFi模塊的組網(wǎng)模式,。
3 通信過程的實(shí)現(xiàn)
本文以采集到的溫度值的傳輸來說明實(shí)現(xiàn)的過程。下面分別從服務(wù)器端和客戶端進(jìn)行介紹,。
3.1 服務(wù)器端的實(shí)現(xiàn)
雖然在舉例中采用的是單一客戶端與服務(wù)器進(jìn)行通信,,但考慮到實(shí)際中往往會(huì)遇到多個(gè)客戶端連接服務(wù)器的情況,像常用的recv,、send都是阻塞性函數(shù),,若資源沒有準(zhǔn)備好,則調(diào)用該函數(shù)的進(jìn)程將進(jìn)入睡眠狀態(tài),,這樣就無法處理I/O多路復(fù)用的情況,。鑒于此,使用select函數(shù)既可以實(shí)現(xiàn)非阻塞I/O或信號(hào)驅(qū)動(dòng)I/O,,還可以設(shè)置等待時(shí)間,。服務(wù)器端實(shí)現(xiàn)的程序流程圖如圖3所示。
接下來對(duì)其中一些關(guān)鍵性的步驟進(jìn)行闡述,。
(1)建立Socket
socketfd=socket(AF_INET,SOCK_STREAM,0);
AF_INET表示的是針對(duì)Internet的通信協(xié)議,,允許在遠(yuǎn)程主機(jī)之間通信;SOCK_STREAM表明使用的是TCP協(xié)議,,這樣會(huì)提供按順序的,、可靠的,、雙向的、面向連接的比特流,;0表示成功時(shí)返回文件描述符,,失敗時(shí)返回-1,這樣通過errno即可知道出錯(cuò)的詳細(xì)情況,。
(2)綁定和監(jiān)聽
bind(socketfd,(structsocketaddr*)&server_sockaddr,
sizeof(structsockaddr));//綁定端口號(hào)和地址
listen(socketfs,n);//監(jiān)聽,,n表示允許與服務(wù)器的
最大連接數(shù)
它們都是成功時(shí)返回0,出錯(cuò)時(shí)返回-1,。
(3)調(diào)用select函數(shù)與客戶端連接
fd_set readfd,writefd;//文件描述集的聲明
FD_ZERO(&readfd);//清空readfd與所有文件句柄的聯(lián)系
FD_SET(sockfd,&readfd);//建立文件句柄與readfd的聯(lián)系
select(MAX_CONNECTED_NO,&readfd,NULL,NULL,
(struct timeval*)0);//select函數(shù)的調(diào)用
FD_ISSET(sockfd,&readfd);//檢查readfd聯(lián)系的文件
句柄sockfd是否可讀寫,,當(dāng)大于0時(shí)表示可讀寫
3.2 客戶端的實(shí)現(xiàn)
客戶端的實(shí)現(xiàn)實(shí)際上分兩部分進(jìn)行:一是單片機(jī)通過DALLAS公司的DS18B20溫度傳感器將采集的數(shù)據(jù)傳送給串口;二是與之用串口線相連的RM04模塊,,通過WiFi與服務(wù)器建立連接,,具體實(shí)現(xiàn)的程序流程如圖4所示。
第一部分采集數(shù)據(jù)傳給串口的過程需要注意數(shù)據(jù)在發(fā)送的過程中應(yīng)該把數(shù)據(jù)以ASCII形式發(fā)送,,這樣服務(wù)器端才能以想要的十進(jìn)制的形式顯示出來,,其他的比較簡(jiǎn)單,不再贅述,。主要介紹第二部分中RM04模塊的配置,。
(1)調(diào)到相應(yīng)的端口,,搜索到該模塊,。
(2)以無線網(wǎng)卡的模式配置該模塊,選擇TCP客戶端模式,,遠(yuǎn)程端口的IP和端口號(hào),,無線局域網(wǎng)的名稱與密碼,本模塊的IP等,,具體配置圖如圖5所示,。
(3)在命令窗口下ping 192.168.1.120,如果ping通,,說明該模塊成功,。
在Linux系統(tǒng)中進(jìn)入開發(fā)板,先啟動(dòng)服務(wù)器端,,再運(yùn)行客戶端程序,,服務(wù)器端出現(xiàn)如圖6所示的結(jié)果。
通過圖6可以看出,,客戶端與服務(wù)器端之間能夠正常通信,,并能正確顯示出當(dāng)前測(cè)量的溫度是27.35 ℃。該項(xiàng)研究主要針對(duì)總控制器與分節(jié)點(diǎn)之間的無線通信,,對(duì)于需要這種模式通信的系統(tǒng)有很大的實(shí)際使用價(jià)值,。
參考文獻(xiàn)
[1] Li Fei,,Yuan Lin,Wang Zhihuo,,et al.Realization of communication between Linux and Windows based on Socket[C].Proceedings of the 2010 International Conference on Information Technology and Scientific Management,,2010.
[2] 王遠(yuǎn)洋,周淵平,,郭煥麗.Linux下基于Socket多線程并發(fā)通信的實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,,2009,25(5-3):70-72.
[3] 郭東升,,田秀華.Linux環(huán)境下基于Socket的網(wǎng)絡(luò)通信[J].軟件導(dǎo)刊,,2009,8(1):116-118.
[4] 王云亮,,李瑩.嵌入式安防遠(yuǎn)程監(jiān)控系統(tǒng)的設(shè)計(jì)[J].化工自動(dòng)化及儀表,,2013,40(2):237-240.
[5] 深圳市海凌科電子有限公司.HLK-RM04應(yīng)用手冊(cè)1串口轉(zhuǎn)以太網(wǎng)應(yīng)用[K].2012.