#创作者激励#采用MQTT协议设计的实时图传系统(阿里云) 原创 精华
一、项目功能介绍
当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服务器上需要配置云产品流转,让设备A的数据上传后自动发送给设备B。这样就完成了视频画面数据的流转。不过因为阿里云的最大数据限制,每次最大发送10240字节的数据。
当前的项目是采用MQTT协议实现,那么先来了解一下什么是MQTT协议。
软件采用Qt设计,QT版本是5.12.6
设备A的功能:获取摄像头的数据—》缩放成240*320—》编码成JPEG格式—》转码成base64—》组合成MQTT报文—》上传到服务器。
设备B的功能:订阅设备A上传的数据,得到数据后解析出源格式数据—》将图像画面渲染显示出来。
软件运行效果:
总结软件运行的体验效果:
(1) 非常流畅。两个窗口肉眼感觉不到延迟。
(2)服务器不要钱。
这个方案验证之后,可以衍生出很多实际的例子了:
比如, 单片机+摄像头+MQTT协议 也可以做为图传发送端。 联网可以使用:WIFI或者4G模块、5G模块。
1.1 MQTT协议
MQTT (Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅的消息传输协议,它可以在客户端和服务器之间进行双向通信。MQTT被设计为适用于低带宽、不稳定网络连接的物联网设备通信。
MQTT具有以下主要特点:
(1)发布/订阅模型:客户端可以选择订阅一个或多个主题(topic),并接收与这些主题相关的消息;同时,客户端也可以发布消息到一个或多个主题上。
(2)轻量级:MQTT的协议头非常小,最小只有2字节,这使得它非常适合于传输数据量较小的IoT设备。
(3)QoS(服务质量)支持:MQTT支持三种不同的QoS级别,分别是“至多一次”、“至少一次”和“恰好一次”,可以根据应用场景的需要进行选择。
(4)保留消息:MQTT服务器可以将最新的消息保留在主题中,并让新的订阅者能够读取先前发布的消息。
(5)遗嘱消息:当客户端与服务器连接异常断开时,服务器可以向其他订阅了该主题的客户端发送遗嘱消息,以实现更可靠的消息传输。
总之,MQTT是一种非常适合物联网设备通信的协议,它具有轻量级、灵活性高、易于实现、可靠性强等优点,已经被广泛地应用于各种物联网场景中。
1.2 MQTT协议载体
MQTT协议是基于TCP协议传输报文的。MQTT使用TCP/IP协议栈来实现通信,因此它具有TCP协议的一些特性,如可靠性、流控制和建立持久连接等特点。
在MQTT连接建立时,客户端需要通过TCP连接到MQTT服务器,并进行握手协商,包括协议版本、客户端标识符、遗嘱消息、QoS级别等信息,以确保双方能够正确地交换数据。一旦握手成功,客户端和服务器之间就建立了一个持久化的TCP连接,可以随时进行消息传输。
由于TCP协议本身已经提供了一定程度的可靠性保证,因此MQTT协议只需要在TCP的基础上实现发布/订阅机制、QoS级别控制、保留消息等特性即可,从而使得它成为一种轻量级且高效的物联网通信协议。
1.3 JSON里如何保存图片数据?
在JSON中保存图片数据通常需要将图片转换为二进制数据,并将其编码成Base64字符串,然后将该字符串作为JSON对象的属性值进行传输。
Base64编码是一种将二进制数据转换为ASCII字符的方法,它使用64个字符来表示任意序列的二进制数据。Base64编码后的数据长度会比原始二进制数据略长,但可以方便地被转换为文本格式并在网络上进行传输。
以下是一个示例JSON对象,其中包含了一个Base64编码后的图片数据:
在这个示例中,imageData
属性表示图片数据的Base64编码字符串,imageName
属性表示图片文件名。在接收到JSON对象后,可以通过解码Base64字符串并将其保存为二进制数据,再将其写入磁盘或者显示在应用程序中。
需要注意的是,由于Base64编码后的数据量相对较大,因此在实际应用中,如果需要传输大量的图片数据,建议使用其他更适合的数据传输方式,如MQTT协议、WebSocket等。
1.4 MQTT协议最大能传多少有效字节的数据?
MQTT协议本身没有限制数据包的大小,但是它需要遵循底层传输协议(TCP/IP)的限制和约束。在实际应用中,MQTT协议能够传输的有效数据量是受多种因素影响的,如网络带宽、QoS级别、MQTT消息头部信息等。
一般来说,在默认情况下,MQTT协议对于单个消息的有效载荷有一个限制,即不超过256MB。这个限制主要由MQTT协议的消息长度字段决定,该字段的最大值是4字节,因此最大能表示2^32-1个字节的消息长度,即约为4GB。然而,在实际应用中,由于网络带宽和设备性能等方面的限制,很难实现传输如此巨大的消息。
另外,需要注意的是,如果使用较高级别的QoS,如“至少一次”或“恰好一次”,则MQTT协议会对每条消息进行确认和重传,这可能会导致更多的网络流量和延迟。因此,在选择QoS级别时,需要根据应用场景和网络环境的实际情况进行优化和调整,以充分利用MQTT协议的特点和优势。
三、阿里云服务器创建
官网地址: https://iot.console.aliyun.com/lk/summary/new
3.1 创建产品
3.2 添加设备
创建完成。
3.3 创建自定义属性
在产品页面的,找到功能定义。
最大一次只能传递10KB。
3.4 MQTT服务器地址和端口
关于MQTT协议登录所需要的参数官方说明文档: https://help.aliyun.com/document_detail/140507.html?spm=a2c4g.11186623.6.571.1e417544OGPj2y
阿里云物联网服务器的域名规则如下:
解析域名对应的IP地址:
3.5 MQTT三元组格式
打开生成工具:
生成MQTT登录的密匙: 填入的参数就是前面创建设备得到信息。
3.6 主题发布与订阅的格式
在产品页面可以看到主题格式: https://iot.console.aliyun.com/product/productDetail/a1cMlEwEwjg/func?current=2
总结:
3.7 MQTT设备登录
利用MQTT客户端完成设备登录测试。
对号入座填入参数,测试主题订阅,主题发布:
数据接收成功:
到此服务器创建成功。
3.8 继续创建设备2
监控设备有两个,1个设备为摄像头图片发送端,一个设备是图片接收显示端。
创建成功。
接下来生成设备2的MQTT三元组密匙,和前面一样的方法。
参数总结:
四、云产品流转
4.1 创建解析器
创建完成。
4.2 创建规则
添加主题:
设置数据目的:
编写解析器脚本:
帮助文档地址:https://help.aliyun.com/document_detail/270937.html
下面编写代码,获取设备1上传的数据,转发给设备2。
写好解析器就发布。
在云产品流转的首页启动解析器。
4.3 测试两个设备的订阅
设备1的参数:
设备2的参数:
五、项目开发
5.1 base64转码实现
摄像头采集图像数据之后会编码 成base64格式的字符串,再通过MQTT协议上传到物联网服务器。 下面就是base64的实现代码。
大量图文的教程,手把手教学用心了
阿里云的文档还是很全的
整一个阿里云服务器试试
讲解的很好