发布于

MQTT协议的初步理解

1.0 概念

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅模式的“轻量级”的消息协议,可在发布者和订阅者之间传递消息。MQTT 协议构建于 TCP/IP 协议上,由 IBM 在 1999 年发布,当前已经成为了一种主流的物联网通信协议。

MQTT 最大的优点在于,能够以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。它是一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。由于其小巧、高效和可靠的特点,MQTT 在物联网领域得到了广泛的应用。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT),且已经广泛应用于通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中。

MQTT 协议的工作原理是基于发布/订阅模式。在这种模式下,发布者可以向一个或多个主题发布消息,而订阅者可以订阅这些主题以接收相关消息。这种模式允许多个发布者和订阅者同时存在,实现了一种灵活的消息传递机制。此外,MQTT 协议还支持三种消息传递质量等级,可根据需要进行选择。

MQTT 协议的另一个重要特点是其轻量级和简单的设计。它的消息头非常小,只有 2 个字节,这意味着在网络带宽有限的环境下也能够实现高效的消息传递。此外,MQTT 协议还支持持久化连接和消息队列等高级功能,可进一步提高消息的可靠性和传递效率。

MQTT 协议的应用范围非常广泛。例如,在智能家居领域,可以使用 MQTT 协议将各种智能设备连接在一起,实现设备的远程控制和监测。在工业领域,MQTT 协议可以用于实现设备的远程监控和维护,提高生产效率和产品质量。在智慧城市建设中,MQTT 协议可以用于交通管理、环境监测和公共安全等方面,提升城市管理和居民生活的质量。

1.1 MQTT 协议的实现方式

实现 MQTT 协议需要客户端和服务器端通讯完成, 在通讯过程中, MQTT 协议中有三种身份: 发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。 其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

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

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

1.2 网络传输与应用消息

MQTT 会构建底层网络传输: 它将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输。
当应用数据通过 MQTT 网络发送时,MQTT 会把与之相关的服务质量(QoS)和主题名(Topic)相关联

1.3 MQTT 客户端

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

  1. 发布其他客户端可能会订阅的信息
  2. 订阅其他客户端发布的消息
  3. 退定或删除应用程序的消息
  4. 断开与服务器的连接

1.4 发布/订阅、主题、会话

MQTT 是基于发布(Publish)/订阅(Subscribe)模式来进行通信及数据交换的,与 HTTP 的请求(Request)/应答(Response)的模式有本质的不同
订阅者(Subscriber)会向 消息服务器(Broker)订阅一个主题(Topic)。成功订阅后,消息服务器会将该主题下的消息转发给所有订阅者
主题(Topic)以’/‘为分隔符区分不同的层级,包含通配符’+’ 或 ‘#’的主题又称为主题过滤器(Topic Filters); 不含通配符的成为主题名(Topic Names) 例如:
sensor/10/temperature
sensor/+/temperature
SYS/broker/metrics/packets/received SYS/broker/metrics/#

'+' : 表示通配一个层级, 例如 a/+,匹配 a/x, a/y

发布者(Publisher)只能向主题名发布消息,订阅者(Subscriber)则可以通过订阅主题过滤器来通配多个主题名称
会话(Session)
每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

1.5 MQTT 协议中的方法

MQTT 协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:

  1. CONNECT(connect): 客户端连接到服务器
  2. CONNACK(connack): 连接确认
  3. PUBLISH(publish): 发布消息
  4. PUBACK(puack): 发布消息确认
  5. PUBREC(pubrec): 发布的消息已接收
  6. PUBREL(pubrel): 发布的消息已释放
  7. PUBCOMP(pubcomp): 发布完成
  8. SUBSCRIBE(subscrbe): 订阅请求
  9. SUBACK(suback): 订阅确认
  10. UNSUBSCRIBE(unsubscribe): 取消订阅
  11. UNSUBACKO(unsubacko): 取消订阅确认
  12. PINGREQ(pingreq): 客户端发送心跳
  13. PINGRESP(pingresp): 服务端心跳响应
  14. DISCONNECT(disconncet): 断开连接
  15. AUTH(auth): 认证

1.6 MQTT 三元组

MQTT 协议登录需要填用户 ID,设备 ID,设备密码等信息,就像我们平时登录 QQ,微信一样要输入账号密码才能登录。MQTT 协议登录的这 3 个参数,一般称为 MQTT 三元组

2.0 MQTT 协议数据包结构

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

  1. 固定头(Fixed header)。存在于所有 MQTT 数据包中,表示数据包类型及数据包的分组类标识,如连接,发布,订阅,心跳等。其中固定头是必须的,所有类型的 MQTT 协议中,都必须包含固定头。
  2. 可变头(Variable header)。存在于部分 MQTT 数据包中,数据包类型决定了可变头是否存在及其具体内容。可变头部不是可选的意思,而是指这部分在有些协议类型中存在,在有些协议中不存在。
  3. 消息体(Payload)。存在于部分 MQTT 数据包中,表示客户端收到的具体内容。与可变头一样,在有些协议类型中有消息内容,有些协议类型中没有消息内容。

2.1 MQTT 协议官网介绍

目前 MQTT 协议主要是 3.1.1 和 5.0 两个版本。 本篇文章是介绍 3.1.1 版本的 MQTT 协议。 各大标准的 MQTT 服务器都支持 3.1.1.

链接:https://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html

2.2 需要实现的三个函数

整个 MQTT 协议里,主要是实现 3 个函数就行了(其他的接口看自己需求)。

下面列出的 3 个函数,在一般的 MQTT 通信里是必备的。我们只要实现了这 3 个函数,那么完成基本的 MQTT 通信就没有问题了。

//发布主题
unsigned char MQTT_PublishData(char* topic, char* message, unsigned char qos);

//订阅或者取消订阅主题
unsigned char MQTT_SubscribeTopic(char* topic, unsigned char qos, unsigned char whether);

//登录 MQTT 服务器
unsigned char MQTT_Connect(char* ClientID, char* Username, char* Password);

浏览 (677) 点赞 收藏 分享
评论