MQTT
主要功能:实现软硬件通信的协议
特点
- 轻量级:报文体积小
- 可靠:连接稳定
- 安全:有多层加密
- 双向通信:客户端既可以发送消息,也可以接收消息
- 连续、有状态的会话:MQTT 提供了客户端与 Broker 之间保持有状态会话的能力,这使得系统即使在断开连接后也能记住订阅和未传递的消息。此外,客户端还可以在建立连接时指定一个保活间隔,这会促使 Broker 定期检查连接状态。如果连接中断,Broker 会储存未传递的消息(根据 QoS 级别确定),并在客户端重新连接时尝试传递它们。这个特性保证了通信的可靠性,降低了因间断性连接而导致数据丢失的风险。
- 语言支持:可以在多种编程语言中使用 MQTT
# MQTT 的工作流程
在了解了 MQTT 的基本组件之后,让我们来看看它的一般工作流程:
- 客户端使用 TCP/IP 协议与 Broker 建立连接,可以选择使用 TLS/SSL 加密来实现安全通信。客户端提供认证信息,并指定会话类型(Clean Session 或 Persistent Session)。
- 客户端既可以向特定主题发布消息,也可以订阅主题以接收消息。当客户端发布消息时,它会将消息发送给 MQTT Broker;而当客户端订阅消息时,它会接收与订阅主题相关的消息。
- MQTT Broker 接收发布的消息,并将这些消息转发给订阅了对应主题的客户端。它根据 QoS 等级确保消息可靠传递,并根据会话类型为断开连接的客户端存储消息。
主题
MQTT 协议根据主题来转发消息。主题通过 / 来区分层级,类似于 URL 路径,例如:
chat/room/1
sensor/10/temperature
sensor/+/temperature
MQTT 主题支持以下两种通配符:+ 和 #。
- +:表示单层通配符,例如 a/+ 匹配 a/x 或 a/y。
- #:表示多层通配符,例如 a/# 匹配 a/x、a/b/c/d。
注意:通配符主题只能用于订阅,不能用于发布。
关于 MQTT 主题的更多详情,请参阅文章通过案例理解 MQTT 主题与通配符。
QoS
MQTT 提供了三种服务质量(QoS),在不同网络环境下保证消息的可靠性。
- QoS0 代表,Sender 发送的一条消息,Receiver 最多能收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,也就算了;
- QoS1 代表,Sender 发送的一条消息,Receiver 至少能收到一次,也就是说 Sender 向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,但是因为重传的原因,Receiver 有可能会收到重复的消息;
- QoS2 代表,Sender 发送的一条消息,Receiver 确保能收到而且只收到一次,也就是说 Sender 尽力向 Receiver 发送消息,如果发送失败,会继续重试,直到 Receiver 收到消息为止,同时保证 Receiver 不会因为消息重传而收到重复的消息
关于 MQTT QoS 的更多详情,请参阅文章 MQTT QoS 0, 1, 2 介绍。
# Emqx
emqx 是实现 mqtt 的一个消息中间件(上面提到的 Broker)
- 客户端将消息推送到 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 管理控制台端口
# 总结
- mqtt 是软硬件通信的一个协议,因为具有上述特点而被广泛使用在软硬件之间的通信;
- 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 信息