1

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

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

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

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

4

1 回答 1

2

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

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

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

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

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

于 2015-06-26T06:19:00.413 回答