摘要:網(wǎng)絡(luò)通信在實(shí)際中有著廣泛的應(yīng)用,該文結(jié)合某超聲波探傷系統(tǒng)中的實(shí)際應(yīng)用,討論了在嵌入式操作系統(tǒng)Linux和windows間實(shí)現(xiàn)網(wǎng)絡(luò)通信的關(guān)鍵技術(shù),并詳細(xì)說(shuō)明了利用Socket實(shí)現(xiàn)Linux與windows不同操作系統(tǒng)之間網(wǎng)絡(luò)通信的方法。
關(guān)鍵詞:網(wǎng)絡(luò)通信;Linux;Windows;Socket;UDP
中圖分類號(hào):T330文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2009)27-7788-02
Application of Network Communication Technology in Ultrasonic Testing System
SONG Jing
(College of Information Science and Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 210016, China)
Abstract: The network communication has the broad application in actual. Combining with the application in an ultrasonic testing system, this paper discussed the key techniques of the network communication between embedded operating system Linux and windows. And specified the method of network communication of different operating system between Linux and Windows by using Socket.
Key words: Network communication;Linux;Windows;Socket;UDP
在工業(yè)控制,智能家電等領(lǐng)域,嵌入式系統(tǒng)已成為各種具體應(yīng)用的基礎(chǔ)。對(duì)于有聯(lián)網(wǎng)需求的應(yīng)用,在工業(yè)領(lǐng)域我們通常使用各類工業(yè)現(xiàn)場(chǎng)總線來(lái)連接嵌入式系統(tǒng)及各個(gè)主機(jī);而對(duì)于另一些場(chǎng)合,往往使用TCP/IP網(wǎng)絡(luò)以簡(jiǎn)化網(wǎng)絡(luò)結(jié)構(gòu),降低成本。本文就是針對(duì)這類需求,探討了在超聲波探傷系統(tǒng)中嵌入式Linux系統(tǒng)與Windows主機(jī)實(shí)現(xiàn)通信的方法。
1 開發(fā)環(huán)境
本文結(jié)合的某超聲波探傷系統(tǒng)的硬件框圖如圖1。
該系統(tǒng)是基于PC機(jī)的超聲探傷系統(tǒng)。其中模擬部分負(fù)責(zé)超聲波信號(hào)的發(fā)生和接收,F(xiàn)PGA子系統(tǒng)負(fù)責(zé)高速信號(hào)處理以及各種邏輯控制,嵌入式子系統(tǒng)負(fù)責(zé)各種硬件設(shè)備的控制和管理。超聲波觸發(fā)電路激勵(lì)探頭產(chǎn)生超聲波信號(hào)并接收其回波,得到的信號(hào)經(jīng)過(guò)濾波、高頻放大、高速AD轉(zhuǎn)換、高速緩存等處理,然后通過(guò)PCI總線送入PC機(jī)中。同時(shí)在 PC機(jī)上采用VC++開發(fā)了超聲波無(wú)損檢測(cè)信號(hào)分析系統(tǒng),實(shí)現(xiàn)波形的實(shí)時(shí)顯示、用戶指令操作、波形的后續(xù)處理等操作。
數(shù)據(jù)傳輸是超聲波探傷系統(tǒng)的重要任務(wù)之一,為了使系統(tǒng)具有通信功能,本設(shè)計(jì)采用了以太網(wǎng)來(lái)完成此項(xiàng)功能,以太典型的應(yīng)用形式是Ethernet + TCP/IP,即在由以太網(wǎng)構(gòu)建的底層傳輸網(wǎng)絡(luò)上采成為通用標(biāo)準(zhǔn)的網(wǎng)絡(luò)傳輸協(xié)議TCP/IP進(jìn)行數(shù)據(jù)通信,這是當(dāng)今最流行,應(yīng)廣泛的以太網(wǎng)通信方式。
2 網(wǎng)絡(luò)通信原理
2.1 Socket介紹
Socket是為方便開發(fā)人員進(jìn)行TCP/IP程序開發(fā),而為TCP/IP協(xié)議開發(fā)的一組應(yīng)用程序接口(API),它是網(wǎng)絡(luò)通信中應(yīng)用進(jìn)程和網(wǎng)絡(luò)協(xié)議之間的接口。Socket在所有網(wǎng)絡(luò)操作系統(tǒng)和網(wǎng)絡(luò)應(yīng)用程序中都是必不可少的。
socket函數(shù)原型為:int socket(int domain, int type, int protocol)。
常用的Socket類型有兩種:針對(duì)于面向連接的TCP服務(wù)應(yīng)用的流式Socket和對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用的數(shù)據(jù)報(bào)式Socket。
2.2 網(wǎng)絡(luò)通信框圖
圖2是系統(tǒng)在 TCP/IP協(xié)議下通過(guò)網(wǎng)絡(luò)進(jìn)行通信的框圖。服務(wù)器端和客戶端都通過(guò)Socket接口相互問(wèn)進(jìn)行通信。
根據(jù)建立連接的類型,分成面向連接和無(wú)連接兩種,分別對(duì)應(yīng)TCP和UDP協(xié)議;兩個(gè)系統(tǒng)通過(guò)各自的網(wǎng)絡(luò)接口設(shè)備物理上互連,在傳遞數(shù)據(jù)信息時(shí),在上層建立起UDP套接字虛連接。
3 網(wǎng)絡(luò)通信實(shí)現(xiàn)
針對(duì)嵌入式設(shè)備通訊主要是發(fā)送接收一些實(shí)時(shí)數(shù)據(jù)信息及指令,這里選擇了相對(duì)高效的UDP傳輸協(xié)議。
由于使用UDP協(xié)議來(lái)傳輸數(shù)據(jù),可能會(huì)因物理網(wǎng)絡(luò)或者其它原因丟失數(shù)據(jù)包或數(shù)據(jù)包在傳輸過(guò)程中損壞,可以利用一段時(shí)間內(nèi)的多次發(fā)送來(lái)覆蓋這種小概率的數(shù)據(jù)出錯(cuò);另外一種較好的解決方法是將此糾錯(cuò)處理交給應(yīng)用層即所編寫的程序來(lái)應(yīng)對(duì),比如在Linux端發(fā)送消息時(shí)即確定好一個(gè)關(guān)于本次發(fā)送字符串的校驗(yàn)標(biāo)志,然后Windows端接收到后先對(duì)這個(gè)字符串做相同的校驗(yàn)處理,結(jié)果與取出的標(biāo)志相比較,同則接受這個(gè)包,并做進(jìn)一步處理,不同則認(rèn)為包在傳輸過(guò)程中已損壞,舍棄等待下一個(gè)包到達(dá)。
3.1 Linux下網(wǎng)絡(luò)通信程序設(shè)計(jì)
1) 創(chuàng)建Socket
sock = socket(AF_INET, SOCK_DGRAM, 0);創(chuàng)建Socket
2) 配置Socket
//先對(duì)服務(wù)器地址server_addr等數(shù)據(jù)結(jié)構(gòu)和字節(jié)順序進(jìn)行初始化。
bind(sock, (struct sockaddr *) client_addr, sizeof(client_addr))// 利用bind()函數(shù)綁定端口和地址信息
3) 數(shù)據(jù)通信
recvfrom(sock,(char *)recvPacket,sizeof(RecvPacket), 0,(struct sockaddr *)server_addr,addr_len);// 接收數(shù)據(jù)
sendto(sock,(char *)sendPacket,sizeof(SendPacket), 0,(struct sockaddr *)server_addr,addr_len);//發(fā)送數(shù)據(jù)
在編譯之前我們需要在系統(tǒng)里安裝g++、gcc,它們就是Linux下的C++/C的編譯器,這里我們使用g++來(lái)編譯C++程序。該程序利用雙線程來(lái)實(shí)現(xiàn)收發(fā)數(shù)據(jù),在Linux下,編譯一個(gè)多線程的程序命令為:g++ -lpthread -o file file.c
也可以將編譯過(guò)程寫入makefile中,定義相關(guān)參數(shù)及使用靜態(tài)鏈接,最后編譯,連接,產(chǎn)生目標(biāo)代碼。
3.2 Windows下網(wǎng)絡(luò)通信程序設(shè)計(jì)
Windows主機(jī)部分作為監(jiān)控端,不僅需要實(shí)現(xiàn)數(shù)據(jù)信息的實(shí)時(shí)接收,處理與轉(zhuǎn)發(fā),還需要有一良好的人機(jī)交互界面,采用VisualC++6.0中的MFC可以方便的創(chuàng)建人機(jī)交互界面,而且MFC封裝了WinSock類庫(kù),可以很方便地開發(fā)基于TCP/I P的網(wǎng)絡(luò)應(yīng)用程序,其服務(wù)器端監(jiān)控程序的開發(fā)步驟如下 :
1)創(chuàng)建套接字 ServerSocket 。
ServerSocket=socket(AF_INET,SOCK_DGRAM,0);
2)為套接字分配地址。
//初始客戶端端的地址和端口信息
//初始化自己的地址和端口信息并與socket綁定
bind(m_socket,(SOCKADDR*) addrSrv,sizeof(SOCKADDR));
3)數(shù)據(jù)通信
Socket配置完成后,就可以通過(guò)send()和recv()發(fā)送和接收數(shù)據(jù)了,函數(shù)模型與Linux下函數(shù)相同。
recvfrom(sock,(char*)recvPacket,sizeof(RecvPacket),0,(SOCKADDR*)addrClient,len)
sendto(sock,(char *)sendPacket,sizeof(SendPacket),0,(SOCKADDR*)addrClient,len)
4 結(jié)束語(yǔ)
本文著眼于網(wǎng)絡(luò)通信在超聲波探傷系統(tǒng)中的應(yīng)用,使其能夠進(jìn)行網(wǎng)絡(luò)通信,實(shí)現(xiàn)遠(yuǎn)程監(jiān)控、網(wǎng)絡(luò)互連、數(shù)據(jù)傳輸。基于TCP/IP協(xié)議的以太網(wǎng)通信快速準(zhǔn)確的實(shí)現(xiàn)了Window和Linux之間的數(shù)據(jù)傳輸。利用以太網(wǎng)簡(jiǎn)單方便、嵌入式操作系統(tǒng)Linux的開放和低價(jià)、再加上Windows良好的人機(jī)界面,通過(guò)Socket編程實(shí)現(xiàn)網(wǎng)絡(luò)通信,將這三者很好的結(jié)合在一起,是智能化檢測(cè)儀器的發(fā)展方向。本課題的研究為高性能的網(wǎng)絡(luò)化超聲波無(wú)損檢測(cè)技術(shù)奠定了良好的基礎(chǔ),具有一定的實(shí)際意義。
參考文獻(xiàn):
[1] 強(qiáng)建國(guó),馬曉,楊東亞,等.用Windows套接字實(shí)現(xiàn)雙向Internet實(shí)時(shí)通訊[J].蘭州理工大學(xué)學(xué)報(bào),2005,31(5).
[2] 郎銳,羅發(fā)根.Visual C++網(wǎng)絡(luò)通信程序開發(fā)指南[M]. 北京:機(jī)械工業(yè)出版社,2004.
[3] Douglas.Comer,David L.Stevens.TCP/IP客戶一服務(wù)器編程與應(yīng)用[M].北京:清華大學(xué)出版社,2004.
[4] 張樹兵,龐勇. Winsock網(wǎng)絡(luò)通信程序的開發(fā)[J]. 華北工學(xué)院學(xué)報(bào), 2002,23(2).
[5] 韋東山. 嵌入式Linux應(yīng)用開發(fā)完全手冊(cè) [M]. 北京:人民郵電出版社, 2008.
[6] John E. Swanke.前導(dǎo)工作室譯. VC++MFC擴(kuò)展編程實(shí)例[M].北京:機(jī)械工業(yè)出版社,2001.