【问题标题】:Does MQTT brokers support persistent subscriptions?MQTT 代理是否支持持久订阅?
【发布时间】:2017-09-24 05:12:37
【问题描述】:

我在我的第一个 IOT POC 上工作,该设备通常每小时/每天生成一次传感器数据。我计划有这样的架构: - 1 个用于传感器数据输入的共享主题(设备到后端方向) - 每个设备最初都会订阅自己的特定主题,即 /device/{id}/notification

现在,在传感器数据提交到共享主题后,我打算让设备进入深度睡眠(设备只能通过 wifi 数据包或定时器唤醒),在此状态下与代理的 TCP 连接丢失。

问题:设备重新唤醒并重新建立与 MQTT 代理的 TCP 连接后,设备是否会收到服务器在停止服务期间生成的所有消息,或者这些消息将不可用?

【问题讨论】:

    标签: asynchronous mqtt iot messagebroker


    【解决方案1】:

    在客户端连接到代理期间,CleanSession 标志使代理能够将错过的 QoS 1 或 QoS 2 消息排队(存储 QoS 0 消息取决于实现)。

    MQTT 3.1.1 标准Section 3.1.2.4 规定:

    如果 CleanSession 设置为 0,则服务器必须根据当前会话的状态(由客户端标识符标识)恢复与客户端的通信。如果没有与客户端标识符关联的会话,服务器必须创建一个新会话。客户端和服务器断开后,客户端和服务器必须存储会话 [MQTT-3.1.2-4]。在将 CleanSession 设置为 0 的会话断开连接后,服务器必须存储更多的 QoS 1 和 QoS 2 消息,这些消息与客户端在断开连接时所拥有的任何订阅相匹配,作为会话状态的一部分 [MQTT-3.1.2- 5]。它还可以存储满足相同标准的 QoS 0 消息

    持久会话的问题在于它可能会排队大量消息,因此在重新连接时,客户端会被丢失的消息轰炸。如果您需要了解完整的读数序列,这可能是可取的,如果客户端在低功耗、电池供电的嵌入式设备上运行,则非常不希望这样做。

    为了解决这个问题,MQTT 提供了另一个功能:retained 发布消息中的标志。

    MQTT 3.1.1 标准第 3.3.1.3 节规定:

    如果 RETAIN 标志设置为 1,在客户端发送给服务器的 PUBLISH 数据包中,服务器必须存储应用消息及其 QoS,以便可以将其传递给订阅匹配其主题名称的未来订阅者[MQTT-3.3.1-5]。建立新订阅时,必须将每个匹配主题名称上的最后保留消息(如果有)发送给订阅者 [MQTT-3.3.1-6]。如果服务器接收到 RETAIN 标志设置为 1 的 QoS 0 消息,它必须丢弃之前为该主题保留的任何消息。它应该将新的 QoS 0 消息存储为该主题的新保留消息,但可以选择随时丢弃它 - 如果发生这种情况,该主题将没有保留消息

    这可确保客户端在重新连接后仅接收给定主题的最新消息。

    【讨论】:

      【解决方案2】:

      很快我就自己找到了答案。持久会话是答案。我一直在寻找持久订阅,但最初并未成功...

      这是关于我的案例的最后一篇很棒的文章: http://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages

      所以是的,持久订阅称为持久会话,是的,这是可能的。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2022-01-15
        • 1970-01-01
        • 2016-01-14
        • 2013-12-17
        • 1970-01-01
        • 2020-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多