MQTT

主要功能:实现软硬件通信的协议

特点

  1. 轻量级:报文体积小
  2. 可靠:连接稳定
  3. 安全:有多层加密
  4. 双向通信:客户端既可以发送消息,也可以接收消息
  5. 连续、有状态的会话:MQTT 提供了客户端与 Broker 之间保持有状态会话的能力,这使得系统即使在断开连接后也能记住订阅和未传递的消息。此外,客户端还可以在建立连接时指定一个保活间隔,这会促使 Broker 定期检查连接状态。如果连接中断,Broker 会储存未传递的消息(根据 QoS 级别确定),并在客户端重新连接时尝试传递它们。这个特性保证了通信的可靠性,降低了因间断性连接而导致数据丢失的风险。
  6. 语言支持:可以在多种编程语言中使用 MQTT

# MQTT 的工作流程

在了解了 MQTT 的基本组件之后,让我们来看看它的一般工作流程:

  1. 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
  2. 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
  3. MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。

主题

MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:

chat/room/1

sensor/10/temperature

sensor/+/temperature

MQTT 主题支持以下两种通配符:+ 和 #。

  1. +:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。
  2. #:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。

注意:通配符主题只能用于订阅,不能用于发布。

关于 MQTT 主题的更多详情,请参阅文章通过案例理解 MQTT 主题与通配符

QoS

MQTT 提供了三种服务质量(QoS),在不同网络环境下保证消息的可靠性。

  1. QoS0 代表,Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
  2. QoS1 代表,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
  3. QoS2 代表,Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息

关于 MQTT QoS 的更多详情,请参阅文章 MQTT QoS 0, 1, 2 介绍

# Emqx

emqx 是实现 mqtt 的一个消息中间件(上面提到的 Broker)

  1. 客户端将消息推送到 Emqx,或者订阅 Emqx 中的消息

# Emqx 常见端口

1883 MQTT TCP 协议端口

8883 MQTT/TCP SSL 端口

8083 MQTT/WebSocket 端口

8084 MQTT/WebSocket with SSL 端口

8080 MQTT 执行引擎 HTTP API 端口

18083 EMQX Dashboard 管理控制台端口

# 总结

  1. mqtt 是软硬件通信的一个协议,因为具有上述特点而被广泛使用在软硬件之间的通信;
  2. emqx 可以理解为一台中间服务器,负责向客户端(java 后台、硬件)提供发布和订阅的功能,在客户端利用 mqtt 协议发布一个主题消息到 emqx 的时候,emqx 会向所有订阅该主题的客户端发送这条消息

emqx:

id: de3713ee

secret: INd3_u9q28Ykf85J

# 测试 demo

[DEBUG] IMU data: acc=(-0.105,-0.067,-0.979), gyro=(0.560,-0.542,0.175), 串口会输出这个,这个信息是怎么来的,同时我需要串口输出完整的 DataFrame 信息

更新于 阅读次数