Как получать сообщения для автономных клиентов, использующих QoS MQTT в eclipse-mosquitto? - PullRequest
0 голосов
/ 15 февраля 2020

Мой mosquitto.conf (это весь файл conf, поскольку все остальное только что закомментировано)

log_dest file /mosquitto/log/mosquitto.log
log_type all
connection_messages true
log_timestamp true
log_timestamp_format [%H:%M:%S]
persistence true
persistence_location /mosquitto/data/
listener 1883
listener 9001
protocol websockets

Затем я запускаю

docker exec -it ecs-Eclipse_mosquitto_MQTT-11-Eclipse-mosquitto-MQTT-eafxxxxxxx mosquitto_pub -t presence -m hellothere -q qos=2

( ПРИМЕЧАНИЕ У меня нет активных подписчиков, пока он онлайн)

Перешел на /mosquitto/data, и действительно был файл с именем mosquitto.db

Так что я могу сделать вывод, что мой сообщение hellothere хранится в mosquitto.db

Затем я выполнил команду

docker exec -it ecs-Eclipse_mosquitto_MQTT-11-Eclipse-mosquitto-MQTT-eafxxxxxxx mosquitto_sub -t presence -q qos=2

Что я ожидаю

Чтобы MQTT-брокер отправил сохраненное сообщение, так как подписчик сейчас в сети

Что на самом деле происходит

неопределенное время ожидания сообщения

Может быть, я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

MQTT не работает таким образом.

Сообщения помещаются в очередь только для клиентов, которые были ранее подключены, это паб / подсистема, а не система очередей сообщений.

Клиент должен был быть подключен в прошлом и подписан на topi c сообщение, о котором идет речь. Затем ему необходимо повторно подключиться после публикации сообщения с установленным в false значением флага cleanSession и использованием того же идентификатора клиента.

Подробнее об этом можно прочитать в блоге HiveMQ здесь

2 голосов
/ 15 февраля 2020

Я думаю, что соответствующий бит mqtt spe c:

Когда сервер становится владельцем входящего сообщения приложения, он ДОЛЖЕН добавить его в состояние сеанса из тех клиентов, у которых есть совпадающие подписки.

В вашем случае, когда сообщение публикуется, нет клиентов с совпадающими подписками (потому что вы не запустили mosquitto_sub в этот момент), поэтому он больше ничего не делает ,

Если вы хотите, чтобы сообщения были сохранены для клиента, вы должны сначала подключиться в качестве этого клиента и подписаться на соответствующие топи c (с QOS> 0 и CleanSession = 0). После этого любые сообщения, полученные, пока клиент находится в автономном режиме, будут сохранены и доставлены при повторном подключении (при условии, что CleanSession = 0).

Примечание. Для выполнения вышеупомянутых действий с mosquitto_sub вам необходимо использовать --id параметр для установки идентификатора клиента (сообщения будут помещаться в очередь только для указанных c клиентов, которые подписались на соответствующие темы). Вам также понадобится флаг -c, чтобы отключить флаг «чистой сессии».

Таким образом, шаги будут следующими (я удалил лишние docker биты - вы можете добавить их обратно):

mosquitto_sub -c --id subscriber1 -t presence -q 2

Это подпишется, а затем будет ждать любых сообщений; Вы можете безопасно закрыть его (это бит подписки, который должен произойти). Следующая публикация sh Ваше сообщение:

mosquitto_pub -t presence -m hellothere -q 2

Теперь вы можете снова запустить mosquitto_sub, чтобы получить сохраненные сообщения:

mosquitto_sub -c --id subscriber1 -t presence -q 2

Предупреждение. Когда вы подписываетесь таким образом, брокер сохраняет все полученные сообщения, пока вы не в сети. Это может стать проблемой, если вы тестируете брокера, который обрабатывает много сообщений (потому что хранение всех сообщений занимает место). Вероятно, это не проблема, так как вы только тестируете, но что-то нужно иметь в виду ... Запуск mosquitto_sub без -c удалит все подписки - в конфигурации mosquitto также есть опции, позволяющие ограничить количество сообщений. и как долго они проводятся.

...