使用新订阅者连接(MQTT / Mosquitto)显示来自发布者的错过消息

Display of the missed messages from the publisher with a new subscriber connection (MQTT / Mosquitto)

发布者使用命令 mosquitto_pub -h 172.17.*.* -t hello -m "hello" -d 向主题 -t hello 发送消息 -m "hello"。仅当与主题 -t hello 的连接处于活动状态时,订阅者才会看到消息 -m "hello"。但是,如果订阅者未订阅 -t hello 主题并且发布者仍然在 -t hello 主题上发送消息,那么当您尝试订阅该主题时 mosquitto_sub -h 172.17. *. * -t hello 订阅者不会收到发送的消息来自发布者的消息。

阅读文档后,打破了几个代理,我只实现了这样一个事实:如果你像这样 - -mosquitto_pub -h 172.17. *. * -r -t hello -m "hello" 将标志放在发布者 -r 上,你可以看到最后一条消息。我配置了mosquitto.conf,因为我认为主要的变化,当前问题的一个例子,只能通过它来实现

如何解决这样的问题,我想在重新订阅主题时看到发布者所有错过的消息?

您需要为消息使用 QOS(服务质量)值。默认情况下,QOS 设置为 0,这基本上是即发即忘,QOS 1 是确保交付(但可能意味着交付不止一次)。 QOS 2 只保证传递一次。

需要指出的是,QOS 是在 1 个客户端和代理之间,因此这可以在发布者和代理之间,或者代理和订阅者之间独立。 (例如,您可以发布 QOS 0,然后订阅 QOS 2 的主题)。

对于离线客户端的消息队列,客户端需要以 QOS 1 或 QOS 2 进行订阅,并且当它重新连接时需要将其 cleanSession 标志设置为 false 并使用相同的客户端 ID。

MQTT 代理不会为以前从未连接过的客户端排队消息。

使用 mosquitto_sub and mosquitto_pub,您可以使用 -q 选项设置 QOS 级别,您可以使用 -i 选项设置客户端 ID。要将 mosquitto_sub 的清理会话标志设置为 false,您应该使用 -c 选项