如何从mosquitto中清除所有保留的mqtt消息

Joh*_*hnL 8 java mqtt mosquitto paho

我已经看到了mosquitto_pub -h [server] -r -n -t [XYZ]语法,用于清除一条消息.我的问题是设备开发人员发布了大量垃圾邮件.我有一个java/paho代码库,我想根据需要自动修改它,但我似乎无法发布零字节消息.我试过了

client.publish(topic,null);
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

关于如何删除所有内容的任何建议.

Gus*_*soh 14

以下是如何使用shell脚本正确执行此操作.

#!/bin/sh
echo "cleaning " $1 " :: usage: cleanmqtt <host>"
mosquitto_sub -h $1 -t "#" -v | while read line; do mosquitto_pub -h $1 -t "${line% *}" -r -n; done
Run Code Online (Sandbox Code Playgroud)

把它放在一个名为somthing的文件中

finally_a_working_way_to_remove_all_those_annoying_messages.sh

然后跑

sh finally_a_working_way_to_remove_all_those_annoying_messages.sh localhost
Run Code Online (Sandbox Code Playgroud)

收到所有消息后,你必须在一段时间后按ctrl + c.这个解决方案很粗糙.你不能指定删除什么或任何东西.

  • 如果您的主题中有空格,您可以将命令更改为:`mosquitto_sub -h $1 -t "#" -v | 读行时;do mosquitto_pub -h $1 -t "${line% *}" -r -n; done` 改动是去掉`read line`后的`_`,把`$line`改为`${line% *}` (2认同)

jon*_*ike 9

Mosquitto 客户端提供 --remove-retained 选项:

mosquitto_sub -h $host --remove-retained -t '#' -W 1 
Run Code Online (Sandbox Code Playgroud)

tunning -t 可以处理要清除的特定主题。

  • 然而,这是最有效的方法,当使用“-E”时,客户端在“客户端 X 收到 SUBACK”之后立即退出,即在订阅之后但在接收任何消息之前,因此不会发生实际删除。我发现让客户端断开连接并退出的唯一可靠方法是使用“-W 1”标志,即处理消息 1 秒然后退出。 (2认同)

har*_*llb 6

根据publish您使用的两种方法中的哪一种,使用 paho 客户端代码有两种选择。

MqttMessage msg = new MqttMessage(new byte[0]);
msg.setRetained(true);
client.publish(topic, msg);
Run Code Online (Sandbox Code Playgroud)

或者

client.publish(topic, new byte[0],0,true);
Run Code Online (Sandbox Code Playgroud)

另一种选择是停止 mosquitto 并删除持久性文件并重新启动

  • 事实证明,删除持久性文件是我真正需要的选项。 (2认同)
  • 删除持久性文件也会清除所有排队的消息和任何持久性订阅,了解这一点很重要。最好在生产环境中发布空消息来清除单个主题 (2认同)