MQTT协议笔记
消息格式
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,专为低带宽、高延迟或不可靠的网络设计,广泛应用于物联网(IoT)设备之间的通信。MQTT消息体的结构遵循MQTT协议规范,主要由以下几个部分组成:
MQTT消息格式
MQTT的消息传输基于发布/订阅模式,通过主题(Topic)进行消息路由。每个从客户端发送到服务器(或服务器发送到客户端)的消息都包含一个固定头部(Fixed Header),可变头部(Variable Header,视消息类型而定),以及有效载荷(Payload)。下面是对这些组成部分的详细说明:
1. 固定头部(Fixed Header)
固定头部是所有MQTT消息都必须包含的部分,它携带了关于消息的基本信息,如消息类型、标志位等。
- 消息类型:标识消息的目的,例如CONNECT(连接服务端)、PUBLISH(发布消息)、SUBSCRIBE(订阅主题)等。
- 标志位:根据消息类型的不同,可能包括一些额外的控制标志。
- 剩余长度:表示后面跟随的数据(可变头部+有效载荷)的字节长度。
2. 可变头部(Variable Header)
并不是所有的MQTT消息都需要可变头部,它的存在与否取决于消息类型。可变头部通常包含一些特定于消息类型的附加信息,比如:
- 在
PUBLISH消息中,它包含了主题名称(Topic Name)和包标识符(Packet Identifier,对于QoS级别大于0的消息)。 - 在
CONNECT消息中,它会包含协议名、协议版本、连接标志等信息。
3. 有效载荷(Payload)
有效载荷是消息的实际内容,具体内容依赖于消息类型:
- 对于
PUBLISH消息,有效载荷就是实际要传输的数据,可以是任何格式(如JSON、XML、纯文本等)。 - 对于
SUBSCRIBE消息,有效载荷则是一组主题过滤器及其对应的QoS等级。 - 其他类型的消息(如
CONNECT、CONNACK等)的有效载荷可能是空的,或者包含少量特定数据。
MQTT数据包结构图如下:

