目录
1、UDP通信原理
2、硬件环境部署
3、云端环境部署
4、UDP通信函数
5、程序架构
6、前面板设计
7、程序框图设计
8、测试验证
本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。
结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系统的快速开发与原型设计,助你从基础到实战,全面掌握物联网开发技能。
开源免费LabVIEW学习专栏分享:
LabVIEW仪器控制专栏:https://blog.csdn.net/m0_38106923/category_11798471.html?spm=1001.2014.3001.5482
LabVIEW开发技巧专栏:https://blog.csdn.net/m0_38106923/category_11616435.html?spm=1001.2014.3001.5482
LabVIEW和单片机(Arduino)专栏:https://blog.csdn.net/m0_38106923/category_11828609.html?spm=1001.2014.3001.5482
LabVIEW工业图像处理与机器视觉实战专栏:https://blog.csdn.net/m0_38106923/category_10963783.html?spm=1001.2014.3001.5482
LabVIEW物联网开发实战专栏:https://blog.csdn.net/m0_38106923/category_12839370.html?spm=1001.2014.3001.5482
本章节将简要阐述UDP通信的基本原理,以工业物联网平台TLINK中云端设备的数据发布设计为对象,阐明互联网环境下UDP客户端应用程序设计的基本方法,以及工业物联网平台TLINK中UDP设备的创建、通信数据帧的构造和测试。
在UDP客户端应用程序设计框架的基础上,将提供数据采集计算机与物联网云端设备之间通信程序实现的完整步骤以及程序运行结果的测试。
项目资源下载:https://download.csdn.net/download/m0_38106923/87404748
1、UDP通信原理
UDP(用户数据报协议)是个简单的数据报传输层协议,用来处理网络中的数据包,它是一个无连接的协议。UDP不保证传输的可靠性,只是把数据报从应用程序传到IP层,但不能保证它们一定能到达目的地。因为UDP在传输数据报前不需要建立连接,也没有超时重发等机制,所以传输速度较快。
UDP通信有以下特点:
- 每个分组都有完整的目的地址;
- 发送数据前不需要建立连接;
- 不检查数据包的顺序,不能保证分组的先后顺序;
- 不进行分组出错的恢复和重传;
- 不保证数据传输的可靠性。
在网络质量差的环境下,UDP数据包丢失会比较严重。但由于UDP的特性(非连接型协议,资源消耗小、处理速度快),在传输音频、视频和普通数据时常用UDP,即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
使用UDP网络发送数据时要注意:必须在同一个局域网中,且要在一个网段,跨网不能直接通信;互相ping通后才能通信。进行UDP通信时,要明确发送端(有时也叫客户端)和接收端(有时也叫服务器)。基于UDP编写通信软件时,程序设计的基本流程如下图所示。
UDP通信有单播、广播、组播三种模式:
- 单播用于两个主机之间的端对端通信,即一对一;
- 广播用于一个主机与整个局域网上所有主机的通信,即一对所有。广播在Internet宽带网上传输是被禁止的,否则容易引发广播风暴。主机发送广播消息时,需要指定目的IP地址(255.255.255.255)和接收者的端口号;
- 组播(多播)用于一组特定主机的通信,而不是整个局域网上的所有主机,即一对一组。在多播系统中,有一个源点、一组终点,这是一对多的关系。在这种通信中,源地址是一个单播地址,而目的地址是一个组地址。
在IPv4中,组地址是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址三类。
单播和广播是两个极端,要么实现一个主机的通信,要么实现整个局域网上的主机的通信。
实际情况下,经常需要实现一组特定主机的通信,而不是整个局域网上的所有主机的通信,这就是组播的用途。
2、硬件环境部署
基于UDP的通信程序设计,得保证电脑能连上网(不管是有线还是无线,方式不限)。因为路由器的限制,普通的UDP通信程序只能在局域网里的电脑之间传数据。
但物联网经常要跨大范围、多平台地通信。这可以通过物联网平台来实现——数据采集系统把数据上传到物联网平台,然后其他设备从平台那儿获取数据,这样就能实现物联网,达到数据交换和共享的目的。
只要电脑能上网,还能ping通远程物联网服务器,就可以写基于UDP的数据通信程序了。下图展示的是用路由器连上互联网,实现电脑和TLINK物联网云平台的连接。
这种组网方式靠物联网云平台,能让不同网段的设备之间传数据。在这个例子中,电脑通过家用或办公室的路由器连上互联网,就能访问TLINK物联网平台了。
3、云端环境部署
UDP通信得让客户端和服务器两部分程序都做好,不过为了让系统开发简单点,这里用物联网开发平台来搞UDP服务器的事儿,应用系统开发就可以主要关注UDP客户端啦,这样就能实现一种基于系统集成思想的物联网应用快速、高效开发。在这个例子里面,我们用工业物联网平台TLINK来创建一个UDP的虚拟设备,相关信息看下面的图哦。
这时候,TLINK物联网开发平台就像是个功能齐全的服务器。通常,开发物联网应用的时候,你只需要关注怎么从客户端收集数据,然后连接到TLINK物联网平台,把数据发布上去就行了。
下面是这个向TLINK物联网云平台上传测量数据的UDP通信程序具体能干点啥:
- 用随机数生成的办法,模拟定时采集两路数据。
- 能把采集到的数据打包成TLINK自定义数据协议对应的包。
- 在本地,能用多路信号波形图表展示采集到的数据。
- 能分别显示系统当前时间、数据采集时间,还有最新采集的两路数据值。
- 还能用UDP通信技术把数据传到TLINK物联网平台,实现给指定设备更新相关数据。
4、UDP通信函数
在LabVIEW里,你要找UDP串行通信的节点,就在“函数→数据通信→协议→UDP”里头,看下图就知道啦。
UDP通信的主要函数节点和VI以及它们的功能都在下表里。
LabVIEW里设计UDP通信程序挺简单的,拿数据发送来说,最少用“打开UDP”“写入UDP数据”“关闭UDP”这3个函数节点,再加上While循环结构,就能连续发送了,看下图。
在实际应用里,你可以在轮询设计模式、事件响应设计模式、状态机设计模式等等里面灵活用这3个节点,实现UDP数据发送。接收UDP数据也差不多,最少也是用那3个节点和While循环,不过大多数情况下,UDP通信的发送和接收数据是并行工作的。
一个典型的UDP并行收发程序框图如下图所示。
5、程序架构
程序将模拟人工控制的数据采集,并把数据上传到云端。当用户点击“开始数据采集”按钮时,程序会按照用户设定的时间间隔不断采集和上传数据。
用户再次点击按钮,程序就会暂停采集和上传,然后再次循环。为了简化程序设计,我们采用了轮询设计模式——在While循环结构中,程序使用条件结构检测前面板上的布尔类控件操作状态和“已用时间”节点状态,并根据检测结果进行处理。
主要检测和处理的状态有:
- 数据采集按钮操作状态检测:按钮在“开始数据采集”和“暂停数据采集”之间切换。当按钮状态为“真”时,采集数据并上传云端;否则不处理。
- “已用时间”节点状态检测:检查指定目标时间是否已到。如果已到,开始依次进行数据采集和云端上传。
- “停止”按钮操作状态检测:检测点击按钮是否导致其值发生改变。如果满足条件,则退出程序。
为了让程序的人机交互效果更好,我们在循环事件处理结构的基础上,添加了顺序结构,将程序分为两个顺序帧。
- 第一个帧是程序初始化帧,用于完成程序运行前各类控件的初始化;
- 第二个帧是主程序帧,即前面创建的循环事件处理程序结构,用于实时检测程序中的各类状态,并根据检测结果进行处理。
6、前面板设计
按照以下步骤来完成前面板的控件设置:
步骤1:要设置TLINK平台中UDP服务器的IP地址,就得添加一个字符串类控件,叫“字符串控件”(控件→新式→字符串与路径→字符串控件),然后把标签设为“服务器”。
步骤2:要设置TLINK平台中UDP服务器对应的端口,就得添加一个数值类控件,叫“数值输入控件”(控件→新式→数值→数值输入控件),然后把标签设为“远程端口”,数据类型设为U16。
步骤3:要设置TLINK平台中本机对应的端口,就得添加一个数值类控件,叫“数值输入控件”(控件→新式→数值→数值输入控件),然后把标签设为“本地端口”,数据类型设为U16。
步骤4:要触发数据采集事件,就得添加一个布尔类控件,叫“确定按钮”(控件→新式→布尔→确定按钮),然后把标签设为“采集按钮”,按钮显示文本设为“启动数据采集”。
步骤5:要确定用户结束程序操作,就得添加一个布尔类控件,叫“停止按钮”(控件→新式→布尔→停止按钮),按钮标签和显示文本保持默认值。
步骤6:要显示2路数据采集波形,就得添加一个图形类控件,叫“波形图表”(控件→新式→图形→波形图表)。
步骤7:要显示系统当前时间,就得添加一个字符串类控件,叫“字符串显示控件”(控件→新式→字符串与路径→字符串显示控件),然后把标签设为“系统时间”。
步骤8:要显示每一次数据采集时间,就得添加一个字符串类控件,叫“字符串显示控件”(控件→新式→字符串与路径→字符串显示控件),然后把标签设为“采集时间”。
步骤9:要显示当前采集的2路数据取值,就得添加一个字符串类控件,叫“字符串显示控件”(控件→新式→字符串与路径→字符串显示控件),然后把标签设为“当前数据”。
接下来,要调整各个控件的大小和位置,让操作界面看起来更和谐、友好。最后完成的程序前面板设计结果如下图所示。
7、程序框图设计
步骤1:程序的整体结构分为两帧,第一帧是初始化设置,第二帧是实现主要功能。
创建一个两帧的顺序结构,将第一帧的“子程序框图标签”设为“初始化”,在第一帧中调用“打开UDP”(函数→数据通信→协议→UDP→打开UDP)节点,设置连接参数,实现本地UDP端口的创建和打开;通过局部变量赋值、属性节点调用等方式,实现程序运行初始状态下相关控件的初始化赋值。最后,完成的初始化帧程序子框图设计结果如下图所示。
第二步:在顺序结构里,把第二帧的“子程序框图标签”改成“主程序”,这样能让程序框图更好读懂。
主程序就是“While循环结构+条件结构+移位寄存器”的轮询方式,用来检查程序界面里“数据采集”按钮的动作状态,参照下图。
步骤3:在While循环里,把“采集按钮”控件与条件结构连起来,以便在程序轮询状态下判断是否开始采集数据。
调用“获取日期/时间字符串”节点(函数→编程→定时→获取日期/时间字符串),把“需要秒?”端口设为真,然后调用“连接字符串”节点,把“获取日期/时间字符串”节点的日期和时间字符串用空格连接起来,形成完整的字符串。最后,把结果放到“系统时间”控件上,这样就能实时更新显示了,如下图所示。
步骤4:在“采集按钮”连接的条件结构里,当满足“真”(点击按钮,开始采集)时,用属性节点把“采集按钮”的显示文本改成“停止数据采集”,让一个按钮具备两种功能的操作提示。
为了让程序每隔3秒采集一次数据(采样速率小于1Hz,物联网开发平台会禁用访问设备),我们添加一个“已用时间”节点(函数→编程→定时→已用时间),设置“目标时间”为3秒,并勾选“超过目标时间后自动重置”。
它的输出端口“结束”连接条件结构(函数→编程→结构→条件结构),用来判断目标时间是否到达,从而实现用户点击“启动数据采集”按钮后,程序定时执行后续工作的结构,如下图所示。
步骤5:当“已用时间”节点满足条件结构为“真”(3秒间隔时间到,开始一次数据采集)时,在分支子框图中,我们通过生成随机数来模拟数据采集。
将采集到的两组数据打包成符合TLINK物联网平台创建UDP设备用户协议的数据帧。首先,根据TLINK平台的要求,我们调用“打开UDP”节点(函数→数据通信→协议→UDP→打开UDP),然后按照TLINK定义的数据帧格式,以设备序列号作为前缀,将采集的数值类型转换为字符串类型,接着调用“连接字符串”节点(函数→编程→字符串→连接字符串),构建发送数据帧。
最后,调用“写入UDP数据”节点(函数→数据通信→协议→UDP→写入UDP数据),实现本地采集数据上传物联网平台的功能。
同时,我们还需要调用“捆绑”节点(函数→编程→簇、类与变体→捆绑),将采集的数据封装为簇数据类型,并通过波形图表进行显示。相应的程序子框图如下所示。
步骤6:在“采集按钮”控件连接的假条件结构分支里,创建一个“采集按钮”控件属性节点,将其设置为写入模式,并赋值为“启动数据采集”(这样就可以再次点击按钮开始采集了)。
然后,直接连接左右两边的UDP资源引用和错误信息传递,相关的程序子框图如下所示。
步骤7:为了实现应用程序能比较“优雅”地退出,While循环结构之外,还需完成以下操作。
调用节点“关闭UDP”(函数→数据通信→协议→UDP→关闭UDP),实现UDP通信中资源引用的释放。
调用节点“清除错误”(函数→编程→对话框与用户界面→清除错误),采取简单、直接的方式清除程序执行过程中出现的错误。
至此,完整的基于UDP通信技术的物联网平台采集数据上传程序全部完成,对应的完整程序框图如下图所示。
8、测试验证
点击工具栏上的“运行”按钮,测试程序功能。
点击“启动数据采集”按钮,你会发现每3秒钟就会采集一次数据,波形图表中会显示两路数据的波形。系统时间、采集时间、当前数据都能正确显示,结构如下图所示。
此时,进入TLINK物联网平台用户账号对应的监控中心,你会发现本地采集的数据已经按预期上传到云端,如下图所示。
物联网平台创建UDP设备实时数据显示结果与本地采集数据完全一致,这说明在物联网应用中,传统的互联网通信技术中的UDP通信仍然有其地位。使用LabVIEW可以非常轻松地建立与物联网云平台的UDP连接,实现本地采集数据的物联网云平台上传。
项目资源下载:https://download.csdn.net/download/m0_38106923/87404748