目录
1、TCP通信原理
2、硬件环境部署
3、云端环境部署
4、TCP通信函数
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
在本节中,我们将简要探讨TCP通信的基础知识,并以工业物联网平台TLINK中的云端设备数据发布设计为例,详细阐述在互联网环境下TCP客户端应用程序设计的基本方法。
同时,我们还将介绍如何在TLINK平台上创建TCP设备、构造通信数据帧以及进行测试。
除此之外,我们将在TCP客户端应用程序设计框架的基础上,给出数据采集计算机与物联网云端设备之间通信程序实现的完整步骤,以及程序运行结果的测试方法。
本节的例子旨在为基于TCP的数据采集终端实现物联网云端数据发布功能的相关应用程序设计提供一些参考和借鉴。
1、TCP通信原理
TCP是一种基于连接、可靠且基于字节流的传输层通信协议。在数据交换之前,客户端和服务器会先建立TCP连接,以便相互传输数据。TCP还提供超时重发、丢弃重复数据、检验数据、流量控制等功能,确保数据能从一端顺利传至另一端。
TCP通信的主要优点是可靠和稳定。TCP在传递数据之前会进行"三次握手"以建立连接,并在数据传输过程中采用确认、窗口、重传和拥塞控制机制。数据传输完成后,TCP会断开连接,避免占用系统资源。
然而,TCP也存在传输速度慢、效率低、占用系统资源多以及易受攻击等缺点。TCP建立连接需要时间,数据传输过程中的确认机制、重传机制和拥塞控制机制也会消耗大量时间。此外,每台设备都需要维护所有传输连接,实际上每个连接都会占用系统的CPU和内存等资源。TCP的确认机制和三次握手机制使其容易受到DoS、DDoS、CC等攻击。
TCP通信适用于对网络通信质量有较高要求的场景,例如需要确保数据准确无误地传递给对方的应用,如HTTP、HTTPS、FTP等传输文件的协议,以及POP、SMTP等邮件传输协议。在物联网应用开发中,除了直接使用TCP通信,还常使用其应用层协议,如HTTP、MQTT协议等。
TCP的通信过程类似于打电话。一方负责监听特定号码的电话,另一方需要拨通这个号码与对方建立连接。双方都可以通过听筒(输入流)接收对方的信息,通过话筒(输出流)向对方发送信息,整个过程实现双工通信。"客户端-服务器"模式贯穿整个过程,程序设计需要编写客户端应用程序和服务器应用程序。
基于TCP编写通信软件时,整个传输过程如下:
- 1. 服务器通过主机名或IP地址与端口号建立侦听,等待客户端连接。
- 2. 客户端根据主机的主机名或IP地址和端口号发出连接请求。
- 3. 服务器与客户端建立连接后,通过读写函数进行TCP数据通信。
- 4. 关闭连接。
对应的TCP通信中的客户端与服务器工作基本流程如下图所示。
2、硬件环境部署
基于TCP的通信程序得设计,得保证电脑能连上网(不管是有线还是无线,方式不限)。
但是因为路由器的限制,普通的TCP通信程序只能在局域网里的电脑之间传数据。
而物联网很多时候是要在很大范围、很多平台上通信,这时候就可以用物联网平台做中介——数据采集系统把数据上传到物联网平台,其他终端再从物联网平台下载数据,这样就能实现物联网,达到数据交换、共享的目的。只要电脑能上网,能ping通远处的物联网服务器,就可以写基于TCP的数据通信程序了。
如下图,电脑用无线网卡通过本地热点连互联网,和TLINK物联网云平台建立连接。
这种组网方式,通过物联网云平台,可以让不同网段的终端互相通信。在这个例子中,电脑通过家用或办公室的路由器连互联网,就能访问TLINK物联网平台了。
3、云端环境部署
一般来说,TCP通信需要设计客户端和服务器两部分程序。
在物联网应用开发中,服务器部分的功能需求很多,一般程序员很难掌握。因此,大型物联网应用开发通常是多学科成员共同完成的项目,一个人很难进行系统级的开发。这也让许多非计算机专业的技术人员对大型复杂的物联网系统望而却步。
然而,近年来物联网开发平台的广泛应用,使得物联网系统开发模式发生了根本性的变化。通过物联网开发平台,可以将物联网应用系统中的服务器功能委托给平台,从而使应用系统开发更侧重于客户端开发。
这样,就可以实现基于系统集成思想的物联网应用的快速、高效开发,为非计算机专业人员快速入门物联网应用开发提供了新的思路。
在这个例子中,我们使用工业物联网平台TLINK创建了一个TCP虚拟设备,相关信息如下图所示。
此时,TLINK物联网开发平台相当于一个功能完备的服务器。通常,物联网应用开发只需要关注客户端采集状态数据、连接TLINK物联网平台并将采集的数据发布到物联网开发平台即可。
向TLINK物联网云平台上传测量数据的TCP通信程序实现的具体功能如下:
- 使用随机数模拟2路数据的定时采集(采样速率可由用户控制)。
- 将采集的数据封装为TLINK中自定义数据协议对应的数据包。
- 在本机以多路信号波形图表的形式显示采集的数据。
- 分别显示系统当前时间、数据采集时间以及最新采集的2路数据值。
利用TCP通信技术将采集数据传输至TLINK物联网平台,实现指定设备相关数据的更新。
4、TCP通信函数
在LabVIEW里,要找TCP通信的节点,你得去"函数→数据通信→协议→TCP"这个子选板找,就像下图这样。
TCP通信主要函数节点和VI及其功能如下表所示。
在进行LabVIEW的TCP通信程序设计时,我们至少需要3个节点,程序框图就像下图这样。
在实际应用中,你可以灵活地运用这3个节点,在轮询、事件响应、状态机等各种程序设计模式中实现TCP发送数据功能。
而接收TCP数据时,最少也需要用到“打开TCP连接”、“读取TCP数据”和“关闭TCP连接”这三个函数节点,再加上一个While循环结构。同时,接收TCP数据时,还需要根据接收节点的工作模式来设置接收字节数和超时参数。
在大多数场景下,TCP通信中的发送和接收数据是并行进行的。一个典型的TCP并行收发应用程序的框图如下所示。
5、程序架构
程序要实现模拟人工控制的数据采集,然后把数据上传到云端。用户只要点击“开始数据采集”按钮,程序就会按照用户设定的时间间隔不停地采集和上传数据。
当用户再次点击时,程序就会暂停采集和上传,如此反复。为了简化程序设计,我们采用了轮询设计模式——在While循环结构中,程序用条件结构检测前面板上的“启动数据采集”按钮的状态,以及“已用时间”节点的状态,然后根据检测结果进行相应处理。主要检测和处理的状态有:
- “数据采集”按钮操作状态检测——这个按钮在“开始数据采集”和“暂停数据采集”之间切换,按钮的机械动作模式是“单击时转换”,当按钮状态为“真”时,采集数据并上传云端,否则什么都不做。
- “已用时间”节点状态检测——检测是否达到了指定的目标时间,如果达到了,就开始进行数据采集和云端上传。
- “停止”按钮操作状态检测——检测是否存在点击按钮导致其值发生变化的条件,如果满足条件,就退出程序。
为了让程序的人机交互效果更好,我们在循环事件处理结构的基础上,增加了顺序结构,把程序分成了两个顺序帧。第一个帧是程序初始化帧,用于完成程序运行前各种控件的初始化;第二个帧是主程序帧,也就是前面创建的循环事件处理程序结构,用于实时检测程序中的各种状态,并根据检测结果进行相应处理。
6、前面板设计
按照以下步骤来完成前面板控件设置:
步骤1:添加一个字符串类控件叫做“字符串控件”(控件→新式→字符串与路径→字符串控件),设置标签为“TLINKTCP服务器”。
步骤2:添加一个数值类控件叫做“数值输入控件”(控件→新式→数值→数值输入控件),设置标签为“远程端口”,数据类型选择U16(16位整数数据类型)。
步骤3:再次添加一个数值类控件叫做“数值输入控件”,设置标签为“本地端口”,数据类型选择U16。
步骤4:添加一个数值类控件叫做“数值输入控件”,设置标签为“采集间隔(s)”,数据类型选择U8。
步骤5:添加一个布尔类控件叫做“确定按钮”(控件→新式→布尔→确定按钮),设置标签为“采集按钮”,按钮显示文本为“启动数据采集”。
步骤6:添加一个布尔类控件叫做“停止按钮”(控件→新式→布尔→停止按钮),按钮标签和显示文本保持默认值。
步骤7:添加一个图形类控件叫做“波形图表”(控件→新式→图形→波形图表)。
步骤8:添加一个字符串类控件叫做“字符串显示控件”(控件→新式→字符串与路径→字符串显示控件),设置标签为“系统时间”。
步骤9:再次添加一个字符串类控件叫做“字符串显示控件”,设置标签为“采集时间”。
步骤10:添加一个字符串类控件叫做“字符串显示控件”,设置标签为“当前数据”。
然后调整各个控件的大小和位置,让操作界面看起来更和谐、友好。最后完成的程序前面板设计结果如下图所示。
7、程序框图设计
步骤1:做个两帧的顺序结构,第一帧是初始化帧。把第一帧的“子程序框图标签”改成“初始化”,这样程序框图就更好看了。
创建一个“采集按钮”的局部变量,设置成可写的,初始值是个布尔类型的“假”。(在前面的板子上右键点击这个按钮,选“机械动作→单击时转换”,让按钮变成单击时状态转换并保持的那种)。
然后在前面板子上右键点击“波形图表”,选“创建→属性节点→历史数据”,创建一个“波形图表”的属性节点,也是可写的,初始值是一个包含两个数值的簇。
这样波形图表在程序开始的时候就能清空画面了。
再创建几个字符串类控件“系统时间”、“采集时间”、“当前数据”的局部变量,初始值都设为空字符串,这样一开始运行的时候控件显示的内容就是空的。
接着,创建一个“采样间隔(s)”的数值类局部变量,初始值设为U8类型的2。然后是“本地端口”的数值类局部变量,初始值设为U16类型的8888。
再来是“远程端口”的数值类局部变量,初始值设为U16类型的8647。最后,创建一个“TLINKTCP服务器”的字符串类局部变量,初始值设为TLINK平台TCP服务器的域名“tcp.tlink.io”。
完成后的初始化帧程序子框图设计效果就像下图那样。
第二步:在顺序结构里,把第二帧的“子程序框图标签”改成“主程序”,这样能让程序框图更好懂。主程序就是“While循环结构+条件结构+移位寄存器”这种轮询式的整体结构,看下图就知道了。
在开始循环之前,我们用“打开TCP连接”节点(函数→数据通信→协议→TCP→打开TCP连接)来建立本机和物联网平台的连接。循环结束后,再用“关闭TCP连接”节点(函数→数据通信→协议→TCP→关闭TCP连接)来释放程序占用的资源。
步骤3:在“采集按钮”的连接条件里,搞定程序轮询状态,检查要不要开始采集数据,以及定时采集的条件达不达到。如果“采集数据”的条件是“真”,那就用属性节点把“采集按钮”的文本改成“暂停数据采集”。
为了能让用户指定时间间隔来采一次数据,我们用一下“已用时间”节点(函数→编程→定时→已用时间),然后看看它的输出端口“结束”状态。要是状态是“真”,那就说明定时条件满足了,可以开始采集数据并且上传到物联网云平台。具体的程序子框图,看下图就行了。
步骤4:在While循环结构里,添加一个“获取日期/时间字符串”节点(函数→编程→定时→获取日期/时间字符串),把“需要秒?”端口设为真。接着调用“连接字符串”节点,将“获取日期/时间字符串”节点输出的日期和时间字符串合并成一个带空格的完整字符串。
最后,把结果放到“系统时间”控件里,这样程序运行时就能显示当前时间信息了。对应的程序子框图如下图所示。
步骤5:当"已用时间"节点满足条件(2秒间隔时间到)时,开始数据采集。在对应的分支子框图中,我们通过生成随机数来模拟数据采集过程。
接着,我们调用"转换为无符号单字节整型"节点将模拟采集的数据转换为字节类型。然后,使用"创建数组"节点将采集到的两组数据封装成符合TLINK物联网平台创建TCP设备用户协议的数据帧。
之后,通过"字节数组至字符串转换"节点将封装好的数据帧转换为LabVIEW中的字符串类型通信数据。按照TLINK平台的规定,我们首先调用"写入TCP数据"节点发送拟连接的设备序列号,延时50ms后,再发送封装好的数据帧对应的通信字符串。这样就可以完成本地采集数据上传物联网平台的功能。
为了增强程序功能,我们用波形图表和数值显示控件来展示采集到的数据,同时用字符串显示控件显示采集数据的时间。这样方便我们后续与物联网平台接收到的数据进行比对。对应的程序子框图如下图所示。
步骤6:在节点“已用时间”连接的条件结构里,当满足“假”(也就是指定的间隔时间还没到)时,不启动数据采集。在这个分支子框图里,直接连接左右两边的TCP资源引用和错误信息传递,如下图所示。
步骤7:在按钮控件“采集按钮”连接的假分支子框图里,右键点击“采集按钮”,选择“创建→属性节点→布尔文本→文本”,新建一个属性节点。将这个节点设置为写入模式,并填入“启动数据采集”(这样当你再次点击按钮时,采集工作就会开始)。然后,直接连接左右两边的TCP资源引用和错误信息传递。对应的程序子框图就像下图这样。
步骤8:为了让应用程序更“优雅”地退出,除了使用While循环结构之外,我们还需要调用“关闭TCP连接”节点(函数→数据通信→协议→TCP→关闭TCP连接)来释放TCP通信占用的资源,同时调用“清除错误”节点(函数→编程→对话框与用户界面→清除错误)来简单、直接地清除程序执行过程中出现的错误。
这样,一个基于TCP通信技术的物联网平台采集数据上传程序就全部完成了。完整的程序框图如下所示。
8、测试验证
点击工具栏上的“运行”按钮,让程序功能接受检验。然后,按下“启动数据采集”按钮,你会看到数据每隔2秒钟被采集一次,波形图中展示了2路数据的波动,系统时间、采集时间以及当前数据都准确无误地呈现出来,就像下图所展示的那样。
此时,打开TLINK物联网平台用户账号对应的监控中心,您会看到本地采集的数据正如期上传至云端,如图所示(设备名为“sustei_TCP03”)。
物联网平台上创建的TCP设备实时数据显示结果与本地采集数据完全一致,由此可见,传统互联网通信技术中的TCP通信在物联网应用中仍具有举足轻重的地位。利用LabVIEW,我们可以非常便捷地建立起与物联网云平台的TCP连接,从而实现本地采集数据的上载至物联网云平台。