MQTT协议
一.MQTT协议概述
MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域中的设备连接、传感器数据传输等场景。
MQTT协议使用TCP/IP协议栈作为底层传输协议,支持QoS(服务质量)级别定义、保留消息等特性。在MQTT中,有一个消息代理(Broker)中心,客户端通过连接到消息代理,实现发布消息和订阅消息,从而实现设备之间的通信和数据传输。
相对于HTTP协议,MQTT具有更小的消息头和更少的网络流量占用,适合于低带宽、不稳定网络环境下的设备数据传输场景。同时,MQTT也支持不同的平台和语言的开发,如Java、Python、C++、JavaScript等等,可以方便地进行二次开发和应用。
二.优点
MQTT协议的优点包括:
-
轻量级:MQTT协议设计简单,消息头部分较小,具有较低的网络流量消耗和较小的内存占用,适用于低带宽和资源受限的设备。
-
低功耗:MQTT协议采用异步传输机制,客户端可以通过保持持久连接的方式降低网络建立和断开的消耗,从而减少设备能耗。
-
异步通信:MQTT采用发布/订阅模式,使设备可以实现异步通信,即设备可以推送消息到消息代理,而不需要立即等待接收方的响应,提高了系统的响应速度和吞吐量。
-
灵活的消息订阅机制:MQTT支持多级主题订阅,即通配符订阅,允许设备订阅特定主题或一组主题,从而更灵活地管理和控制消息的订阅。
-
可靠性和服务质量:MQTT协议支持三个不同的服务质量(QoS)级别,分别为至多一次、至少一次和正好一次,可以根据应用需求选择适当的级别,保证消息的可靠传输。
-
跨平台和语言支持:MQTT具有跨平台和跨语言的特性,允许在不同的硬件平台和编程语言中使用,并且有丰富的开发库和工具可供选择和使用。
综上所述,MQTT协议的轻量级、低功耗、异步通信、灵活订阅、可靠传输和跨平台支持等特点使其成为物联网设备连接和通信的理想选择。

