Я так подумав: раз в мене вже тут вийшов у попередньому пості́ такий собі лікнеп для чайників, то треба розповісти останні деталі, а саме про Mosquitto та Node-RED.
Що це все таке
MQTT — це стандарт де-факто на комунікацію між пристроями в IoT.
Брокер MQTT просто приймає від клієнтів повідомлення і відправляє їх іншим клієнтам-підпи́сникам. Це дуже схоже на IRC, тільки сервер тут зветься «брокер», а про канал кажуть «топік». Існують різні брокери, та майже завжди йдеться про Mosquitto.
Node-RED це така своєрідна платформа, яка підходить для поєднання всякої низькорі́вневої хріні з усякою іншою низькорі́вневою хрінню: MQTT, бази даних, REST API, скрипти́.
Запуск
Mosquitto в Debian та Ubuntu можна поставити просто з репозито́рію (десь у ме́не так і є), але зазвичай мені буває зручно запускати його через Docker Compose разом з Node-RED.
docker-compose.yml
version: '3'
services:
mqtt:
image: eclipse-mosquitto
ports:
- 1883:1883
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf:ro
nodered:
image: nodered/node-red
ports:
- 1880:1880
volumes:
- ./node-red-data:/data
links:
- mqtt
Як видно з цього файлу, тут ще треба зробити підкаталог node-red-data
, у якому зберігатимуться всі нутрощі Node-RED, та конфіг Mosquitto.
mosquitto.conf
allow_anonymous true
listener 1883
Ну і все, можна запускати docker-compose up
і все ма́є запусти́тися.
Приклад використання Node-RED
Node-RED після запуску з дефо́лтними налаштува́ннями доступна за адресою http://localhost:1880/ і не потребує паро́лю.
The S in IoT Stands for Security
Насправді тут можна і пароль зробити, і різні види аутентифікац́ії прикрути́ти десь на reverse proxy, але ж ми просто граємося і бли́маємо світлодіо́дом.
Так, що ще треба. В головному меню Node-RED (правий верхній кут, три рисочки) треба зайти в Manage palette
(це типу як паке́тний менеджер) та встановити модуль node-red-dashboard
. Навіть не знаю, чому він не входить до стандартного комплекту.
Нам треба додати на наш flow два вузли з групи network, а саме mqtt in
та mqtt out
. Також нам треба вузол switch
з групи dashboard. От я їх просто перетягну́в кудись і ще не сконфігурува́в.
Двічі клацніть на вузол mqtt in
. Відкриється вікно редагування. Нам треба налаштувати сервер та топік. Сервер ми ще жоден не налашто́вували, тому треба його створити; достатньо вказати хост mqtt
(не 127.0.0.1, а ім’я хосту з Docker Compose) і все інше лишити як є. Топік для вхідних повідомлень на цьому вузлі має бути board01/led
.
Аналогічним чином конфігуру́ємо вузол mqtt out
. Тільки топік там має бути board01/led/set
, а раніше сконфігуро́ваний сервер вже буде вка́зано за замовчанням.
Тепер вузол switch
. Треба створити групу (стовпчик, де він має відображатися), при створенні групи треба буде створити нову dashboard tab (сторінку, де воно все буде). Якщо нічого не міняти, то зі значеннями по замо́вченню у вас створиться tab з назвою Home та група Default.
Далі трошки неочеви́дне. Треба визначити, які значення відповідають стану «увімкнено» і що вважається станом «вимкнено» (On Payload та Off Payload, відповідно). Встанові́ть для обох тип number. Значення 1 та 0, відповідно.
Наостанок, встанові́ть йому якийсь зрозумілий label. Наприклад «LED».
Тепер лишається поєднати мишкою всі три вузли та натиснути на Deploy.
Все! Dashboard знаходиться за адресою http://127.0.0.1:1880/ui/ (теж без паро́лю).
Якщо все вийшло правильно, то цей перемикач буде вмикати-вимика́ти світлодіо́д на платі NodeMCU з попереднього поста.
Вхідні повідомлення з топіку board01/led
змінюють стан перемикача. Зміна стану перемикача (будь-яка) призводить до надсилання вихідного повідомлення до топіку board01/led/set
. Дещо неефекти́вно, та йой, най буде. Краще було б не надсилати до MQTT повідомлення про ту зміну стану, яка і так є реакцією на MQTT, але я поки не знаю, як це зробити просто і елегантно.
Тестування dashboard’у
Не завжди все виходить правильно з першого разу.
Для відла́годження та для експериментів з MQTT варто встановити пакет mosquitto-clients
, навіть якщо у вас Mosquitto тільки в Docker’і.
Зокрема, так я дивлюся, що відбувається на всіх топіках (wildcard #
):
mosquitto_sub -h 127.0.0.1 -t "#" -v
Цей mosquitto_sub
працює як tail -f
, для його зупинки треба Ctrl C. Коли ви натиска́єте на перемика́ч, мають з’являтися нові повідомлення з топіком board01/led/set
.
А ось так я вручну́ відправля́ю повідомлення з текстом 1
на топік board01/led
, імітуючи повідомлення від NodeMCU:
mosquitto_pub -t board01/led -m 1
Ну, в принципі, і все. Отака фігня.