RETAIN хранит последнее значение темы
Опубликуйте состояние с флагом RETAIN. Брокер сохранит его и при подходящей новой подписке сможет отправить последнее значение. Следующая retained-публикация на ту же тему заменит предыдущую. Обычная публикация без RETAIN не заменяет уже сохранённое значение.
В MQTT 5 подписчик может управлять выдачей сохранённых сообщений через Retain Handling. Поэтому при диагностике проверьте параметры подписки и отличайте первую выдачу после подписки от публикации, пришедшей в реальном времени.
Как выбрать QoS
- QoS 0 — доставка без подтверждения публикации на данном участке. Подходит для регулярных замеров, где отдельные потери допустимы.
- QoS 1 — доставка с подтверждением; повтор возможен. Для действий полезны идентификатор события и дедупликация.
- QoS 2 — дополнительный обмен пакетами для однократной доставки на уровне протокола. Это не гарантия однократного выполнения команды внешним оборудованием.
Участки «издатель → брокер» и «брокер → подписчик» имеют свои условия доставки. Для полного описания см. спецификацию MQTT 5.0 от OASIS.
Проверьте на отдельной тестовой теме
Команды ниже рассчитаны на локальный тестовый брокер с отдельной учётной записью. Подставьте разрешённую тему и тестовые реквизиты; -r задаёт RETAIN, -n отправляет пустое сообщение.
mosquitto_pub -h 127.0.0.1 -u test -P '<пароль>' -t lab/demo/state -q 1 -r -m ON
mosquitto_sub -h 127.0.0.1 -u test -P '<пароль>' -t lab/demo/state -q 1 -C 1 -W 5
mosquitto_pub -h 127.0.0.1 -u test -P '<пароль>' -t lab/demo/state -q 1 -r -n
Первый подписчик получает ON сразу после подписки. После очистки новая подписка больше не получает это значение. Действующий подписчик может увидеть пустую публикацию в момент очистки. Не запускайте этот эксперимент в рабочей ветке.
Где искать проблему
Если сохранённое значение пропало после моста, проверьте версию MQTT, настройки пересылки флага и способ подписки моста. Если сообщение исчезает спустя время, проверьте Message Expiry Interval. Если тема отображается в панели, но не приходит клиенту, проверьте ACL, фильтр и Retain Handling.