欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > MQTT 消息队列传输协议(Message Queuing Telemetry Transport)

MQTT 消息队列传输协议(Message Queuing Telemetry Transport)

2025/6/21 23:04:52 来源:https://blog.csdn.net/2301_82089146/article/details/148729674  浏览:    关键词:MQTT 消息队列传输协议(Message Queuing Telemetry Transport)

目录

MQTT协议简介

协议角色

MQTT协议通讯流程

消息类型

1. 连接阶段

2. 心跳阶段

3. 发布阶段(QoS 0, 1, 2)

4. 订阅阶段

5. 关闭阶段

总结

MQTT 协议数据结构

MQTT数据

TCP部分:

MQTT部分:

固定报头

可变报头 

 有效载荷

 ​编辑

模式:发布/订阅主题

优点:代码量小、低带宽、实时可靠

应用:物联网、小型设备、移动应用

  发布者:传感器采集了一些数据要发送到云端(代理服务器)

代理服务器:向订阅者发送有需要的数据

订阅者:通过代理服务器订阅需要的信息

MQTT协议简介

协议角色

发布者 —— 代理服务器  —— 订阅者

MQTT协议通讯流程

消息类型

连接与响应 —— 订阅主题 —— 发布与响应 —— PING(心跳) ——关闭

1. 连接阶段
  • 发布者和订阅者:客户端(发布者或订阅者)首先通过TCP/IP与服务器端(代理)建立连接。

  • 代理:服务器端接收到连接请求后,发送连接响应,确认连接建立。

2. 心跳阶段
  • 发布者和订阅者:客户端发送心跳(Ping)消息给代理,以保持连接的活跃状态。

  • 代理:服务器端接收到心跳消息后,发送心跳响应,确认连接仍然有效。

3. 发布阶段(QoS 0, 1, 2)
  • QoS 0(最多一次)

    • 发布者:发布消息,不等待确认。

    • 代理:接收消息并直接转发给订阅者

  • 应用场景:

  • QoS 0级别提供最低的消息传递保证,消息最多被传输一次,但不保证一定会到达。这种级别的服务质量适用于对消息传递的可靠性要求不高的场景,主要关注消息的传输速度和减少网络负载。

    • 传感器数据上报:例如,环境监测设备定期发送温度、湿度等数据。即使偶尔丢失一些数据点,也不会对整体分析产生重大影响。

    • 状态更新:如智能家居设备的状态更新(如灯光开关状态),即使某些状态更新未被接收,用户可以手动重新设置。

    • 日志记录:设备运行日志的发送,丢失一些日志条目通常不会影响系统的正常运行。

  • QoS 1(至少一次)

    • 发布者:发布消息,并等待代理的确认收到(PUBACK)。

    • 代理:接收消息后,发送确认收到给发布者,并将消息转发给订阅者。

应用场景:

QoS 1级别提供至少一次的消息传递保证,确保消息至少被传输一次,但可能会有重复。这种级别的服务质量适用于需要确保消息至少被接收一次,但可以接受偶尔重复的场景。

  • 远程控制指令:如智能家居中的远程控制指令(如打开空调),需要确保指令至少被执行一次,但偶尔的重复执行(如空调被重复打开)是可以接受的。

  • 报警系统:安全监控系统中的报警信息发送,需要确保至少收到一次报警,以避免错过重要的安全事件。

  • 设备配置更新:向远程设备发送配置更新,需要确保更新至少被应用一次,但偶尔的重复更新通常不会影响设备的正常运行。

  • QoS 2(恰好一次)

    • 发布者:发布消息,并等待代理的发布释放(PUBCOMP)。

    • 代理:接收消息后,发送发布收到(PUBREC)给发布者,确认消息已收到但未完成处理。代理将消息转发给订阅者,订阅者处理完成后,发送发布完成(PUBREL)给代理,代理再发送发布释放(PUBCOMP)给发布者,完成整个流程。 

应用场景:

QoS 2级别提供恰好一次的消息传递保证,确保消息只被传输一次,既不丢失也不重复。这种级别的服务质量适用于对消息传递的准确性和一致性要求极高的场景。

  • 交易系统:金融交易系统中的交易指令发送,需要确保每个交易指令只被执行一次,以避免重复交易或交易丢失。

  • 医疗设备监控:医疗设备(如心脏监测器)发送的关键健康数据,需要确保数据的准确性和一致性,以便于医生做出准确的诊断。

  • 工业自动化:在工业自动化系统中,控制指令的发送需要精确无误,以确保生产线的安全和效率。

4. 订阅阶段
  • 订阅者:客户端发送订阅请求(SUBSCRIBE)给代理,请求订阅特定的主题。

  • 代理:服务器端接收到订阅请求后,发送订阅响应(SUBACK),确认订阅成功,并将订阅者加入到相应主题的订阅列表中。

5. 关闭阶段
  • 发布者和订阅者:客户端发送关闭(DISCONNECT)消息给代理,请求断开连接。

  • 代理:服务器端接收到关闭请求后,关闭与客户端的连接。

总结

