我已经看过mosquitto_pub -h [server] -r -n -t [XYZ]语法,用于清除一条消息。我的问题是设备开发人员发布了大量垃圾邮件。我有一个java / paho代码库,我想根据需要自动修改它,但我似乎无法发布零字节消息。我试过了
client.publish(topic,null);
但这似乎不起作用。
有关如何删除所有内容的任何建议,大众。
答案 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)
在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
答案 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
似乎可以消除无限循环。