UDP协议及其在磁场数据采集系统中的应用
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),发送字节数组;
socket通信报文格式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 系统程序功能介绍
磁场数据采集系统的主要功能是实时接收测磁仪上传的三分量磁场测量数据,通过图、表形式进行显示,并保存成格式为TXTExcel类型的数据文件。
在该程序中采用的主要控件有: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.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。