三.MQTT通配符
MQTT协议支持使用通配符(wildcard)进行主题(Topic)的订阅和发布。通配符的使用可以让设备更灵活地管理和控制消息的订阅。
MQTT协议中有两种通配符:
-
单层通配符(Single-Level Wildcard):表示为"+"(加号)。可以用于任意层级的主题的一级通配,可以匹配单个层级的主题标识。例如,“home/+/light” 可以匹配 “home/kitchen/light” 和 “home/livingroom/light”,但不能匹配 “home/kitchen/table/light”。
-
多层通配符(Multi-Level Wildcard):表示为"#"(井号)。只能用于主题的最后一级,用于匹配多个或零个层级的主题标识。例如,“home/kitchen/#” 可以匹配 “home/kitchen/light”、“home/kitchen/table/light” 等。
使用通配符能够使设备更加灵活地定义订阅规则,可以根据实际需要选择适当的通配符来订阅特定的主题。这样可以简化设备间的通信和数据传输,在物联网中更加方便和高效地实现设备与设备之间的互联互通。
四.MQTT协议通讯流程
![![2023-11-15T14:45:27.png][2]](https://img-blog.csdnimg.cn/direct/7310de3cbc594e26b5425ebe49510631.png)
MQTT协议通信流程:
-
连接阶段:
1.1. 客户端通过TCP/IP协议与MQTT代理建立网络连接。
1.2. 客户端发送CONNECT报文给代理,携带客户端标识符、协议版本、保持连接设置等信息。
1.3. 代理验证客户端信息,返回CONNACK报文作为连接确认,指示连接是否建立成功。 -
心跳保持:
2.1. 已建立连接的客户端和代理之间周期性地交换PINGREQ和PINGRESP报文来保持心跳。
2.2. 客户端在一段时间内未收到PINGRESP报文时,可以认为连接断开,并进行相应的处理。 -
发布与订阅:
3.1. 客户端发送SUBSCRIBE报文给代理,指定要订阅的主题和对应的服务质量(QoS)级别。
3.2. 代理接收SUBSCRIBE报文,记录客户端的订阅信息,并发送SUBACK报文给客户端,确认订阅请求。
3.3. 客户端向代理发送PUBLISH报文,发布消息到指定主题。
3.4. 代理接收到PUBLISH报文后,根据订阅关系将消息转发给对应的客户端。
3.5. 客户端收到PUBLISH报文后,根据消息的QoS级别发送相应的确认报文(PUBACK、PUBREC、PUBREL、PUBCOMP)。
3.6. 客户端可以发送UNSUBSCRIBE报文给代理,取消订阅一个或多个主题。 -
关闭连接:
4.1. 客户端发送DISCONNECT报文给代理,主动关闭连接。
4.2. 代理接收到DISCONNECT报文,断开与该客户端的连接。
五.MQTT协议数据结构

MQTT由固定报头,可变报头,有效载荷三部分组成。
![2023-11-15T14:59:07.png][4]
MQTT协议中的每个报文都包含一个固定报头(Fixed Header),固定报头中包含了一些固定的信息以标识报文的类型和控制参数。下面是MQTT协议固定报头的基本结构:
-
报文类型(Message Type):占据固定报头的高4位(即最高位的四个比特),用于表示报文的类型。可能的取值包括:
- CONNECT:连接请求
- CONNACK:连接确认
- PUBLISH:发布消息
- PUBACK:发布确认
- PUBREC:发布收到(QoS 2,第一次)
- PUBREL:发布释放(QoS 2,第二次)
- PUBCOMP:发布完成(QoS 2,第三次)
- SUBSCRIBE:订阅请求
- SUBACK:订阅确认
- UNSUBSCRIBE:取消订阅请求
- UNSUBACK:取消订阅确认
- PINGREQ:心跳请求
- PINGRESP:心跳响应
- DISCONNECT:断开连接
- 其他有关错误报告和重发的报文类型
-
控制标志(Control Flags):占据固定报头的低4位(即最低位的四个比特),用于表示控制参数。不同报文类型的控制标志具有不同的含义,常见的标志包括:
- DUP:指示是否进行重复投递
- QoS:指示消息传递的服务质量等级
- RETAIN:指示是否保留最后一条消息
-
剩余长度(Remaining Length):占据固定报头的字节2至5。它表示整个报文的剩余长度(不包括固定报头的长度)。使用可变长度编码(Variable Length Encoding)表示,允许长度范围从 0 到 268,435,455 字节。

通过固定报头,客户端和代理可以快速解析报文,确定报文的类型和相应的控制参数,进而有效地处理和分发报文。
需要注意的是,MQTT协议的固定报头结构是通用的,但报文具体的数据结构和长度取决于不同的报文类型。每个报文类型在固定报头后面还会包含各自特定的可变头部(Variable Header)和有效负载数据(Payload),这些部分的结构和长度也会根据具体的需求而变化。

MQTT协议中,除了固定报头外,每个报文还可能包含可变报头(Variable Header)。可变报头包含了一些特定于消息类型的字段,用于提供关于消息的更多信息。下面是MQTT协议中可变报头的一般结构:
-
CONNECT报文的可变报头包含以下字段:
- 协议名称:通常为字符串"MQTT"
- 协议版本号:表示MQTT协议的版本,例如4代表MQTT 3.1.1
- 连接标志:包括clean session标志、will标志、will QoS、will retain标志、user name标志和password标志
- 保持连接时长:以秒为单位的整数,指示客户端和服务器之间的空闲超时时间
- 客户端标识符:客户端的唯一标识符
- 遗嘱主题和消息:可选,用于指示在不正常断开时发送的遗嘱消息
- 用户名和密码:可选,用于进行身份验证
-
PUBLISH报文的可变报头包含以下字段:
- 主题名:消息发布到的主题
- 报文标识符:仅在QoS级别1和2时存在,用于匹配发布的消息和确认消息
- QoS级别:消息的服务质量级别
- 保留标志:指示服务器是否应保留消息以及如何处理它
-
SUBSCRIBE报文的可变报头包含以下字段:
- 报文标识符:此订阅请求的标识符
- 订阅主题列表:包括主题过滤器和期望的QoS级别
-
SUBACK报文的可变报头包含以下字段:
- 报文标识符:对应的订阅请求的标识符
- 订阅结果列表:服务器订阅的每个主题的QoS级别
其他报文类型的可变报头也包含与其功能和语义相关的信息。可变报头的结构和字段取决于消息类型和特定协议版本的要求。通过可变报头,可以为每种类型的报文提供必要的信息,以便接收方能够正确解释和处理消息。
需要注意的是,可变报头并不是所有报文类型都有的,但对于那些具有可变报头的报文类型来说,可变报头是非常重要的部分,它提供了报文的关键信息,以便接收方理解和处理报文。

MQTT协议中,有效载荷(Payload)包含了报文的实际数据,其结构和内容取决于具体的报文类型和应用需求。以下是几种常见的MQTT报文类型以及它们可能包含的有效载荷:
-
CONNECT报文的有效载荷包含了客户端的连接请求信息,主要包括:
- 客户端标识符
- 遗嘱消息和相关设置
- 用户名和密码(如果需要认证)
-
CONNACK报文的有效载荷包含了服务器对连接请求的确认信息,主要包括:
- 连接确认标志
- 连接结果代码
-
PUBLISH报文的有效载荷包含了实际发布的消息内容,其中包括:
- 主题名
- 消息负载:需要传输的实际消息数据
- 报文标识符(可能存在于QoS级别为1或2的情况下)
-
SUBSCRIBE报文的有效载荷包含了订阅请求的信息,主要包括:
- 一个或多个订阅主题和对应的QoS级别
- 报文标识符
-
SUBACK报文的有效载荷包含了订阅确认的信息,主要包括:
- 与订阅请求一一对应的订阅结果列表,包括每个主题的QoS级别
-
UNSUBSCRIBE报文的有效载荷包含了取消订阅请求的信息,主要包括:
- 一个或多个需要取消订阅的主题名
-
UNSUBACK报文的有效载荷通常为空,因为它只是一个简单的确认消息。
-
PUBACK、PUBREC、PUBREL、PUBCOMP报文的有效载荷通常为空,因为它们主要用于消息发布的确认。
-
PINGREQ和PINGRESP报文没有有效载荷,因为它们主要用于维持连接状态而不传输实际数据。
-
DISCONNECT报文的有效载荷通常为空,因为它主要用于终止连接。
需要注意的是,有效载荷的具体结构和内容将根据具体的需求和通信的上下文进行定义,同时也受到MQTT协议版本和服务质量等级(QoS)的影响。MQTT的灵活性允许有效载荷的内容可以是任意格式的数据,包括文本、二进制数据等。
总的来说,有效载荷是MQTT报文中传输实际数据的部分,它的结构和内容对于消息的生产者和消费者之间的通信至关重要。
相关文章:
MQTT协议
一.MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的消息传输协议,广泛应用于物联网(IoT)领域中的设备连接、传感器数据传输等场景。 MQTT协议使用TCP/IP协议栈作为底层…...
Unity编辑器扩展(外挂)
每日一句:未来的样子藏在现在的努力里 目录 什么是编译器开发 C#特性[System.Serializable] 特殊目录 命名空间 /*检视器属性控制*/ //添加变量悬浮提示文字 //给数值设定范围(最小0,最大150) //指定输入框,拥有5行 //默认…...
oracle 19c容器数据库data dump数据泵传输数据(2)---11g导19c
目录 1.在11gnon-cdb数据库中创建测试用户 2.在19cCDB容器数据库中新建pdb2 3.执行命令导出 4.执行命令导入 Exporting from a Non-CDB and Importing into a PDB 我們要記住一点:如果是全库导出导入的话,目标数据库没有的表空间我们要事先创建&#…...
Java-网络爬虫(二)
文章目录 前言一、WebMagic二、使用步骤1. 搭建 Maven 项目2. 引入依赖 三、入门案例四、核心对象&组件1. 核心对象SipderRequestSitePageResultItemsHtml(Selectable) 2. 四大组件DownloaderPageProcessorSchedulerPipeline 上篇:Java-网…...
【android】rk3588-android-bt
文章目录 蓝牙框架HCI接口蓝牙VENDORLIBvendorlib是什么 代码层面解读vendorlib1、 vendorlib实现,协议栈调用2、协议栈实现,vendorlib调用(回调函数)2.1、 init函数2.2、BT_VND_OP_POWER_CTRL对应处理2.3、BT_VND_OP_USERIAL_OPE…...
如何在 Microsoft Edge 浏览器中启用自动刷新
你是否经常发现自己在使用 Microsoft Edge 时点击刷新按钮?如果您需要一个网页以设定的时间间隔自动更新,那么请接着往下看。 在这篇博文中,我们探讨如何在 Microsoft Edge 浏览器中启用和管理自动刷新功能。 为什么选择自动刷新࿱…...
Redis之集群方案比较
哨兵模式 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般&a…...
WPF 布局
了解 WPF中所有布局如下,我们一一尝试实现,本文档主要以图形化的形式展示每个布局的功能。 布局: Border、 BulletDecorator、 Canvas、 DockPanel、 Expander、 Grid、 GridView、 GridSplitter、 GroupBox、 Panel、 ResizeGrip、 Separat…...
#Uniapp:uni-app中vue2生命周期--11个
uni-app中vue2生命周期 生命周期钩子描述H5App端小程序说明beforeCreate在实例初始化之后被调用 详情√√√created在实例创建完成后被立即调用 详情√√√beforeMount在挂载开始之前被调用 详情√√√mounted挂载到实例上去之后调用 详情 注意:此处并不能确定子组…...
pytorch 分布式 Node/Worker/Rank等基础概念
分布式训练相关基本参数的概念如下: Definitions Node - A physical instance or a container; maps to the unit that the job manager works with. Worker - A worker in the context of distributed training. WorkerGroup - The set of workers that execute the same f…...
《动手学深度学习》学习笔记 第8章 循环神经网络
本系列为《动手学深度学习》学习笔记 书籍链接:动手学深度学习 笔记是从第四章开始,前面三章为基础知识,有需要的可以自己去看看 关于本系列笔记: 书里为了让读者更好的理解,有大篇幅的描述性的文字,内容很…...
腾讯实验平台基于 StarRocks 构建湖仓底座
作者: 腾讯大数据平台部科学实验中心Tech Lead、专家工程师 马金勇博士 腾讯大数据平台部科学实验中心数据负责人、专家工程师 胡明杰 StarRocks Contributor、腾讯高级工程师 刘志行 在 2022 年,腾讯 A/B Test 团队启动了海外商业化版本 ABetterChoice …...
【基础工具篇使用】ADB 的安装和使用
文章目录 ADB的命令安装ADB 命令使用查看帮助 ——adb help查看连接设备 ADB的命令安装 ADB 命令的全称为“Android Debug Bridge”,从英文中看出主要是用作安卓的调试工具。ADB 命令在嵌入式开发中越来越常用了 在 Windows 上按“win”“R”组合件打开运行, 输入 …...
数字图像处理练习题
数字图像处理练习题 文章目录 数字图像处理练习题第 一 章1.什么是数字图像?2.数字图像有哪些特点?3.数字图像处理的目的是什么?4.简述数字图像的历史。5.数字图像有哪些主要应用?6.列举生活中数字图像的获得途径。7.结合自己的生活实例,举出一个数字图像的应用实例8.数字图…...
开关电源PFC电路原理详解及matlab仿真
PFC全称“Power Factor Correction”,意为“功率因数校正”。PFC电路即能对功率因数进行校正,或者说能提高功率因数的电路。是开关电源中很常见的电路。 在电学中,功率因数PF指有功功率P(单位w)与视在功率S(…...
SpringBoot+Hutool实现图片验证码
图片验证码在注册、登录、交易、交互等各类场景中都发挥着巨大作用,能够防止操作者利用机器进行暴力破解、恶意注册、滥用服务、批量化操作和自动发布等行为。 创建一个实体类封装,给前端返回的验证码数据: Data public class ValidateCodeV…...
【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用
力扣题 1、题目地址 1709. 访问日期之间最大的空档期 2、模拟表 表:UserVisits Column NameTypeuser_idintvisit_datedate 该表没有主键,它可能有重复的行该表包含用户访问某特定零售商的日期日志。 3、要求 假设今天的日期是 ‘2021-1-1’ 。 …...
Hive 的 安装与使用
目录 1 安装 MySql2 安装 Hive3 Hive 元数据配置到 MySql4 启动 Hive5 Hive 常用交互命令6 Hive 常见属性配置 Hive 官网 1 安装 MySql 为什么需要安装 MySql? 原因在于Hive 默认使用的元数据库为 derby,开启 Hive 之后就会占用元数据库,且不与其他客户…...
Zynq 电源
ZYNQ芯片的电源分PS系统部分和PL逻辑部分,两部分的电源分别是独立工作。PS系统部分的电源和PL逻辑部分的电源都有上电顺序,不正常的上电顺序可能会导致ARM系统和FPGA系统无法正常工作。 PS部分的电源有VCCPINT、VCCPAUX、VCCPLL和PS VCCO。 VCCPINT为PS内…...
DevOps系列之 Python操作数据库
pymysql操作mysql数据库 安装pymysql pip install pymysql pymysql操作数据库 1.连接数据库 使用Connect方法连接数据库 pymysql.Connections.Connection(hostNone, userNone, password, databaseNone, port0, charset) 参数说明: host – 数据库服务器所在的主机…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
