基于MQTT协议的物联网云端串口波形显示小程序
系统原理和实现细节
本项目是基于MQTT
协议实现机器到机器的物联网通信系统。由于MQTT
是一个极其轻量级的发布/订阅
消息传输协议,他是专门用于低带宽高延迟或者不可靠的网络环境设计的,因此在本项目中云端串口的通信质量稳定性和硬件性能都有较好的表现。 MQTT
它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景,因此它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。
在整个系统中,由于使用物联网平台进行转发,为了实现通用可靠,所以需要将波形显示相关的数据处理在边缘设备实现完成。在边缘设备上数据采集设备只需要将数据以串行的方式向物联网平台发送数据即可,而串口波形显示终端需要将经由物联网平台转发的数据信息进行提取分析和最后的显示即可实现数据波形功能。
具体实现使用的产品和服务
本项目是基于移远QUECTEL BC260Y-CN
的NB-IOT
模块进行开发的云端串口波形显示系统,该模块作为远程数据采集设备,用于双向通信和单向数据采集。
双向通信:移动应用程序和物联网设备进行双向的数据传输。
单向数据采集:物联网设备向移动应用程序不断发送设备自身获取到的数据。
这里使用阿里云物联网平台
作为物联网通信平台,用于对数据采集设备和移动串口波形显示终端的通信数据进行转发。
移动串口波形显示终端使用微信小程序
作为波形显示的移动终端。
系统原理基础
由于本系统是使用MQTT协议来完成整体数据通信,所以有必要先简单了解MQTT的通信原理和相应的通信机制。实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish
)、代理(Broker
)、订阅者(Subscribe
)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic
)和负载(Payload
)两部分:
Topic
:可以理解为消息的类型,订阅者订阅(Subscribe
)后,就会收到该主题的消息内容(Payload
);Payload
:可以理解为消息的内容,是指订阅者具体要使用的内容。
MQTT
整个服务会构建底层网络传输:它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。当应用数据通过MQTT
网络发送时,MQTT
会把与之相关的服务质量(QoS
)和主题名(Topic
)相关连。
这里服务质量有三个等级,不同等级的定义内容如下:
QoS 1
:”至多一次”,消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,若智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。
QoS 2
:”至少一次”,确保消息到达,但消息重复可能会发生。
QoS 3
:”只有一次”,确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
基于MQTT
协议的工作原理,物联网平台需要创建MQTT
服务实例用于和两个边缘设备(数据采集设备和移动串口波形显示终端)建立会话连接,其作用是充当MQTT
代理角色,在创建好的MQTT
服务实例上需要为两个边缘设备分别定义Topic
,这里两个设备都需要定义一个tx Topic
和一个rx Topic
,并同时订阅两台设备自身的tx Topic
,这个的作用是将订阅者和发布者之间的数据内容按照数据流向进行分类,tx
作为上传主题,rx
作为下载主题,这样可以通过平台便于管理设备和设备之间的通信连接,同时也简化通信模式。
物联网平台建立Topic
后,两台边缘设备就可以实现与MQTT
服务实例进行连接了。两台边缘设备通过配置与物联网平台对接的参数,再订阅每个设备自身对应的rx Topic
,即可实现边缘设备和代理之间的通信。设备可以通过向自身的tx Topic
发布负载内容实现向代理发送数据信息。代理从订阅的两个rx Topic
中接收到边缘设备发送的数据信息,但此时边缘设备之间不能进行相互通信。根据物联网平台服务可以建立设备之间的MQTT
消息规则转发,从而实现两台对等设备之间的全双工通信。物联网平台需要在MQTT
服务实例上定义规则,将从一台边缘设备发布到代理的tx Topic
的数据转发到另一台边缘设备订阅的rx Topic
,反过来也是同理。这样就实现了设备与设备之间的相互通信。目前为止,设备之间可以进行简单的双向通信。但移动串口终端仍然不能将数据采集设备发送过来的数据解析并转换成波形图显示。
波形显示实现
由于考虑到物联网平台的影响,为了实现波形显示功能的通用性,所以必须减少对物联网平台的依赖性。因此就不能在物联网平台上进行相关的数据解析和数据处理,所以需要在设备之间可以双向通信的基础上,将数据解析和处理的部分在移动串口终端上进行实现。
这里先定义一种通信标准(或者称为协议),数据采集设备上传的数据需要以数据帧的格式向代理发送数据内容,其原因是方便处理。一般的数据帧包括帧头,数据内容和尾部冗余校验。常见的通信协议帧基本都是这样的结构,由于MQTT
协议是基于TCP
协议封装而成的一个轻量化通信协议,TCP
协议是一种可靠的传输协议,即确保数据能够传输到指定目标,因此,可以在常见的数据帧的结构中把尾部冗余校验去掉来降低传输数据的开销,并且保留数据帧头用于区分不同的数据帧。这样就明确了数据帧的收发格式只有帧头和数据内容。
现在可以通过数据帧头识别数据内容的起始位置,来定位读取数据内容信息。需要注意的是,由于受到网络环境,设备硬件等影响,数据采集设备如果每次发送一帧数据则会导致本地获取到的数据和云端显示的数据延迟在不断的增大,所以这里采用一次发送大量的数据帧。移动串口终端需要一次接收大量的数据帧并同时解析提取数据帧中的数据。移动终端在处理数据帧的信息解析和提取的任务之后需要将信息放在缓存区,当缓存区需要更新的时候则将缓存区的数据发送至界面上并显示波形,这里暂时先不谈从缓存区到波形如何显示。当缓存区溢出或者说是数据帧全部都移动到缓存区后会触发缓存区更新,最终实现波形更新显示。
在从缓存区更新数据到波形显示的过程中,移动串口终端每次解析大量的数据帧并把数据帧提取出来的信息按照先入先出的顺序存放至缓存区。当缓存区接收到缓存更新信号时,移动串口终端会从缓存区将数据映射到波形图界面上。
在波形图的显示方式上,由于受到通信环境等其他影响,数据采集设备向移动串口终端发送的消息不一定都是等时长的。那么可以考虑将数据波形显示时根据帧数作为参考来显示具体的波形某一帧的幅值大小,将连续的数据帧用直线段连接即可完成波形图的显示。通过发送设备的发送消息速率和一次消息发送多少帧可以估算出移动串口终端上的波形显示一帧需要多少时间。由此,如果发送的数据信息是具有周期规律的,那么可以计算出波形的周期、频率等一些必要参数。
确定了波形显示参考方式后,那么就只有具体的波形绘制方法需要解决。常见的波形显示只需要将界面等间隔的几列上将不同帧上的数据经过一定比例转换后,在一列上显示一定的高度或者距离用来表示当前帧或者时刻上的幅值信息。但由于不同情况下波形分析的不同需求,所以需要做到不同单位帧数的波形显示,此效果和示波器调整横向的时间轴效果一致。基于上述需求分析,将波形可以显示的界面宽度等间距分成不同数量后,每间隔一段相等距离更新一帧数据,最后形成一个完整波形。当需要跳帧横向单位帧数时,通过改变界面宽度的等分数量来调整列和列之间的间距最后在每一列上将数据进行转换然后绘制实现波形的拉伸。
按照上述分析就实现了云端串口波形显示系统。
D-Veda/Serial-over-Internet: 使用MQTT协议基于阿里云平台实现物联网传输的云端串口调试助手 (github.com)
基于MQTT协议的物联网云端串口波形显示小程序