这张图详细描述了MQTT协议中客户端(发布者和订阅者)与服务器端(代理)之间的通信流程,包括连接、心跳、发布、订阅和关闭等关键步骤。通过这些步骤,MQTT协议能够实现高效、可靠的消息传输,特别适用于物联网设备之间的通信。

MQTT 协议数据结构

MQTT数据

TCP部分:
  • TCP首部:TCP协议的每个数据包都包含一个固定的首部,这个首部至少包含20个字节的信息,用于确保数据包的传输控制和完整性。首部中包含了诸如源端口、目的端口、序列号、确认号、数据偏移、保留位、控制位、窗口大小等重要信息,这些信息对于TCP连接的建立、维护和拆除都是必不可少的。

MQTT部分:
  • 固定报头(最少2个字节):MQTT协议的每个控制报文都以一个固定的报头开始,这个报头至少包含2个字节,用于描述报文的类型和标志。固定报头后可能跟随一个或多个可变长度的字段,这些字段的长度由固定报头中的剩余长度字段定义。

  • 可变报头(可选):在固定报头之后,MQTT报文可能包含一个可变报头,这个报头的长度和内容取决于具体的MQTT报文类型(如CONNECT、PUBLISH、SUBSCRIBE等)。例如,在CONNECT报文中,可变报头可能包含客户端ID、用户名和密码等信息。

  • 有效载荷(可选):MQTT报文的有效载荷是实际传输的数据部分,它位于可变报头之后。有效载荷的长度由固定报头中的剩余长度字段定义。例如,在PUBLISH报文中,有效载荷就是实际要发布的消息内容。

通过这种设计,MQTT协议能够在保持高效传输的同时,提供必要的消息传递保证,如QoS(服务质量)等级,以满足不同应用场景的需求。

固定报头

固定报头由两个字节组成,具体结构如下:

  1. 第一个字节(高字节)

    • [4~7] 保留位:这4位目前是保留位,用于将来的扩展,应设置为0。

    • [3] 报文类型:这1位表示报文的类型,不同的值对应不同的MQTT控制报文类型(如CONNECT、PUBLISH、SUBSCRIBE等)。

    • [2] 重发:这1位用于标识该报文是否为重发。只有在QoS > 1时才可能用到。当第一次发布消息时,置0;如果是重复发布,则置1。

    • [1] QoS消息等级:这1位表示消息的服务质量(QoS)等级,可以是0、1或2。

    • [0] flag:这1位用于标识是否还有后续报文。

  1. 第二个字节(低字节)

    • 剩余长度:这个字节表示后续报文的总长度,包括可变报头和有效载荷的长度。剩余长度字段可以扩展为多字节,以支持更大的报文长度。

剩余长度字段的编码方式

剩余长度字段采用可变长度编码,最多可以扩展为4个字节,以支持更大的报文长度。每个字节的高4位表示剩余字节的数量,低4位表示剩余长度的一部分。具体编码方式如下:

  • 第二个字节

    • [7~6] 0或1:2位,表示剩余长度的编码方式。0表示单字节长度最大表示 128,1表示后续还有字节。

    • [5~0] 剩余长度(最多4个字节):6位,表示剩余长度的一部分。

  • 如果存在第三个字节

    • [7] 1:1位,表示后续还有字节。

    • [6~0] 剩余长度(最多4个字节):7位,表示剩余长度的一部分。

  • 如果存在第四个字节

    • [7] 1:1位,表示后续还有字节。

    • [6~0] 剩余长度(最多4个字节):7位,表示剩余长度的一部分。

  • 如果存在第五个字节

    • [7] 0:1位,表示后续没有字节。

    • [6~0] 剩余长度(最多4个字节):7位,表示剩余长度的一部分。

可变报头 

  1. 协议名:告诉服务器你要用的是什么协议,这里是“MQTT”。

  2. 协议级别:表示你使用的MQTT协议的版本,图中是3.1.1版本。

  3. 连接标志:一些控制连接行为的标志,比如是否需要用户名和密码、是否保留消息等。

  4. 保持连接:设置客户端和服务器保持连接的时间,图中是60秒。

 有效载荷

 

MQTT 消息中实际传输的数据部分。在 CONNECT 请求中,有效载荷包含连接时需要的一些额外信息,如客户端标识、遗嘱消息、用户名和密码等。以下是各部分的简要说明及其用途:

  1. 客户端标识符:用于唯一标识连接到 MQTT 代理的客户端,通常用于会话管理和消息持久化。

  2. 遗嘱属性:包括遗嘱主题和遗嘱载荷,这些信息会在客户端意外断开连接时发送给指定的主题。

  3. 遗嘱主题:客户端希望在断开连接时发布消息的主题。

  4. 遗嘱载荷:客户端希望在断开连接时发布的消息内容。

  5. 用户名:用于客户端身份验证的用户名。

  6. 密码:用于客户端身份验证的密码。

这些信息帮助 MQTT 代理了解客户端的身份、期望的行为(如遗嘱消息设置)以及如何进行身份验证。通过这些信息,MQTT 代理可以管理客户端的连接状态、处理消息的持久化和转发,以及在客户端断开时执行特定的操作。 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词