MQTT协议

参考网站:MQTT协议,终于有人讲清楚了 - 知乎 (zhihu.com)

一、什么是 MQTT

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

MQTT 最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。

作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。

二、MQTT 相关名词

2.1 订阅和发布

MQTT消息传递示例

MQTT 使用的是发布/订阅消息模式,它提供了一对多的消息分发机制,从而实现与应用程序的解耦。

这是一种消息传递模式,消息不是直接从发送器发送到接收器(即点对点),而是由 MQTT server(或称为 MQTT Broker)分发的。

  • MQTT 服务器负责消息的分发,因此必须是发布者(Publisher),而绝不是订阅者!
  • 客户端可以发布消息(发送方)、订阅消息(接收方)或两者兼而有之

2.2 QoS

QoS(Quality of Service levels)服务质量是 MQTT 的一个重要特性。当我们使用 TCP/IP 时,连接已经在一定程度上受到保护。但是在无线网络中,中断和干扰很频繁,MQTT 在这里帮助避免信息丢失及其服务质量水平。这些级别在发布时使用。如果客户端发布到 MQTT 服务器,则客户端将是发送者,MQTT 服务器将是接收者。当 MQTT 服务器向客户端发布消息时,服务器是发送者,客户端是接收者。

QoS 0

至多一次”,消息发布依赖于底层TCP/IP网络。这一级别会发生消息丢失或重复,即:<=1。

QoS 0

QoS 1

至少一次”,承诺消息将至少传送一次给订阅者,但消息重复可能会发生。

QoS 1

QoS 2

只有一次”,消息仅传送到目的地一次。为此,带有唯一消息 ID 的消息会存储两次,首先来自发送者,然后是接收者。QoS 2 在网络中具有最高的开销,因为在发送方和接收方之间需要两个流。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

QoS 2

2.3 MQTT 数据包

MQTT 数据包

2.3.1 固定头(Fixed header)

存在于所有 MQTT 数据包中,表示数据包类型及数据包的分组类标识。

消息类型【byte 1(bits 7~4)】

名称 报文流动方向 描述
Reserved 0 不可用 保留位
CONNECT 1 客户端到服务器 客户端请求连接服务器
CONNACK 2 服务器到客户端 连接报文确认
PUBLISH 3 双向 发布消息
PUBACK 4 双向 QoS 1 消息发布收到确认
PUBREC 5 双向 发布收到(保证第一部分)
PUBREL 6 双向 发布释放(保证第二部分)
PUBCOMP 7 双向 QoS 2 消息发布完成(保证第三部分)
SUBSCRIBE 8 客户端到服务器 客户端请求订阅
SUBACK 9 服务器到客户端 订阅请求报文确认
UNSUBSCRIBE 10 客户端到服务器 客户端请求取消订阅
UNSUBACK 11 服务器到客户端 取消订阅报文确认
PINGREQ 12 客户端到服务器 PING 请求(心跳请求)
PINGRESP 13 服务器到客户端 PING 应答(心跳请求)
DISCONNECT 14 客户端到服务器 客户端断开连接
Reserved 15 不可用 保留位

标识位【byte 1(bits 3~0)】

  • DUP:控制报文的重复分发标志
  • QoS:PUBLISH 报文的服务质量等级(00、01、10、11)
  • RETAIN:PUBLISH 报文的保留标志
控制报文 固定报头标志 Bit 3 bit 2 bit 1 bit 0
Reserved
CONNECT Reserved 0 0 0 0
CONNACK Reserved 0 0 0 0
PUBLISH Used in MQTT 3.1.1 DUP QoS QoS RETAIN
PUBACK Reserved 0 0 0 0
PUBREC Reserved 0 0 0 0
PUBREL Reserved 0 0 0 0
PUBCOMP Reserved 0 0 0 0
SUBSCRIBE Reserved 0 0 0 0
SUBACK Reserved 0 0 0 0
UNSUBSCRIBE Reserved 0 0 0 0
UNSUBACK Reserved 0 0 0 0
PINGREQ Reserved 0 0 0 0
PINGRESP Reserved 0 0 0 0
DISCONNECT Reserved 0 0 0 0
Reserved Reserved

剩余长度

剩余长度是一个可变字节整数,表示当前控制报文中剩余的字节数,包括可变报头和有效载荷中的数据。

2.3.2 可变头(Variable header)

可变报头位于固定报头和有效载荷之间,可变报头的内容根据报文类型的不同而不同。通常都包括一个 2 字节的数据包标识字段,这些类型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK

2.3.3 消息体(Payload)

Payload 有效载荷位于 MQTT 数据包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE 这四种类型包含有效载荷。

  • CONNECT 有效载荷内容主要是:客户端的 ClientID、订阅的主题、Message 以及用户名和密码
  • SUBSCRIBE 有效载荷内容是:主题过滤器指明需要订阅的 Topic 以及 QoS
  • SUBACK 有效载荷内容是:服务器对于 SUBSCRIBE 所申请的主题及 QoS 进行确认和回复
  • UNSUBSCRIBE 有效载荷内容是:客户端想要取消订阅的主题过滤器

三、MQTT 工作流程

四、MQTT VS Socket

WebSocket 是一种网络传输协议,位于 OSI 模型的应用层。可在单个 TCP 连接上进行全双工通信,能更好的节省服务器资源和带宽并达到实时通信,客户端和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输

MQTT 协议是一种消息队列传输协议,位于 OSI 模型的应用层。采用订阅、发布机制,订阅者只接收自己已经订阅的数据,非订阅数据则不接收,既保证了必要的数据的交换,又避免了无效数据造成的储存与处理。

4.1 通信模型不同

MQTT 和 WebSocket 的底层都是使用 TCP 协议确保可靠传输数据,都支撑双向通信。但 WebSocket 是一种简单的报文协议,仅仅定义了会话的发起方式报文格式及类型,只是在 TCP 协议之上实现了简单的报文通信。而 MQTT 则是一种比较复杂的消息协议,MQTT 不仅规定了具体的协议编码,还规定了客户端和服务器的通信模型。从这个意义上讲,MQTT over WebSocket,即 MQTT 可以工作在 WebSocket 之上。

4.2 报文结构不同

MQTT 和 WebSocket 都使用二进制编码(有别于 HTTP 这一类基于文本编码的协议),但 WebSocket 的报文要远比 MQTT 的简单。

4.3 使用场景不同

MQTT 是为了物联网场景设计的,基于 TCP 的 Pub/Sub(订阅/发布)协议,有许多为物联网优化的特性,比如适应不同网络的 QoS、层级主题、遗言等等。

WebSocket 是为了 HTML5 应用方便与服务器双向通讯而设计的协议,HTTP 握手然后转 TCP 协议,用于取代之前的 Server Push、Comet、长轮询等老旧实现。

两者的交集在于,如何通过 HTML5 应用来作为 MQTT 的客户端,以便接受设备消息或者向设备发送信息。那么此时,MQTT over WebSocket 自然成了最合理的途径了。





  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 Liangxj
  • 访问人数: | 浏览次数: