MQTT协议笔记

news2025/3/30 21:10:12

消息格式

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等级。
  • 其他类型的消息(如CONNECTCONNACK等)的有效载荷可能是空的,或者包含少量特定数据。

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/temperaturehome/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协议,终于有人讲清楚了-腾讯云开发者社区-腾讯云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2322825.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志

一、首先按照以下 指引 中的 第1、2步骤&#xff0c;安装一下 AGDE &#xff0c;AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension&#xff08;AGDE&#xff09;对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前&#xff0c;记得…

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智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

07_GRU模型

GRU模型 双向GRU笔记:https://blog.csdn.net/weixin_44579176/article/details/146459952 概念 GRU&#xff08;Gated Recurrent Unit&#xff09;也称为门控循环单元&#xff0c;是一种改进版的RNN。与LSTM一样能够有效捕捉长序列之间的语义关联&#xff0c;通过引入两个&qu…

【大模型基础_毛玉仁】3.4 Prompt 技巧

目录 3.4 Prompt 技巧3.4.1 规范Prompt 编写1&#xff09;任务说明要明确2&#xff09;上下文丰富且清晰3&#xff09;输出格式要规范4&#xff09;排版要清晰 3.4.2 合理归纳提问1&#xff09;复杂问题拆解2&#xff09;追问 3.4.3 适时使用CoT1&#xff09;何时使用CoT2&…

探索PyMOL新插件NRGSuite-Qt:全面提升分子对接、结合位点预测与动力学模拟的研究效率

随着分子建模和计算生物学的快速发展&#xff0c;分子对接&#xff08;Molecular Docking&#xff09;、结合位点预测、相互作用分析以及动力学研究等领域的工具越来越重要。这些工具不仅帮助研究人员理解分子间的相互作用机制&#xff0c;还能加速药物设计和优化过程。NRGSuit…

wokwi arduino mega 2560 - 键盘与LCD显示

截图&#xff1a; 链接&#xff1a; https://wokwi.com/projects/414520193913760769 代码&#xff1a; //cslg lcd key #include <LiquidCrystal.h> // 引入LiquidCrystal库&#xff0c;用于LCD显示 #include <Keypad.h> // 引入Keypad库&#xff0c;用于键盘输…

Linux设置SSH免密码密钥登录

文章目录 设置SSH免密码密钥登录第一步&#xff1a; 生成SSH密钥对&#xff08;在客户端操作&#xff09;方式一&#xff1a;Windows 10/11 内置的 OpenSSH 客户端&#xff08;推荐&#xff09;常用选项&#xff1a;密钥算法选择建议生成秘钥 方式二&#xff1a;借用Xshell工具…

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

GPU算力哪家好?GpuGeek推出高性能GPU云服务

在人工智能和深度学习领域&#xff0c;GPU算力租赁已成为推动技术创新的关键因素。随着越来越多的企业和个人开发者投身于AI研究和应用开发&#xff0c;如何高效、灵活地获取GPU算力成为了一个亟待解决的问题。GpuGeek作为一站式AI基础设施平台&#xff0c;凭借其独特的优势&am…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…

组态软件之万维组态介绍(web组态、html组态、vue2/vue3组态、组态软件、组态编辑器)

一、什么是组态软件 组态软件是一种用于创建、配置和管理监控和控制系统的软件工具。组态是指不需要编写计算机程序、通过配置的方式完成工业应用开发的系统。它们通常用于工业自动化领域&#xff0c;用于实时监视和控制工业过程。组态软件提供了丰富的功能和工具&#xff0c;使…

《Linux运维实战:Ubuntu 22.04使用pam_faillock实现登录失败处理策略》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、背景信息 在ubuntu 22.04中&#xff0c;pam_tally2模块已被弃用&#xff0c;取而代之的是pam_faillock模块。因此&#xf…

AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤

前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…

【NLP 44、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播&#xff0c;计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求&#xff0c;小程序开通直播需要注册主体具备互联网直播的资质&#xff0c;普通企业需要《信息网络传播视听节目许可证》&#xff0c;表演性质的直播需要《网络文化经营许可证》&#xff0c;政府主体需要《社会信用代码》及…

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

慧通测控汽车智能座舱测试技术

一、引言 随着科技的飞速发展&#xff0c;汽车正从单纯的交通工具向智能化移动空间转变。智能座舱作为这一转变的核心体现&#xff0c;融合了多种先进技术&#xff0c;为用户带来前所未有的驾驶体验。从简单的信息娱乐系统到高度集成的人机交互、智能驾驶辅助以及车辆状态监测…