LabVIEW在TCPIP和UDP中的应用
网际协议(IP)、用户数据报协议(UDP)和传输控制协议(TCP)是网络通信的基本工具。TCP/IP这一名称来自于两个最著名的互联网协议集——传输控制协议和网际协议。
通过TCP/IP可实现单个网络内部或互相连通的网络间的通信。各个网络在地理距离上可以相距遥远。TCP/IP将数据在网络间或因特网上的计算机间传递。多数计算机普遍具有TCP/IP,因而信息能在各种系统上传输。
LabVIEW和TCP/IP
TCP/IP可用于所有平台上的LabVIEW。LabVIEW的TCP和UDP VI及函数可用于创建客户端VI和服务器VI。
IP
IP用于执行计算机间数据传输的低层服务。IP将数据打包为所谓的数据报。每个数据报包含了数据及一个指明源地址和目的地址的报头。IP决定了数据报在网络或因特网上传输的正确路径并将数据发送到指定的目的地址。
IP无法保证数据传输的成功。事实上,如果一个数据报在传输中被复制,IP便可能不止一次地传输该数据报。程序的传输多使用TCP或UDP协议而极少使用IP。
UDP
UDP用于执行计算机各进程间简单、低层的通信。将数据报发送到目的计算机或端口即完成了进程间的通信。端口是发送数据的出入口。IP用于处理计算机到计算机的数据传输。当数据报到达目的计算机后,UDP将数据报移动到其目的端口。如目的端口未打开,UDP将放弃该数据报。UDP与IP有相同的传输问题。
对传输可靠性要求不高的程序可使用UDP。例如,程序可能十分频繁地传输有信息价值数据,以至于遗失少量数据段也不成问题。
在LabVIEW中使用UDP
UDP不是基于连接的协议,如TCP,因此无须在发送或接收数据前先建立与目的地址的连接。但是,需要在发送每个数据报前指定数据的目的地址。操作系统不报告传输错误。
使用打开UDP函数,在端口上打开一个UDP套接字。可同时打开的UDP端口数量取决于操作系统。“打开UDP”函数用于返回唯一指定UDP套接字的网络连接句柄。该连接句柄可在以后的VI调用中引用这个套接字。
写入UDP函数用于将数据发送到一个目的地址,读取UDP函数用于读取该数据。每个写操作需要一个目的地址和端口。每个读操作包含一个源地址和端口。UDP会保留为发送命令而指定的数据报的字节数。
UDP数据报大小根据操作环境各有不同,但最大为65535字节。NI推荐使用UDP发送小于等于1 KB的数据报,从而尽量避免在传输中拆分和重组底层IP数据包,否则将大大增加数据包丢失的可能性。
当端口上所有的通信完毕,可使用关闭UDP函数以释放系统资源。
UDP多点传送(Multicast)
UDP函数通过广播与单个客户端(单点传送)或子网上的所有计算机进行通信。如需与多个特定的计算机通信,则必须配置UDP函数,使其在一组客户端之间循环。LabVIEW向每个客户端发送一份数据,同时需维护一组对接受数据感兴趣的客户端,这样便造成了双倍的网络报文量。
多点传送用于网上单个发送方与多个客户端之间的通信,无须发送方维护一组客户端或向每个客户端发送多份数据。如要从一个多点传送的发送方接收数据广播,所有的客户端须加入一个多点传送组。但发送方无须为发送数据而加入这个组。发送方指定一个已定义多点传送组的多电传送IP地址。多点传送IP地址的范围是224.0.0.0到239.255.255.255。如客户机要加入一个多点传送组,客户机即订阅了该组的多点传送IP地址。一旦接受多点传送组的传送地址,客户端便会收到发送至该多电传送IP地址的数据。
如需在LabVIEW中进行多点传送,可用打开UDP多点传送VI打开能够进行读、写和UDP数据读、写的连接。需指定写数据的停留时间(TTL)、读数据的多点传送地址和读写数据的多点传送端口号。TTL默认值为1,即LabVIEW仅将数据发送至本地子网。路由器收到一个多点传送数据报后,将数据报的TTL值递减。如TTL大于1,路由器将数据报转发给其他路由器。以下表格为指定不同TTL参数后,多点传送数据报所发生的相应动作。
0 数据报停留在主机上。
1 数据报已发送到本地子网上接受同一IP地址的所有客户端。集线器/中继器和桥接器/交换机转发数据报。如TTL为1则路由器不转发数据报。
>1 数据报已发送且由路由器经TTL-1层转发。
请参考以下运用UDP多点传送的实例VI。
TCP
TCP能进行可靠的网络传输,可按顺序传输数据而毫无错误、遗失或重复。TCP会不断地传输数据报直至收到接收响应为止。
在LabVIEW中使用TCP
TCP是基于连接的协议,这意味着各传输点必须在数据传输前创建连接。数据传输在客户端和服务器之间进行。TCP允许多个同步连接。
注: 可在一个端口上创建最多1024个TCP连接。
可通过等待入局的连接或寻找具有指定地址的连接来创建连接。在创建TCP连接时,须指明其地址及该地址的端口。一个地址上不同的端口表示该地址上的不同服务。
通过打开TCP连接函数可主动创建一个具有特定地址和端口的连接。如连接成功,该函数将返回唯一识别该连接的网络连接句柄。这个连接句柄可在此后的VI调用中引用该连接。
以下方法用于等待一个入局的连接:
通过TCP侦听VI创建一个侦听器并等待一个位于指定端口已被接受的TCP连接。如连接成功,VI将返回一个连接句柄、连接地址以及远程TCP客户端的端口。
通过创建TCP侦听器函数创建一个侦听器,用“等待TCP侦听器”函数侦听和接受新连接。等待TCP侦听器函数返回连接至函数的侦听器ID。在结束等待新连接后,用关闭TCP连接函数关闭侦听器。侦听器无法进行读写操作。
上述做法的优点在于以“关闭TCP连接”函数取消侦听操作。在侦听连接时无须使用超时,而在另一个条件为真时侦听被取消。可随时关闭TCP侦听VI。
连接创建完毕后,可通过读取TCP数据函数及写入TCP数据函数对远程程序进行数据读写。
通过“关闭TCP连接”函数关闭与远程程序的连接。当连接关闭而仍有未读数据时,这些数据将遗失。可通过更高层次的协议来指明何时关闭连接。
TCP和UDP的选择
TCP是保证可靠数据传输的最佳协议。UDP协议无需创建连接且性能更优,但无法保证可靠的数据传输。
超时和错误
设计网络应用程序时,应仔细考虑故障发生时的情形。例如,服务器崩溃时客户端应如何处理。
解决方法之一是确保每个客户端VI具有超时设定。如一段时间后出现操作无效,客户端应继续执行。继续执行时,客户端可尝试重新建立连接或报告错误。如有必要,客户端VI可关闭程序。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目问题,可联系我们。