Qt + mqtt对接阿里云平台(二)

一、MQTT协议

1、MQTT相关概念

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上。

在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

订阅(Subscription)

订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

会话(Session)

每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可

主题名(Topic Name)

连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

主题筛选器(Topic Filter)

一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

负载(Payload)

消息订阅者所具体接收的内容。

二、CONNECT协议格式

格式:固定包头+可变包头+有效载体

1、固定包头

长度:2~5bytes

包括报文类型(1),固定保留位(0)和剩余长度。

|-----------|---|---|---|---|---|---|---|---|
| Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Byte 1 | 报文类型 |||| 保留位 ||||
| | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
| Byte 2... | 剩余长度值 ||||||||

剩余长度等于可变报头的长度(10字节)加上有效载荷的长度。

剩余长度

|-------|------|------|------|------|------|------|------|
| bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
| 进位标志位 | 数据位 |||||||

2、可变抱头

|---------|----------------------------------------------------------------------------------------------------------------------------------------------------|---|---|---|---|---|---|---|---|
| | 描述 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 协议名 ||||||||||
| Byte 1 | Length MsB (0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Byte 2 | Length LsB(4) | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| Byte 3 | 'M' | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
| Byte 4 | 'Q' | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
| Byte 5 | 'T' | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
| Byte 6 | 'T' | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
| 协议级别 ||||||||||
| Byte 7 | Level (4)级别 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| 连接标志 Connect Flags ||||||||||
| Byte 8 | User Name Flag(1)用户名标志 Password Flag(1)密码标志 Wil Retain (0)Wi 保留标志 Will Qos (01)Wi 服务质量 保持连接时间 Wil Flag(1)Wi 标志 Clean Session(1)清理会话 Reserved(0)保留位 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
| 保持连接时间 ||||||||| |
| Byte 9 | 保持连接 MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Byte 10 | 保持连接 LSB(10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |

长度:10bytes

Byte8 连接标志(Connect Flags)

连接标志字节包含一些用于指定MQTT连接行为的参数。它还指出有效载荷中的字段是否存在。

Byte9 Byte10 保持连接

长度:2bytes

保持连接(KeepAlive)是一个以秒为单位的时间间隔,表示为一个16位的字,它是指在客户端传输完成一个控制报文的时刻到发送下一个报文的时刻,两者之间允许空闲的最大时间间隔。如果在设置的时间的1.5倍内没有发送报文,则自动断开连接。

0x00 0x64表示100s。

3、有效载体

有效载体可以分为:ClientID+Username+Password

每个部分前面有2个字节是该部分的长度。表示16位的长度

2Byte(ClientID长度) + ClientID + 2Byte(Username长度) + Username + 2Byte(Password长度) + Password

三、QMqtt编译集成

1、源码下载

地址:点击跳转

2、打开工程qmqtt.pro进行编译

若报一下错误,则将client.pro里面的 qmqtt 注释掉

:-1: error: Project ERROR: Unknown module(s) in QT: qmqtt

3、集成QMqtt库

首先,新建一个项目工程,并在.pro文件添加如下信息:

QT += network

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt

else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -lQt5Qmqtt

else:unix: LIBS += -L$$PWD/lib/ -lQt5Qmqtt

INCLUDEPATH += $$PWD/mqtt

DEPENDPATH += $$PWD/.

然后,将编译生成的lib以及源码src下的mqtt整个文件夹拷贝到当前工程目录下。

最后,在自己的源码添加以下头文件就可以使用qmqtt库的接口了。

#include "mqtt/qmqtt.h"

qmqtt对接阿里云例程:点击跳转

参考博客:ESP32/ESP8266 MQTT协议接入阿里云(二)_esp8266上传数据到阿里云的数据格式-CSDN博客

彻底搞懂Qt-MQTT开发_qt mqtt-CSDN博客

相关推荐
网络研究院40 分钟前
如何安全地大规模部署 GenAI 应用程序
网络·人工智能·安全·ai·部署·观点
limengshi13839240 分钟前
通信工程学习:什么是RIP路由信息协议
网络·网络协议·学习·智能路由器·信息与通信
limengshi1383925 小时前
通信工程学习:什么是TFTP简单文件传输协议
网络·网络协议·学习·信息与通信
麻辣韭菜7 小时前
网络基础 【HTTP】
网络·c++·http
Deryck_德瑞克8 小时前
Java网络通信—TCP
java·网络·tcp/ip
GodK7778 小时前
IP 数据包分包组包
服务器·网络·tcp/ip
梁诚斌8 小时前
VSOMEIP代码阅读整理(1) - 网卡状态监听
运维·服务器·网络
ZachOn1y9 小时前
计算机网络:计算机网络概述 —— 描述计算机网络的参数
网络·tcp/ip·计算机网络·考研必备
我命由我123459 小时前
SSL 协议(HTTPS 协议的关键)
网络·经验分享·笔记·学习·https·ssl·学习方法
两点王爷10 小时前
使用WebClient 快速发起请求(不使用WebClientUtils工具类)
java·网络