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