【问题标题】:Failed PUBLISH Delivery in QoS1 MQTTQoS1 MQTT 中的 PUBLISH 交付失败
【发布时间】:2015-09-12 21:00:54
【问题描述】:

我正在使用 moquette mqtt 代理,我正在尝试了解实现以及 MQTT 代理。我希望为个人项目对代理做一些修改。

我很好奇当设备向代理发送 PUBLISH 消息时会发生什么,而代理无法将消息传递给订阅者。该协议规定将 PUBACK 发送回发布者。在 moquette 源代码中,这个 PUBACK 似乎是在将消息转发给任何订阅者之后发送的。

我注释掉了 sendPubAck() 函数来模拟消息没有成功发布,所以我假设发布者会再次发布消息。但是,当我在传入消息处理函数旁边添加一个打印语句时,我只能看到从发布者定期发送到代理的 PINGREQ 消息。我没有看到任何发布消息。

我的问题如下:客户端设备究竟如何决定何时重新发布消息?因为注释掉 sendPubAck() 函数似乎不会让发布者重新发送消息。

【问题讨论】:

    标签: mqtt moquette


    【解决方案1】:

    有两种选择。首先,如果没有收到 PUBACK,您可以添加一个消息超时参数来触发再次发送您的 PUBLISH。其次,您只能在重新连接时重新发送您的 PUBLISH。

    我相信第二个选择是最好的选择。造成这种情况的原因可能是代理(或客户,当然,取决于通信方向)没有响应的可能原因。

    1. 您可能有一个错误的代理,这实际上是您创建的
    2. 可能存在网络故障(连接丢失但未检测到),
    3. 代理可能过载。

    对于第一种情况,我们无能为力,只能修复代理。对于第二种情况,客户端必须在重新连接时重试发布。对于第三种情况,发送重复的 PUBLISH 不会帮助代理响应,只会进一步超载。

    值得注意的是,在向发布客户端发送 PUBACK 之前,代理不应等待订阅客户端响应。

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 1970-01-01
      • 2012-03-12
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 2014-11-01
      • 1970-01-01
      相关资源
      最近更新 更多