衣軍
摘 要:UDP協(xié)議具有傳輸效率高、可擴展性強等特點,適用于實時性要求高、數(shù)據(jù)傳輸量大的場合。文章簡單介紹了UDP協(xié)議并以磁場數(shù)據(jù)采集系統(tǒng)為例,給出了在Delphi環(huán)境下PC機與測磁儀間實現(xiàn)UDP協(xié)議網(wǎng)絡(luò)通信的方法。
關(guān)鍵詞:UDP協(xié)議;磁場測量;數(shù)據(jù)采集;Delphi
在分布式測量系統(tǒng)中,大多數(shù)采用以太網(wǎng)進行數(shù)據(jù)傳輸。以太網(wǎng)的傳輸協(xié)議有TCP和UDP等。TCP是面向連接的,可靠性較高,但效率較低;UDP則是一種傳輸速率高,但不保證數(shù)據(jù)可靠性的協(xié)議,因此比較適合應(yīng)用在實時性要求高、數(shù)據(jù)傳輸量大的測量系統(tǒng)中。
1 UDP協(xié)議簡述
UDP協(xié)議的母體和TCP協(xié)議一樣,也是IP協(xié)議。每個UDP報文稱為一個用戶數(shù)據(jù)報,分UDP報頭和UDP數(shù)據(jù)區(qū)兩部分。報頭由四個16位長的字段組成,分別說明該報文的源端口、目的端口、報文長度以及校驗和。UDP報文格式如圖1所示。
圖1 UDP報文格式
源端口字段和目的端口字段包含了16位的UDP協(xié)議端口號。長度字段記錄該數(shù)據(jù)報的長度,以8位為組計算,包括報頭和用戶數(shù)據(jù)區(qū)。校驗和字段是可選擇的,如該字段值為0,表明不進行校驗。UDP協(xié)議的報頭只包含幾個域,比TCP包頭簡單,它的網(wǎng)絡(luò)開銷一般要小于TCP協(xié)議。同時,由于UDP協(xié)議在傳送數(shù)據(jù)過程中沒有建立連接,也不進行檢查,因此在優(yōu)良的網(wǎng)絡(luò)環(huán)境中,其工作效率較TCP協(xié)議要高。但UDP協(xié)議不提供報文到達確認、排序以及流量控制等功能,因此,報文可能會丟失、重復(fù)以及亂序等,其可靠性問題只能由使用UDP的該應(yīng)用程序來解決。
2 利用Delphi編寫UDP協(xié)議的網(wǎng)絡(luò)應(yīng)用程序
2.1 INDY介紹
INDY的全名是Internet Direct,是一套開放源代碼的Internet控件集,它支持大部分Internet協(xié)議,包括TCP、UDP、HTTP、POP3等,支持BASE64、MD2、MD4、MD5等編解碼,提供相應(yīng)的客戶端和服務(wù)器控件。INDY是完全基于SOCKET阻塞工作模式的開發(fā)庫,支持Delphi、C++ Builder等開發(fā)平臺。
2.2 INDY UDP相關(guān)控件
INDY(10.1)提供了UDP相關(guān)的服務(wù)器和客戶端控件TIdUDPServer、TIdUDPClient,它們封裝了UDP協(xié)議的實現(xiàn)。
(1)TIdUDPServer控件的主要屬性及方法
主要屬性:
◆Active,啟動或停止UDP;
◆Bindings:TIdSocketHandles,服務(wù)器所分配的套接字句柄(Socket handles);
◆BufferSize:Integer,最大數(shù)據(jù)包大?。?/p>
◆DefaultPort:integer,用于監(jiān)聽新連接的端口號;
◆IPVersion,UDP支持的IP協(xié)議版本;
◆ThreadedEvent:boolean,指定是否采用獨立線程進行UDP讀操作。
主要方法:
◆Send(AHost: string, const APort: Integer, const AData: string),向指定IP地址(AHost)和端口(APort)的端點發(fā)送字符串;
◆SendBuffer(AHost: string, const APort: Integer, const ABuffer: TIdBytes),向指定IP地址(AHost)和端口(APort)的端點發(fā)送字節(jié)數(shù)組;
◆ReceiveString(const AMSec: Integer = IdTimeoutDefault): string,接收字符串;
◆ReceiveBuffer(var ABuffer: TIdBytes, const AMSec: Integer = IdTimeoutDefault): Integer,接收字節(jié)數(shù)組。
(2)TIdUDPClient控件的主要屬性及方法
主要屬性:
◆Host:String,遠端計算機IP地址;
◆Port:Word,遠端計算機端口號;
◆BoundIP:String,本機IP地址;
◆BoundPort:Word,本機端口號;
◆BoundPortMax:Integer,本機最大端口數(shù);
◆BoundPortMin:Integer,本機最小端口數(shù);
◆BufferSize:Integer,最大數(shù)據(jù)包大小;
◆IPVersion:TIdIPVersion,UDP支持的IP協(xié)議版本;
◆ReceiveTimeOut:Integer,等待讀取socket時間;
◆Active:Boolen,啟動或停止UDP。
主要方法:
◆Send(AData:String),發(fā)送字符串;
◆SendBuffer(const ABuffer: TIdBytes),發(fā)送字節(jié)數(shù)組;
◆SendBuffer(AHost: string, const APort: Integer, const ABuffer: TIdBytes),向指定IP地址(AHost)和端口(APort)的端點發(fā)送字節(jié)數(shù)組;
◆ReceiveString(const AMSec: Integer = IdTimeoutDefault):string,接收字符串;
◆ReceiveBuffer(var ABuffer: TIdBytes,const AMSec:Integer = IdTimeoutDefault):integer,接收字節(jié)數(shù)組;
◆Connected: Boolean,讀取UDP連接狀態(tài)。
2.3 系統(tǒng)程序功能介紹
磁場數(shù)據(jù)采集系統(tǒng)的主要功能是實時接收測磁儀上傳的三分量磁場測量數(shù)據(jù),通過圖、表形式進行顯示,并保存成格式為‘TXT或‘Excel類型的數(shù)據(jù)文件。
在該程序中采用的主要控件有:UDP相關(guān)控件IdUDPClient、圖形顯示控件TeeChart、數(shù)據(jù)顯示控件Memo及文件保存和狀態(tài)顯示控件等。圖2是磁場數(shù)據(jù)采集程序的用戶界面。
根據(jù)約定采用的上下位機IP地址和端口號(上位機(PC機)的IP為:192.168.0. 99,Port為8080;下位機(測磁儀)的IP為:192.168.0.123,Port為2020),設(shè)置IdUDPClient1的相關(guān)屬性:
Host:=192.168.0.123;
Port:=2020;
BoundIP:=192.168.0. 99;
BoundPort:=8080
圖2 磁場數(shù)據(jù)采集系統(tǒng)程序界面
計算機與測磁儀的通訊過程如下:儀器端等待上位機指令,收到數(shù)據(jù)傳送“開始”指令,將測量數(shù)據(jù)打包發(fā)至上位機,直至收到“停止”指令。上位機在設(shè)置好相關(guān)IP地址及Port屬性后,向儀器端發(fā)送“開始”指令,并等待接收數(shù)據(jù)。收到數(shù)據(jù)后,對其進行實時處理,更新測量結(jié)果的數(shù)據(jù)和圖形顯示。
2.4 程序清單 (略)
3 結(jié)束語
由于UDP具有TCP無可比擬的速度優(yōu)勢,因此特別適合應(yīng)用在實時性要求較高且需大量數(shù)據(jù)傳輸?shù)膱龊?。在Delphi環(huán)境中,采用開源INDY控件實現(xiàn)基于UDP協(xié)議的通信,系統(tǒng)開發(fā)、調(diào)試將更加容易、迅速。
參考文獻
[1]來爽,慕德俊.UDP協(xié)議在嵌入式系統(tǒng)中的應(yīng)用[J].機電一體化,2008,6.