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

时间:2016-04-19 20:56:20

标签: java mqtt mosquitto paho

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

client.publish(topic,null);

但这似乎不起作用。

有关如何删除所有内容的任何建议,大众。

6 个答案:

答案 0 :(得分:11)

以下是使用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

只需将其放入名为“

”的文件中即可
  

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。这个解决方案很粗糙。你不能指定删除什么或任何东西。

答案 1 :(得分:4)

使用paho客户端代码有两种选择,具体取决于您使用的两种publish方法。

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

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

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

答案 2 :(得分:1)

这应该有效:

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

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

答案 3 :(得分:1)

对于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再次检查是否还剩下:)

答案 4 :(得分:0)

如果您使用的是Mosquitto MQTT经纪人,请使用Mosquitto提供的官方方法禁用“保留的消息”

首先找到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

enter image description here

答案 5 :(得分:0)

由于我没有足够的意见要发表,所以跑步

#!/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

由于发布/订阅延迟可能导致无限循环。 将--retained-only添加到mosquitto_sub似乎可以消除无限循环。