MQTT модуль

Материал из MajorDoMo инфо
Версия от 11:26, 16 июля 2022; Xor (обсуждение | вклад) (→‎Примеры кода)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

MQTT - (англ. message queuing telemetry transport) — упрощённый сетевой протокол, работающий поверх TCP/IP, ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик.

Модуль выступает клиентом и способен отправлять и принимать сообщения через сервер, модуль умеет не только прямые подписки на ветки от других клиентов(устройств), но и разбивать данные в формате JSON на ветки и свойства. Вы можете привязывать каждое полученное сообщение в ветке к нужному свойству, ветки не привязанные к свойствам никуда не пишут свои данные.

Для работы клиентов MQTT необходим сервер или еще его называют брокером (в предустановленном наборе и рекомендованный к использованию Mosquitto), данный сервер отвечает за пересылку сообщений от клиента к клиенту. Клиент MQTT может находится где угодно и для работы ему необходим только канал связи с сервером MQTT. Таким образом вы можете через интернет управлять устройствами поддерживающими MQTT протокол где угодно. Они в свою очередь сообщат вам о своем состоянии тем же образом. MajorDoMo может автоматизировать ваш гараж находясь у вас дома, для этого необходим только интернет канал и устройства с поддержкой MQTT.

Настройки mqtt
настройка топика mqtt


Про retain. Это "залипание" топика на MQTT брокере.

При подписывании нового клиента к топику он первым делом получает текущее, "залипшее" значение - независимо от того как давно оно произошло (ну, с учетом настроек брокера).

Логика простая: если в топике предполагается хранение текущего значения - лучше его сделать retained. Тогда он будет доступен всем клиентам в любой момент, им не нужно будет дожидаться повторной отправки значения источником.

Если же топик предполагается использовать для какого-то события, которое важно именно в момент его возникновения - тогда флаг retained выставлять не следует.

Соответственно, retained топик потребляет больше ресурсов брокера, и использовать его нужно только тогда когда необходимо.


Для фиксации положения осветителей (включены или выключены) при отключении света её можно использовать. В этом случае тот же MD будет знать текущее состояние освещения даже сразу после перезагрузки сервера а не тогда когда кто-то щелкнет выключателем.

А, вот пример когда retained использовать точно не следует: например, в момент нажатия кнопки по MQTT отправляется топик (не важно, со значением или без значения). Просто для того чтобы оповестить подписчиков что произошло событие "нажатие кнопки". Так вот, если его сделать retained, то каждый новый клиент при подписывании на топик сразу получит оповещение "кнопка была нажата", даже если это произошло очень давно.


Несколько видео по настройке


Примеры кода

Отправка сообщения через модуль в топик

include_once(DIR_MODULES . 'mqtt/mqtt.class.php');
$mqtt = new mqtt();
$qos = 0;
$retain = 0;
$write_type = 0;
$rezult = $mqtt->mqttPublish($topic, $value, $qos, $retain, $write_type);

Ошибки

После перехода mosquitto на version 2.0.10 были по дефолту активировали секьюрити функции теперь запрещен доступ без пароля и запрещено подключение с любых систем не 127.0.0.1

Для начала проверим что версия новая стала

mosquitto -v

в консоли линя выведет вам версию, если она больше 2.0 то идем в конфиг

/etc/mosquitto/mosquitto.conf

правим файл, к тому что есть дописываем

listener 1883 0.0.0.0

разрешает подключение к брокеру на любом интерфейсе.

allow_anonymous true

разрешает подключение без паролей.