MQTT协议详细说明与理解

一、简介

  MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议) 协议是应用于边缘终端设备之间通过中心服务进行相互通信的协议。 MQTT 协议基于消息发布与订阅的处理机制实现,属于轻量级协议

  MQTT is a lightweight, publish-subscribe based messaging protocol designed for resource-constrained devices and low-bandwidth, high-latency, or unreliable networks.

二、协议详细说明

2.1)逻辑结构

mqtt协议

  • MQTT 组成部分

  从逻辑上来看,MQTT 主要有三部分组成:

    •   消息接收端:用来接收来自发送端的消息
    •   MQTT 代理:提供发布与订阅的能力
    •   消息发送端:用来发布消息给订阅的接收端

  但是从物理上来看,MQTT 只由两部分组成:

  • MQTT 客户端(通常是多个节点)
    •   发布其他客户端可能会订阅的信息;
    •   订阅其它客户端发布的消息;
    •   退订或删除应用程序的消息;
    •   断开与服务器连接;
  • MQTT 代理服务端
    •   接受来自客户的网络连接;
    •   接受客户发布的应用信息;
    •   处理来自客户端的订阅和退订请求;
    •   向订阅的客户转发应用程序消息;

2.2)数据结构

  在MQTT协议中,一个MQTT数据包由:固定头(Fixed header)、可变头(Variable header)、消息体(payload)三部分构成。

  MQTT数据包结构如下:

  1. 固定头(Fixed header)。存在于所有MQTT数据包中,表示数据包类型及数据包的分组类标识。
  2. 可变头(Variable header)。存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。
  3. 消息体(Payload)。存在于部分MQTT数据包中,表示客户端收到的具体内容。

2.2.1)MQTT固定头

  固定头存在于所有MQTT数据包中,其结构如下:

2.2.1.1)MQTT数据包类型

  位置:Byte 1中bits 7-4。相于一个4位的无符号值,类型、取值及描述如下:

2.2.1.2)标识位

  位置:Byte 1中bits 3-0。
  在不使用标识位的消息类型中,标识位被作为保留位。如果收到无效的标志时,接收端必须关闭网络连接:

  1. DUP:发布消息的副本。用来在保证消息的可靠传输,如果设置为1,则在下面的变长中增加MessageId,并且需要回复确认,以保证消息传输完成,但不能用于检测消息重复发送。
  2. QoS:发布消息的服务质量,即:保证消息传递的次数
    • Ø00:最多一次,即:<=1
    • Ø01:至少一次,即:>=1
    • Ø10:一次,即:=1
    • Ø11:预留
  3. RETAIN: 发布保留标识,表示服务器要保留这次推送的信息,如果有新的订阅者出现,就把这消息推送给它,如果设有那么推送至当前订阅者后释放。

2.2.1.3)剩余长度(Remaining Length)

  地址:Byte 2。
  固定头的第二字节用来保存变长头部和消息体的总大小的,但不是直接保存的。这一字节是可以扩展,其保存机制,前7位用于保存长度,后一部用做标识。当最后一位为1时,表示长度不足,需要使用二个字节继续保存。例如:计算出后面的大小为0

2.2.2) MQTT可变头

  MQTT数据包中包含一个可变头,它驻位于固定的头和负载之间。可变头的内容因数据包类型而不同,较常的应用是作为包的标识:
  很多类型数据包中都包括一个2字节的数据包标识字段,这些类型的包有:

  • PUBLISH (QoS > 0)
  • PUBACK
  • PUBREC
  • PUBREL
  • PUBCOMP
  • SUBSCRIBE
  • SUBACK
  • UNSUBSCRIBE
  • UNSUBACK

2.2.3) Payload消息体

  Payload消息体位MQTT数据包的第三部分,包含CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四种类型的消息:

  1. CONNECT,消息体内容主要是:客户端的ClientID、订阅的Topic、Message以及用户名和密码。
  2. SUBSCRIBE,消息体内容是一系列的要订阅的主题以及QoS。
  3. SUBACK,消息体内容是服务器对于SUBSCRIBE所申请的主题及QoS进行确认和回复。
  4. UNSUBSCRIBE,消息体内容是要订阅的主题。

三、协议特性

  MQTT 协议具有以下特性和优势,已成为物联网数据传输的标准:

  • 轻量、高效:IoT 设备上的 MQTT 实施需要最少的资源,因此它甚至可以用于小型微控制器。例如,最小的 MQTT 控制消息可以少至两个数据字节。MQTT 消息的标头也很小,因此您可以优化网络带宽。
  • 可扩展:MQTT 实施需要最少的代码,在操作中消耗的功率非常少。该协议还具有支持与大量物联网设备通信的内置功能。因此,您可以实施 MQTT 协议来连接数百万台此类设备。
  • 可靠:许多 IoT 设备通过低带宽、高延迟的不可靠蜂窝网络连接。MQTT 具有内置功能,可减少 IoT 设备重新连接云所需的时间。它还定义了三种不同的服务质量级别,以确保 IoT 用例的可靠性——最多一次(0)、至少一次(1)和恰好一次(2)。
  • 安全:MQTT 使开发人员可以轻松地使用现代身份验证协议(例如 OAuth、TLS1.3、客户管理的证书等)加密消息并对设备和用户进行身份验证。
  • 良好的支持:几种语言(如 Python)对 MQTT 协议的实施提供广泛的支持。因此,开发人员可以在任何类型的应用程序中以最少的编码快速实现它。

四、应用场景

 

五、参考资料

https://aws.amazon.com/cn/what-is/mqtt/

https://www.runoob.com/w3cnote/mqtt-intro.html

https://www.runoob.com/manual/mqtt/protocol/MQTT-3.1.1-CN.pdf

posted @ 2023-11-12 11:17  行近遠山  阅读(259)  评论(0)    收藏  举报