Я думаю, что соответствующий бит 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 также есть опции, позволяющие ограничить количество сообщений. и как долго они проводятся.