wb_editors
905
правок
(Заменил картинку на обновленную) |
Brainroot (обсуждение | вклад) |
||
(не показана 31 промежуточная версия 5 участников) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE: MQTT в контроллерах Wiren Board }} | |||
== Описание == | == Описание == | ||
'''MQTT''' — протокол обмена данными, использующийся в [[Программное обеспечение Wiren Board|программном обеспечении Wiren Board]]. [http://en.wikipedia.org/wiki/MQTT Базовая информация по MQTT на Википедии]. | '''MQTT''' — протокол обмена данными, использующийся в [[Программное обеспечение Wiren Board|программном обеспечении Wiren Board]]. [http://en.wikipedia.org/wiki/MQTT Базовая информация по MQTT на Википедии]. | ||
Строка 8: | Строка 9: | ||
Через MQTT работают: веб-интерфейс, движок правил и встроенные драйверы. Если вы разрабатываете собственное ПО в дополнение к предустановленному — мы рекомендуем использовать MQTT. | Через MQTT работают: веб-интерфейс, движок правил и встроенные драйверы. Если вы разрабатываете собственное ПО в дополнение к предустановленному — мы рекомендуем использовать MQTT. | ||
== Примеры работы через MQTT == | Структура топиков описана в [https://github.com/wirenboard/conventions/blob/main/README.md Wiren Board MQTT Conventions]. | ||
В контроллере используется MQTT брокер mosquitto, который по умолчанию разрешает соединения без пароля с любых хостов. Если вы хотите настроить авторизацию, [https://mosquitto.org/man/mosquitto-conf-5.html обратитесь к официальной документации]. | |||
== Примеры работы через MQTT == | |||
===Получение значения от датчика температуры и вывод его в веб-интерфейс=== | ===Получение значения от датчика температуры и вывод его в веб-интерфейс=== | ||
[[File:Web-devices-1-wire.png|400px|thumb|Показания датчика и его уникальный идентификатор на странице ''Devices'' веб-интерфейса]] | [[File:Web-devices-1-wire.png|400px|thumb|Показания датчика и его уникальный идентификатор на странице ''Devices'' веб-интерфейса]] | ||
К [[Wiren Board]] подключён датчик температуры по шине [[1-Wire]]. Проследим, как данные с него через MQTT попадают в веб-интерфейс: | К [[Wiren Board]] подключён датчик температуры по шине [[1-Wire]]. Проследим, как данные с него через MQTT попадают в веб-интерфейс: | ||
#Драйвер | #Драйвер [https://github.com/wirenboard/wb-mqtt-w1 wb-mqtt-w1], отвечающий за данную аппаратную функцию, опрашивает подключенные к контролеру датчики 1-Wire. | ||
#При получении значения драйвер публикует | #При получении значения драйвер публикует MQTT сообщение вида: <pre>/devices/wb-w1/controls/28-0115a48fcfff 23.25</pre>Оно значит, что от устройства 1-Wire с идентификатором ''28-0115a48fcfff'' получено значение 23.25 °C. | ||
#Веб-интерфейс, который подписан на все сообщения из MQTT, получает это сообщение и выводит значение датчика на страницу. | #Веб-интерфейс, который подписан на все сообщения из MQTT, получает это сообщение и выводит значение датчика на страницу. | ||
===Нажатие кнопки в веб-интерфейсе и переключение реле на внешнем модуле=== | ===Нажатие кнопки в веб-интерфейсе и переключение реле на внешнем модуле=== | ||
Строка 24: | Строка 30: | ||
#Драйвер wb-mqtt-serial получает это уведомление по RS-485 и публикует по MQTT сообщение:<pre>/devices/wb-mrm2_130/controls/Relay 1 1</pre>Оно значит, что первое реле на устройстве WB-MRM2 с адресом ''130'' находится (уже переведено) в состоянии логической единицы — «включено». | #Драйвер wb-mqtt-serial получает это уведомление по RS-485 и публикует по MQTT сообщение:<pre>/devices/wb-mrm2_130/controls/Relay 1 1</pre>Оно значит, что первое реле на устройстве WB-MRM2 с адресом ''130'' находится (уже переведено) в состоянии логической единицы — «включено». | ||
== Принцип работы MQTT == | == Принцип работы MQTT == | ||
[[File:DebianLinux.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]] | [[File:DebianLinux.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]] | ||
Система сообщений MQTT построена по следующему принципу: | Система сообщений MQTT построена по следующему принципу: | ||
Строка 34: | Строка 40: | ||
=== Отображение устройств в структуре сообщений === | === Отображение устройств в структуре сообщений === | ||
Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам — так называемым соглашениям ([https://github.com/ | Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам — так называемым соглашениям ([https://github.com/wirenboard/conventions/blob/main/README.md Wiren Board MQTT Conventions]). | ||
Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]). | Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]). | ||
Строка 45: | Строка 51: | ||
*(если есть) собственные программы пользователя. | *(если есть) собственные программы пользователя. | ||
=== Структура сообщения о состоянии устройства === | === Структура сообщения о состоянии устройства === | ||
Вот сообщение от драйвера температурного датчика 1-Wire из примера выше: | Вот сообщение от драйвера температурного датчика 1-Wire из примера выше: | ||
<pre> | <pre> | ||
Строка 62: | Строка 68: | ||
Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке '''Devices''' и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков. | Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке '''Devices''' и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков. | ||
=== Структура сообщения об ошибке опроса устройства === | === Структура сообщения об ошибке опроса устройства === | ||
Каждый «канал» («контрол») имеет «подтопик» <code>/meta/error</code>, в котором содержится информация о наличии ошибок взаимодействия с устройством. Ошибки получения данных (чтения) обозначаются символом '''r''', ошибки записи — '''w'''. | Каждый «канал» («контрол») имеет «подтопик» <code>/meta/error</code>, в котором содержится информация о наличии ошибок взаимодействия с устройством. Ошибки получения данных (чтения) обозначаются символом '''r''', ошибки записи — '''w'''. | ||
Строка 179: | Строка 185: | ||
Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через протокол MQTT — ваша программа передаёт сообщение по MQTT, драйвер управляет устройством и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через протокол MQTT — ваша программа передаёт сообщение по MQTT, драйвер управляет устройством и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | ||
Языки, для которых есть библиотеки для работы с MQTT, по ссылкам подробное описание: | |||
* Python | * [[Python]] | ||
* | * [[Cpp|C++]] | ||
* [[Go]] | |||
* [[Nodejs]] | |||
=== Просмотр MQTT-каналов в web-интерфейсе === | === Просмотр MQTT-каналов в web-интерфейсе === | ||
Строка 194: | Строка 201: | ||
Например, если контроллер имеет адрес 192.168.0.67, его топики можно прочитать с другого компьютера с Linux, находящегося в той же сети: | Например, если контроллер имеет адрес 192.168.0.67, его топики можно прочитать с другого компьютера с Linux, находящегося в той же сети: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
mosquitto_sub -h 192.168.0.67 -p 1883 -v -t "/devices/power_status/controls/Vin" | mosquitto_sub -h 192.168.0.67 -p 1883 -v -t "/devices/power_status/controls/Vin" -i Test_Client | ||
</syntaxhighlight> | |||
Альтернативный вариант — использовать [[MQTT Explorer]]. | |||
=== Установка пароля на MQTT брокер === | |||
Установить пароль на MQTT-брокер можно следующим образом. | |||
#Добавьте нового пользователя в файл конфигурации, выполнив команду: | |||
#:<syntaxhighlight lang="bash"> | |||
mosquitto_passwd -c /etc/mosquitto/passwd/default.conf username | |||
</syntaxhighlight> | |||
#:Вместо username можно указать произвольное имя пользователя. | |||
#:После ввода команды появится запрос на ввод пароля, который нужно будет ввести два раза. | |||
#Далее в файле <code>/etc/mosquitto/conf.d/10listeners.conf</code> установите параметр <code>allow_anonymous false</code> (по умолчанию true). | |||
#:Изменить файл можно открыв его в текстовом редакторе, например, nano: | |||
#:<syntaxhighlight lang="bash"> | |||
nano /etc/mosquitto/conf.d/10listeners.conf | |||
</syntaxhighlight> | |||
#В файле <code>/etc/mosquitto/acl/default.conf</code> добавьте следующую запись: | |||
#:<syntaxhighlight lang="bash"> | |||
user username | |||
topic readwrite # | |||
topic readwrite $SYS/# | |||
</syntaxhighlight> | |||
#:где, username — имя пользователя, заданное на первом шаге. | |||
#:Открыть файл для редактирования: | |||
#:<syntaxhighlight lang="bash"> | |||
nano /etc/mosquitto/acl/default.conf | |||
</syntaxhighlight> | |||
#Перезапустите mosquitto командой: | |||
#:<syntaxhighlight lang="bash"> | |||
systemctl restart mosquitto | |||
</syntaxhighlight> | |||
После выполнения этой инструкции анонимные подключения к брокеру станут недоступны. Поэтому нужно будет использовать установленный пароль в веб-интерфейсе контроллера, который по умолчанию использует анонимное подключение. | |||
Для чтения топиков с компьютера на Linux в той же сети теперь нужно использовать команду: | |||
<syntaxhighlight lang="bash"> | |||
mosquitto_sub -h 192.168.0.67 -p 1883 -v -t "/devices/power_status/controls/Vin" -i Test_Client -u username -P password | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Настройка MQTT моста (bridge) === | === Настройка MQTT моста (bridge) === | ||
[[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]] | [[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]] | ||
MQTT мост (bridge) — это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно. | MQTT мост (bridge) — это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно. | ||
Строка 211: | Строка 258: | ||
# Зарегистрируйтесь на http://cloudmqtt.com/ | # Зарегистрируйтесь на http://cloudmqtt.com/ | ||
# Зайдите в свой аккаунт на http://cloudmqtt.com/ и посмотрите настройки: сервер, порт, логин, пароль. | # Зайдите в свой аккаунт на http://cloudmqtt.com/ и посмотрите настройки: сервер, порт, логин, пароль. | ||
# Зайдите на контроллер и добавьте в конец файла <code>/etc/mosquitto/ | # Зайдите на контроллер и добавьте в конец файла <code>/etc/mosquitto/conf.d/20bridges.conf</code> следующие строки: | ||
#: <syntaxhighlight lang="bash"> | #: <syntaxhighlight lang="bash"> | ||
connection cloudmqtt | connection cloudmqtt | ||
Строка 226: | Строка 273: | ||
# Перезапустите <code>mosquitto</code>, выполнив в консоли: | # Перезапустите <code>mosquitto</code>, выполнив в консоли: | ||
#: <syntaxhighlight lang="bash"> | #: <syntaxhighlight lang="bash"> | ||
systemctl restart mosquitto | |||
</syntaxhighlight> | </syntaxhighlight> | ||
[[File:Clusterfly3.png | thumb | 400px | Настройки брокера CLUSTERFLY]] | [[File:Clusterfly3.png | thumb | 400px | Настройки брокера CLUSTERFLY]] | ||
Строка 236: | Строка 283: | ||
# Зарегистрируйтесь на https://clusterfly.ru/ | # Зарегистрируйтесь на https://clusterfly.ru/ | ||
# Зайдите в свой аккаунт на https://clusterfly.ru/ и выберите | # Зайдите в свой аккаунт на https://clusterfly.ru/ и выберите «Профиль» посмотрите настройки: сервер, порт, логин и сгенерируйте пароль. Для пересылки используйте сервер <code>srv1.clusterfly.ru</code>. | ||
# Зайдите на контроллер и добавьте в конец файла <code>/etc/mosquitto/ | # Зайдите на контроллер и добавьте в конец файла <code>/etc/mosquitto/conf.d/20bridges.conf</code> следующие строки: | ||
#: <syntaxhighlight lang="bash"> | #: <syntaxhighlight lang="bash"> | ||
connection clusterfly | connection clusterfly | ||
Строка 245: | Строка 292: | ||
try_private false | try_private false | ||
notifications true | notifications true | ||
notification_topic /client/ | notification_topic /client/wb_7/bridge_status | ||
start_type automatic | start_type automatic | ||
topic /# both 0 "" user_xxxxxx | topic /# both 0 "" user_xxxxxx | ||
Строка 254: | Строка 301: | ||
# Перезапустите <code>mosquitto</code>, выполнив в консоли: | # Перезапустите <code>mosquitto</code>, выполнив в консоли: | ||
#: <syntaxhighlight lang="bash"> | #: <syntaxhighlight lang="bash"> | ||
systemctl restart mosquitto | |||
</syntaxhighlight> | </syntaxhighlight> | ||
#: Потребуется подождать некоторое время пока брокер <code>mosquitto</code> сможет организовать соединение. Подписавшись на контроллере к топику <code>/client/ | #: Потребуется подождать некоторое время пока брокер <code>mosquitto</code> сможет организовать соединение. Подписавшись на контроллере к топику <code>/client/wb_7/bridge_status</code> можно увидеть статус соединения. | ||
#:<syntaxhighlight lang="bash"> | #:<syntaxhighlight lang="bash"> | ||
mosquitto_sub -v -t "/client/ | mosquitto_sub -v -t "/client/wb_7/bridge_status" | ||
/client/ | /client/wb_7/bridge_status 0 | ||
/client/ | /client/wb_7/bridge_status 1 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 280: | Строка 327: | ||
'''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг: | '''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг: | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
nano /etc/mosquitto/conf.d/20bridges.conf | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Строки: | Строки: | ||
Строка 291: | Строка 338: | ||
restart_timeout 20 | restart_timeout 20 | ||
topic /temp1/# in | topic /temp1/# in 1 /devices /client | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 300: | Строка 347: | ||
'''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера. | '''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера. | ||
Рассмотрим подробнее строчку <code>topic /temp1/# in | Рассмотрим подробнее строчку <code>topic /temp1/# in 1 /devices /client</code> | ||
где: | где: | ||
* <code>/temp1/#</code> это топик от «корня». На брокере-источнике /client/'''temp1'''. | * <code>/temp1/#</code> это топик от «корня». На брокере-источнике /client/'''temp1'''. | ||
Строка 392: | Строка 439: | ||
=== Настройка моста на контроллере === | === Настройка моста на контроллере === | ||
Создайте | Создайте конфигурацию моста, для этого: | ||
# | # Откройте файл <code>/etc/mosquitto/conf.d/20bridges.conf</code> | ||
#:<syntaxhighlight lang="bash"> | #:<syntaxhighlight lang="bash"> | ||
nano /etc/mosquitto/conf.d/ | nano /etc/mosquitto/conf.d/20bridges.conf | ||
</syntaxhighlight> | </syntaxhighlight> | ||
# Вставьте в | # Вставьте в конец файла строки, где <code>10.0.0.105</code> — адрес брокера: | ||
#:<syntaxhighlight lang="bash"> | #:<syntaxhighlight lang="bash"> | ||
connection bridge1 | connection bridge1 |