如何从 Mosquitto 清除所有保留的 mqtt 消息?

How to clear ALL retained mqtt messages from Mosquitto?

我见过 mosquitto_pub -h [server] -r -n -t [XYZ] 用于清除一次性消息的语法。我的问题是设备开发人员发布了很多垃圾消息。

我有一个 Java/Paho 代码库,我想修改它以根据需要自动执行此操作,但我似乎无法发布零字节消息。我试过了

client.publish(topic,null);

...但这似乎没有用。

关于如何批量删除所有内容有什么建议吗?

使用 paho 客户端代码有 2 个选项,具体取决于您使用的 2 publish 方法中的哪一个。

MqttMessage msg = new MqttMessage(new byte[0]);
msg.setRetained(true);
client.publish(topic, msg);

client.publish(topic, new byte[0],0,true);

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

这应该有效:

client.publish(topic, new byte[]{}, 0, true);

此外,您可能对 Eclipse Paho Python 中的 this script 感兴趣,以清除给定的主题层次结构。您可能想在 Java 中实现类似的行为,但看起来您可能正在寻找一次性解决方案,因此也许只需使用 Python 脚本 :)

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

#!/bin/sh
echo "cleaning "  " :: usage: cleanmqtt <host>"
mosquitto_sub -h  -t "#" -v --retained-only | while read line; do mosquitto_pub -h  -t "${line% *}" -r -n; done

只需将它放在一个名为

之类的文件中

finally_a_working_way_to_remove_all_those_annoying_messages.sh

然后运行

sh finally_a_working_way_to_remove_all_those_annoying_messages.sh localhost

这个解决方案很粗糙。您无法指定要删除的内容或任何内容。 在您可以假设它已收到所有消息后,您可能必须使用 ctrl-c 中止。

如果您使用的是 Mosquitto MQTT Broker,请使用 Mosquitto 提供的官方方法禁用 "Retained messages"

首先找到mosquitto.conf文件

(在我的Ubuntu/EC2实例中它存储在/etc/mosquitto目录中,我假设你的mosquitto.conf文件路径是/etc/mosquitto/mosquitto.conf)

使用您最喜欢的文本编辑器进行编辑,我的是 nano。

sudo nano /etc/mosquitto/mosquitto.conf

并在该文件中将 "persistence false" 替换为 "persistence true"

persistence false

现在保存文件(如果使用nano按ctrl+o然后回车保存,ctrl+x退出)

现在使用以下命令重新启动 mosquitto

sudo service mosquitto stop
sudo service mosquitto start

注意:如果您的配置路径不存在,请使用此命令查找配置文件-

sudo find / -name mosquitto.conf

由于我没有足够的积分来发表评论,运行

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

可能会由于 pub/sub 延迟而导致无限循环。 将 --retained-only 添加到 mosquitto_sub 似乎消除了无限循环。

对于 powershell 用户

在 windows 上遇到了这个问题,所以这里使用 powershell。命令主机需要安装Mosquitto

获取保留的消息

我不想清除所有保留的消息。例如,只有主题中包含 "octo" 的那些。让我们看看那里有什么:

mosquitto_sub.exe -h <mqtt host> -v -u <mqtt user> -P <mqtt password> -t '#' --retained-only|
Select-String octo

(根据需要替换mqtt主机、用户、密码)

删除保留的消息

在此处使用相同的搜索字符串(在此示例中为 "octo"):

mosquitto_sub.exe -h <mqtt host> -v -u <mqtt user> -P <mqtt password> -t '#' --retained-only|
Select-String octo |
Out-String -Stream|ForEach-Object -Process {$_.Split(" ")[0]}|
%{mosquitto_pub.exe -h <mqtt host> -u <mqtt user> -P <mqtt password> -t "$_" -r -n}

再次替换所有出现的 mqtt 主机、用户、密码。

如果有任何遗漏,只需再次检查步骤 1 :)

我也没有足够的代表来添加简单的评论。 bash 脚本很棒!我 运行 遇到的极端情况是存在多个空格的情况,例如日期戳:

bob/was/here/time 2021-08-31 01:52:51

${line% *} 仅删除时间,同时在主题中包含日期。添加第二个 % 到 ${line%% *} 使替换变得贪婪,确保只返回主题。

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

mosquitto_sub -h $host --remove-retained -t '#' -E

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