Как удалить ВСЕ сохраненные сообщения mqtt от Mosquitto?

Я видел mosquitto_pub -h [server] -r -n -t [XYZ] синтаксис для очистки одноразовых сообщений. Моя проблема в том, что разработчики устройства отправили много мусорных сообщений.

У меня есть кодовая база Java / Paho, которую я хотел бы изменить, чтобы делать это автоматически по мере необходимости, но я не могу опубликовать сообщение с нулевым байтом. Я пытался

client.publish(topic,null);

... но, похоже, это не сработало.

Есть предложения, как удалить все сразу?


person JohnL    schedule 19.04.2016    source источник
comment
Это может помочь: mosquitto_sub -t '#' --remove-retained --retained-only. См. Также: mosquitto.org/man/mosquitto_sub-1.html   -  person rel    schedule 01.05.2020


Ответы (6)


Для этого есть 2 варианта использования клиентского кода paho в зависимости от того, какой из 2 publish методов вы используете.

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

or

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

Другой вариант - остановить mosquitto, удалить файл сохранения и перезапустить

person hardillb    schedule 19.04.2016
comment
Собственно, первая версия работать не будет, так как сообщение нужно опубликовать с установленным флагом «Сохранено». - person kartben; 20.04.2016
comment
Удаление файла сохраняемости оказалось тем вариантом, который мне действительно был нужен. - person JohnL; 20.04.2016
comment
Вот как я удалил файл сохраняемости в Ubuntu 16.04: sudo service mosquitto stop sudo rm /var/lib/mosquitto/mosquitto.db sudo service mosquitto start Вы можете проверить в своем mosquitto.conf, где находится ваш persistence_file. - person Tobias Holm; 04.07.2017
comment
Важно понимать, что при удалении файла сохраняемости также стираются все сообщения в очереди и все постоянные подписки. Лучше очищать отдельные темы публикацией нулевого сообщения в производственной среде. - person hardillb; 04.07.2017
comment
@TobiasHolm Sovle моя проблема! Спасибо!! - person JackWu; 01.12.2017

Вот как это правильно сделать с помощью сценария оболочки.

#!/bin/sh
echo "cleaning " $1 " :: usage: cleanmqtt <host>"
mosquitto_sub -h $1 -t "#" -v --retained-only | 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 после того, как вы предположите, что он получил все сообщения.

person Gussoh    schedule 29.01.2017
comment
Не могли бы вы показать, как изменить сценарий, включив в него имя пользователя и пароль? Когда я запускаю его, я получаю отказ в подключении: не авторизован. Спасибо. - person moster67; 21.11.2017
comment
Конечно, добавьте -u username -P password в строку как для mosquitto_sub, так и для mosquitto_pub - person Gussoh; 22.11.2017
comment
Если в вашей теме есть пробелы, вы можете изменить команду на: mosquitto_sub -h $1 -t "#" -v | while read line; do mosquitto_pub -h $1 -t "${line% *}" -r -n; done Изменение заключается в удалении _ после read line и замене $line на ${line% *} - person Robert J Berger; 30.12.2018
comment
Круто Роберт, я изменил твоё предложение - person Gussoh; 05.01.2019

Это должно работать:

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

Также вас может заинтересовать этот скрипт из Eclipse Paho Python, чтобы очистить иерархию заданных тем. Возможно, вы захотите реализовать подобное поведение на Java, но похоже, что вы ищете одноразовое решение, поэтому, возможно, просто используйте скрипт Python :)

person kartben    schedule 19.04.2016
comment
Скрипт python, похоже, не работает с темами или полезными нагрузками, отличными от ascii. Скрипт оболочки, который я только что опубликовал, кажется, работает лучше. - person Gussoh; 30.01.2017
comment
эта ссылка на скрипт теперь 404 - person Trevor; 11.07.2017

Поскольку у меня недостаточно очков для комментариев, бегу

#!/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, похоже, удаляет бесконечный цикл.

person user3084651    schedule 01.07.2019
comment
Хороший! Я добавил это. Это также решает проблему ctrl-c. Существует также --remove-удерживаемый, но я не могу понять, как это работает. - person Gussoh; 09.09.2020

для пользователей 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 host, user, password.

Просто проверьте еще раз с шага 1, если что-то осталось :)

person DrSlow    schedule 01.01.2020

Если вы используете Mosquitto MQTT Broker, отключите «Сохраненные сообщения» официальным методом, предоставленным Mosquitto.

Сначала найдите файл mosquitto.conf

(В моем экземпляре Ubuntu / EC2 он хранится в каталоге / etc / mosquitto, я предполагаю, что ваш путь к файлу mosquitto.conf /etc/mosquitto/mosquitto.conf)

Редактируйте с помощью вашего любимого текстового редактора, мой - nano.

sudo nano /etc/mosquitto/mosquitto.conf

и в этом файле замените "постоянство ложным" вместо "постоянство истинным"

persistence false

Теперь сохраните файл (при использовании nano нажмите ctrl + o, а затем введите, чтобы сохранить, ctrl + x, чтобы выйти)

теперь перезапустите mosquitto, используя следующие команды

sudo service mosquitto stop
sudo service mosquitto start

Примечание. Если этот путь конфигурации не существует в вашем случае, найдите файл конфигурации с помощью этой команды -

sudo find / -name mosquitto.conf

введите описание изображения здесь

person Manav Akela    schedule 12.06.2019
comment
Это просто останавливает сохранение сохраненных сообщений при перезапусках, они фактически не очищают их (в работающем брокере) - person hardillb; 12.06.2019
comment
Согласовано, для этого удалите / повторно создайте файл db (вручную или с помощью такого кода: file_operation), который хранится в persistence_location (или в моем случае /var/lib/mosquitto/mosquitto.db) - person Manav Akela; 12.06.2019