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