【问题标题】:What to expect when SUBACK is missing in MQTT communication?在 MQTT 通信中缺少 SUBACK 时会发生什么?
【发布时间】:2021-02-01 20:02:49
【问题描述】:

我目前正在使用 PAHO MQTT C++ 库(但也应该适用于其他风格的 MQTT 库,尤其是 C)来异步实现 MQTT 客户端。有时,在发送 SUBSCRIBE 之后,MQTT 服务器不会以 SUBACK 响应,即使后来的 PUBLISH/PUBACK 对成功。

我目前对丢失 SUBACK 的原因不感兴趣(我预计可能会发生单个数据包丢失...),但在这种情况下我应该从 MQTT 客户端库中得到什么?

我最初的期望是,在某个超时之后,会调用一个失败处理程序,但我不确定是否存在这样的超时,或者如果我不主动检查(例如通过使用 wait_for)它是否是预期的行为只是永远在队列中等待吗?

【问题讨论】:

    标签: mqtt paho


    【解决方案1】:

    规范(3.1.1)对这种情况不是很清楚。在我看来这是有缺陷的。

    代理必须使用 SUBACK 响应 SUBSCRIBE。但是,它可以在发送 SUBACK 之前发送 PUBLISH 数据包。

    订阅/取消订阅消息没有真正的 QoS。此外,SUBACK 数据包不是会话数据的一部分。所以重试与否完全取决于代理的实现。

    【讨论】:

      【解决方案2】:

      根据 MQTT 规范版本 3.1.1,当服务器从客户端接收到订阅数据包时,服务器必须以 SUBACK 数据包进行响应。 http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718067

      但是规范没有描述当没有 SUBACK 时客户端应该做什么。所以这绝对取决于你。 (或您的客户)您的应用程序规范应该说明客户端在这种情况下所做的事情,这不违反 MQTT 规范。

      在我看来,最好不要进一步发送 PUBLISH。这将是一种故障安全。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-01
        • 2015-06-10
        • 2020-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        相关资源
        最近更新 更多