MQTT модуль
MQTT - (англ. message queuing telemetry transport) — упрощённый сетевой протокол, работающий поверх TCP/IP, ориентированный для обмена сообщениями между устройствами по принципу издатель-подписчик.
Модуль выступает клиентом и способен отправлять и принимать сообщения через сервер, модуль умеет не только прямые подписки на ветки от других клиентов(устройств), но и разбивать данные в формате JSON на ветки и свойства. Вы можете привязывать каждое полученное сообщение в ветке к нужному свойству, ветки не привязанные к свойствам никуда не пишут свои данные.
Для работы клиентов MQTT необходим сервер или еще его называют брокером (в предустановленном наборе и рекомендованный к использованию Mosquitto), данный сервер отвечает за пересылку сообщений от клиента к клиенту. Клиент MQTT может находится где угодно и для работы ему необходим только канал связи с сервером MQTT. Таким образом вы можете через интернет управлять устройствами поддерживающими MQTT протокол где угодно. Они в свою очередь сообщат вам о своем состоянии тем же образом. MajorDoMo может автоматизировать ваш гараж находясь у вас дома, для этого необходим только интернет канал и устройства с поддержкой MQTT.
Про retain.
Это "залипание" топика на MQTT брокере.
При подписывании нового клиента к топику он первым делом получает текущее, "залипшее" значение - независимо от того как давно оно произошло (ну, с учетом настроек брокера).
Логика простая: если в топике предполагается хранение текущего значения - лучше его сделать retained. Тогда он будет доступен всем клиентам в любой момент, им не нужно будет дожидаться повторной отправки значения источником.
Если же топик предполагается использовать для какого-то события, которое важно именно в момент его возникновения - тогда флаг retained выставлять не следует.
Соответственно, retained топик потребляет больше ресурсов брокера, и использовать его нужно только тогда когда необходимо.
Для фиксации положения осветителей (включены или выключены) при отключении света её можно использовать. В этом случае тот же MD будет знать текущее состояние освещения даже сразу после перезагрузки сервера а не тогда когда кто-то щелкнет выключателем.
А, вот пример когда retained использовать точно не следует: например, в момент нажатия кнопки по MQTT отправляется топик (не важно, со значением или без значения). Просто для того чтобы оповестить подписчиков что произошло событие "нажатие кнопки". Так вот, если его сделать retained, то каждый новый клиент при подписывании на топик сразу получит оповещение "кнопка была нажата", даже если это произошло очень давно.
Несколько видео по настройке
Примеры кода
Отправка сообщения через модуль в топик
include_once(DIR_MODULES . 'mqtt/mqtt.class.php'); $mqtt = new mqtt(); $rezult = $mqtt->mqttPublish($topic, $value, 0, 0);