MQTT 协议学习笔记

  MQTT(Message Queuing Telemetry Transport),即消息队列遥测传输协议,是 IBM 开发的一种轻量级、基于代理的发布/订阅式的消息传输协议。

简介

  MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。

7-1

  实现 MQTT 协议需要:客户端和服务器端。

  MQTT 协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

  MQTT 传输的消息分为:主题(Topic)和负载(payload)两部分。

  Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。

MQTT客户端

  一个使用 MQTT 协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

  • 发布其他客户端可能会订阅的信息
  • 订阅其它客户端发布的消息
  • 退订或删除应用程序的消息
  • 断开与服务器连接
MQTT服务器

  MQTT 服务器以称为“消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:

  • 接受来自客户的网络连接
  • 接受客户发布的应用信息
  • 处理来自客户端的订阅和退订请求
  • 向订阅的客户转发应用程序消息
相关术语
  • 订阅(Subscription)

    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。

  • 会话(Session)

    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

  • 主题名(Topic Name)

    连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。

  • 主题筛选器(Topic Filter)

    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。

  • 负载(Payload)

    消息订阅者所具体接收的内容。

特点
  • 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合
  • 对负载内容屏蔽的消息传输
  • 使用 TCP/IP 提供网络连接
  • 三种消息发布服务质量(Qos)
    • “至多一次”,即 Qos=0,会发生信息丢失,消息发布完全依赖底层 TCP/IP 网络。
    • “至少一次”,即 Qos=1,确保消息到达,但消息重复可能会发生。
    • “只有一次”,即 Qos=2,确保消息到达一次。
  • 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

控制报文格式

  每个 MQTT 命令消息的消息头部都包含了一个固定头部。其中一些类型的消息可能还需要一个可变头部和一个有效载荷(可理解为消息体)。

  MQTT 协议通过交换预定义的 MQTT 控制包来实现的。一个 MQTT 控制包由 3 个部分组成,并总是按照如下顺序排列:

名称 解释
Fixed header 固定报头,所有控制报文都包含
Variable header 可变报头,部分控制报文包含
Payload 有效载荷,部分控制报文包含
固定头部

  每个 MQTT 命令消息的消息头部都包含一个固定头部。

7-2

  • MQTT 控制报文的类型

    MQTT 包含的控制包类型一共有14种,如下图:

    7-3

  • 用于指定控制报文类型的标志位

    固定报头第 1 个字节的剩余的 4 位 [3-0]包含每个 MQTT 控制报文类型特定的标志

    7-4

    • DUP = 控制报文的重复分发标志
    • QoS = PUBLISH 报文的服务质量等级
    • RETAIN = PUBLISH 报文的保留标志
  • 剩余长度

      剩余长度(Remaining Length)表示当前报文剩余部分的字节数,包括可变报头和负载的数据。剩余长度不包括用于编码剩余长度字段本身的字节数。

可变报头

  某些 MQTT 控制报文包含一个可变报头部分。它在固定报头和负载之间。可变报头的内容根据报文类型的不同而不同。可变报头的报文标识符(Packet Identifier)字段存在于在多个类型的报文里。

  • 报文标识符

    7-5

      很多控制报文的可变报头部分包含一个两字节的报文标识符字段。这些报文是 PUBLISH(QoS>0 时),PUBACK,PUBREC,PUBREL,PUBCOMP,SUBSCRIBE, SUBACK,UNSUBSCIBE,UNSUBACK。

      包含报文标识符的控制报文:

    7-6

有效载荷

  某些 MQTT 控制报文在报文的最后部分包含一个有效载荷。例如,对于 PUBLISH 包而言,其有效载荷为应用层消息,对于 SUBSCRIBE 包而言,其有效载荷内容为主题过滤器列表,SUBACK 包的有效载荷包含一个返回码列表。

7-7

坚持原创技术分享,您的支持将鼓励我继续创作!