跳到主要内容

MQTT 操作-保留消息

向指定主题发布一条保留消息

问题背景

将想要保留的消息发布到指定主题,后续订阅该主题的客户端可以立即收到该消息。

解决方案

写入 MQTT 节点配置对话框中将 保留 选项设置为 ,或者在发送到节点的消息中将 msg.retain 消息属性设置为 true。

示例

mqtt-retained-message

示例JSON

本示例复用 MQTT 操作-连接MQTT Broker 中的示例,向 sensors/livingroom/temp 主题发布消息。

运行结果

在将示例中的 写入 MQTT 节点的 保留 配置设置为 之后,新添加一个客户端,并重新部署,这是可以在 调试窗口看到发布之后立马看到有两条两条数据输出,因为设置了保留之后,只要有客户端订阅这个主题就会立马收到最后设置的这条保留消息

mqtt-retained-message-new-client

拓展

retained 是 MQTT 里 消息保留(retained message) 的一个重要属性。它的作用是:

当客户端向某个 主题(topic) 发布消息时,如果将 retained 标志设置为 true,MQTT Broker 会把这条消息存储下来,并把它标记为该主题的 “保留消息”

这样就会有几个效果:


✅ 主要作用

  1. 新订阅者立即收到最新状态

    • 如果有一个新的客户端订阅了这个主题,它会立刻收到 broker 保存的 retained 消息,而不需要等到下次有人发布消息。
    • 这非常适合 状态类信息(例如设备上线/离线状态、传感器的最新数值)。
  2. 主题的“最后已知值”

    • Retained 消息相当于为主题存了一份“最新快照”。
    • 订阅者一连上就能知道这个主题的最后状态。
  3. 替代“初始化请求”

    • 不用在客户端连接时再专门发请求询问状态,直接通过 retained 消息就能获取到。

⚠️ 注意事项

  • 如果对某个主题发送 payload 为空的 retained 消息,Broker 会清除该主题的保留消息。
  • Retained 消息只存储 每个主题最新的一条,不会存历史消息。
  • 对于 高频传感器数据(如温度的实时曲线),通常不建议全部 retained,只需要关键状态保留。

📌 举例

假设有个设备发布在线状态:

topic: device/123/status
payload: "online"
retained: true

效果:

  • Broker 会保存 "online"
  • 当一个新客户端订阅 device/123/status 时,立即收到 "online"
  • 如果设备掉线并发布 "offline"(也设置 retained),Broker 会覆盖旧的 retained 消息,新订阅者就会立刻收到 "offline"