固定头结构如下图:
消息发布机制
MQTT(Message Queuing Telemetry Transport)协议定义了客户端向服务器(broker)发布消息的方式,这些方式主要围绕着如何指定主题、设置服务质量(QoS)等级以及处理其他发布相关的参数。以下是MQTT消息发布的几种关键方式和相关特性:
1. 指定主题(Topic)
在发布消息时,必须指定一个或多个主题。主题是消息的标识符,订阅者通过匹配感兴趣的主题来接收消息。
- 精确匹配:发布者可以直接指定一个确切的主题名称来发布消息。
- 通配符使用限制:发布消息时不能使用单级(
+)或多级(#)通配符,这些仅用于订阅操作。
2. 设置服务质量(QoS)
发布消息时可以选择三种不同的服务质量级别:
- QoS 0:最多一次交付。消息发送后不进行确认,适用于对消息丢失容忍度较高的场景。
- QoS 1:至少一次交付。确保消息至少被送达一次,但可能会重复。每次发送都会等待PUBACK确认。
- QoS 2:恰好一次交付。提供最高的可靠性保证,确保消息只被送达一次。涉及更复杂的四步握手过程(PUBLISH, PUBREC, PUBREL, PUBCOMP)。
3. Retain标志
发布消息时可以设置保留消息(Retain flag)。如果此标志被设置为true,则该消息将作为该主题的最新状态保存在broker上。任何新订阅此主题的客户端都会立即收到这条保留消息。
- 清除保留消息:如果你想清除某个主题的保留消息,只需发布一条retain标志为true但内容为空的消息到该主题即可。
4. DUP标志
对于QoS大于0的消息,DUP(Duplicate)标志可能出现在重新发送的消息中,以指示这是一条重发的消息。这有助于接收方识别并正确处理重复的消息。
5. Message Expiry Interval (MQTT v5)
在MQTT v5版本中引入了一个新的特性——消息过期间隔(Message Expiry Interval),允许发布者设定消息的有效期。如果消息在此时间内未被所有目标订阅者接收,则会被broker丢弃。
6. Payload Format Indicator (MQTT v5)
同样是在MQTT v5中新增的功能,Payload Format Indicator允许发布者指示消息体的格式类型(如UTF-8编码文本或其他二进制数据),以便订阅者更好地解析消息内容。
7. Response Topic & Correlation Data (MQTT v5)
这两个属性也是MQTT v5的一部分,用于支持请求/响应模式。Response Topic指定了应答消息应当发布的主题,而Correlation Data则可用于关联请求与响应消息。
消息订阅机制
MQTT(Message Queuing Telemetry Transport)协议提供了灵活的消息订阅机制,允许客户端根据需要选择不同的订阅方式。以下是几种主要的订阅方式和相关特性:
1. 主题订阅
这是最基本也是最常用的订阅方式。客户端可以订阅一个或多个主题(Topics),当有消息发布到这些主题时,所有订阅了该主题的客户端都会收到消息。
-
单级别通配符(+):可以在主题过滤器中使用单个 '+' 符号来代替一层级别的主题名称。例如,
home/+/temperature将匹配home/livingroom/temperature和home/kitchen/temperature。 -
多级别通配符(#):'#' 必须位于主题过滤器的末尾,并且代表匹配任意数量的层级。例如,
home/#可以匹配home/livingroom/temperature,home/kitchen/light, 等等。
2. QoS(Quality of Service)等级
在订阅时,可以选择服务质量(QoS)等级,这决定了消息传递的保证程度:
- QoS 0:最多一次,消息发送者尝试发送消息一次,不保证送达。
- QoS 1:至少一次,确保消息至少被送达一次,但可能会重复。
- QoS 2:恰好一次,确保消息只被送达一次,提供最高的可靠性。
3. 持久会话
通过设置 cleanSession 参数为 false(在 MQTT v5 中称为 Clean Start),客户端可以让服务器保持其会话状态。这意味着即使客户端断开连接,它也能在重新连接后接收到在其离线期间发布的消息。
4. 共享订阅
一些MQTT代理实现了共享订阅功能,允许多个客户端共享对同一主题的订阅。在这种模式下,当一条新消息到达时,只会有一部分订阅者接收该消息,而不是所有的订阅者都收到相同的消息副本。这对于负载均衡非常有用。
5. Retain Handling
MQTT v5 引入了更精细的保留消息处理选项 (Retain Handling),它定义了如何处理保留消息:
- Retain Handling 0:只要订阅建立,就发送保留消息。
- Retain Handling 1:只有建立全新的订阅而不是重复订阅时,才发送保留消息。
- Retain Handling 2:订阅建立时不要发送保留消息。
6. No Local
如果设置了 No Local 标志,则服务端不会将消息转发给发布这条消息的客户端本身。这个选项对于桥接场景特别有用。
7. Retain As Published
另一个 MQTT v5 特性是 Retain As Published,它控制是否保留消息中的 Retain 标识。这对于桥接场景下的跨服务器保留消息传播非常重要。
推荐b站入门讲解视频:MQTT 协议入门与进阶 1_哔哩哔哩_bilibili
MQTT 客户端:MQTTX:全功能 MQTT 客户端工具
相关文档:MQTT协议,终于有人讲清楚了-腾讯云开发者社区-腾讯云
相关文章:
MQTT协议笔记
消息格式 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息协议,专为低带宽、高延迟或不可靠的网络设计,广泛应用于物联网(IoT)设备之间的通信。MQTT消息体的结构遵循MQTT协议规范࿰…...
CentOS系统下安装tesseract-ocr5.x版本
CentOS系统下安装tesseract-ocr5.x版本 安装依赖包: yum update -y yum install autoconf automake libtool libjpeg-devel libpng-devel libtiff-devel zlib-devel yum install automake libtool bzip2 -y手动编译安装GCC(因系统默认安装的GCC版本比较…...
“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)
🚨📢 "征服HTML引号恶魔:“完全解析手册” 📢🚨 🎯 博客引言:当引号变成"恶魔" 😱 是否遇到过这种情况: 写HTML时满心欢喜输入<div title"他…...
如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志
一、首先按照以下 指引 中的 第1、2步骤,安装一下 AGDE ,AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension(AGDE)对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前,记得…...
VSCode 生成HTML 基本骨架
在VSCode 新建html文件中敲一个英文感叹号 ! <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…...
【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码
系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目(含完整前端后端代码)【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲:核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...
Solr-搜索引擎-入门到精通
以下是对 Apache Solr 的简介及其常用语法的快速入门指南: 一、Solr 是什么? • 核心定位:Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台,支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能: • 全…...
07_GRU模型
GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU(Gated Recurrent Unit)也称为门控循环单元,是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联,通过引入两个&qu…...
【字符设备驱动开发–IMX6ULL】(二)Linux 设备号
【字符设备驱动开发–IMX6ULL】(二)Linux 设备号 文章目录 【字符设备驱动开发–IMX6ULL】(二)Linux 设备号1 设备号的组成2.设备号的分配 1 设备号的组成 为了方便管理,Linux 中每个设备都有一个设备号,设…...
【大模型基础_毛玉仁】3.4 Prompt 技巧
目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1)任务说明要明确2)上下文丰富且清晰3)输出格式要规范4)排版要清晰 3.4.2 合理归纳提问1)复杂问题拆解2)追问 3.4.3 适时使用CoT1)何时使用CoT2&…...
探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率
随着分子建模和计算生物学的快速发展,分子对接(Molecular Docking)、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制,还能加速药物设计和优化过程。NRGSuit…...
sql2022 复制 事务级别发布后无法删除
Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission. 用SA用户登录执行下列语句 USE [xxxxx] GO EXEC dbo.sp_changedbowner loginame Nsa, …...
wokwi arduino mega 2560 - 键盘与LCD显示
截图: 链接: https://wokwi.com/projects/414520193913760769 代码: //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库,用于LCD显示 #include <Keypad.h> // 引入Keypad库,用于键盘输…...
Linux设置SSH免密码密钥登录
文章目录 设置SSH免密码密钥登录第一步: 生成SSH密钥对(在客户端操作)方式一:Windows 10/11 内置的 OpenSSH 客户端(推荐)常用选项:密钥算法选择建议生成秘钥 方式二:借用Xshell工具…...
深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法
活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!…...
GPU算力哪家好?GpuGeek推出高性能GPU云服务
在人工智能和深度学习领域,GPU算力租赁已成为推动技术创新的关键因素。随着越来越多的企业和个人开发者投身于AI研究和应用开发,如何高效、灵活地获取GPU算力成为了一个亟待解决的问题。GpuGeek作为一站式AI基础设施平台,凭借其独特的优势&am…...
蓝桥杯算法实战分享
蓝桥杯算法实战分享 蓝桥杯是国内知名的程序设计竞赛,涵盖算法、数据结构、编程技巧等多个领域。本文将从实战角度分享蓝桥杯算法竞赛的常见题型、解题思路和优化技巧,帮助参赛者更好地备战。 1. 常见题型与解题思路 蓝桥杯的题型主要包括以下几类&…...
【每日算法】Day 9-1:贪心算法精讲——区间调度与最优选择(C++实现)
掌握高效决策的核心思想!今日深入解析贪心算法的底层逻辑,聚焦区间调度与最优选择两大高频场景,结合大厂真题与严谨证明,彻底掌握“局部最优即全局最优”的算法哲学。 一、贪心算法核心思想 贪心算法(Greedy Algorit…...
构建稳健的机器学习系统:应对数据偏移挑战
构建稳健的机器学习系统:应对数据偏移挑战 1. 引言:数据偏移类型与挑战 在机器学习系统从实验室到生产环境的转变过程中,数据偏移(Data Shift)是最常见也最具挑战性的问题之一。所谓数据偏移,指的是训练数…...
从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…...
3个版本的Unity项目的异同
根据搜索结果,以下是关于 SPR 3D Sample Scene(URP)、SPR Universal 3D 和 3D(Built-In Render Pipeline) 的定义及区别分析: 1. 定义与用途 SPR 3D Sample Scene(URP) 是基于 Universal Render Pipeline (URP) 的 3D 示例场景,专为展示 URP …...
组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)
一、什么是组态软件 组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域,用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具,使…...
Linux系统perf命令使用介绍,如何用此命令进行程序热点诊断和性能优化
Linux perf 命令使用指南:程序热点诊断与性能优化 perf 是 Linux 系统上一个强大的性能分析工具,它能够帮助开发者进行程序热点诊断和性能优化。下面详细介绍 perf 的使用方法。 1. perf 简介 perf (Performance Event Counters) 是 Linux 内核提供的…...
《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》
总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:Linux运维实战总结 一、背景信息 在ubuntu 22.04中,pam_tally2模块已被弃用,取而代之的是pam_faillock模块。因此…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Spring MVC 深度解析:原理、源码剖析与实战
Spring MVC 深度解析:原理、源码剖析与实战 在 Spring 体系中,Spring MVC 作为 Web 层的核心框架,承担着请求处理、参数解析、视图渲染等关键任务。今天,我们将深入剖析 Spring MVC 的执行流程,结合 源码分析…...
347 前k个高频元素
步骤1:统计元素频率 使用哈希表(unordered_map)统计每个元素的出现次数,时间复杂度为 O(n)。 步骤2:构建最小堆维护Top K 优先队列(最小堆):用priority_queue维护当前频率最高的k…...
BUUCTF-web刷题篇
1.EASYSQL破解密码 万能公式: 1 and 11 1 and 11 1 or 11 1 or 11 解释:payload SELECT * FROM tables WHERE username1 or 11 and password1 or 11 优先级排序:and 优先级高于 or,所以要计算 and 然后再计算 or username1…...
LeetCode 第31~33题
目录 LeetCode 第31题:下一个排列 LeetCode 第32题:最长有效括号 LeetCode 第33题:搜索旋转排序数组 LeetCode 第31题:下一个排列 题目描述 整数数组的一个排列就是将所有成员以序列或线性顺序排列。例如arr[1,2,3],以…...
【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播,计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …...
