Перейти к содержанию

Навигация

MQTT: различия между версиями

3200 байт добавлено ,  8 месяцев назад
м (→‎Проверка работоспособности: Убрал, Андрей потом допишет)
 
(не показано 37 промежуточных версий 6 участников)
Строка 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/contactless/wb-homa-drivers/tree/master/wb-homa-w1 wb-homa-w1]) опрашивает подключённые к контролеру датчики 1-Wire.
#Драйвер [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 сообщение вида: <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:MQTT.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]]
[[File:DebianLinux.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]]
Система сообщений MQTT построена по следующему принципу:
Система сообщений MQTT построена по следующему принципу:
*есть иерархическая система «топиков» (как на обычных форумах в интернете).
*есть иерархическая система «топиков» (как на обычных форумах в интернете).
Строка 34: Строка 40:
=== Отображение устройств в структуре сообщений ===  
=== Отображение устройств в структуре сообщений ===  


Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам — так называемым соглашениям ([https://github.com/contactless/homeui/blob/master/conventions.md Wiren Board MQTT Conventions]).
Логика организации топиков, соответствующих разным устройствам и их параметрам, в 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, для многих языков программирования есть библиотеки:
Языки, для которых есть библиотеки для работы с MQTT, по ссылкам подробное описание:
* Python - [https://github.com/contactless/mqtt-tools]
* [[Python]]
* C - [http://mosquitto.org/man/libmosquitto-3.html]
* [[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/mosquitto.conf</code> следующие строки:
# Зайдите на контроллер и добавьте в конец файла <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">
service mosquitto restart
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/ и выберите "Профиль" посмотрите настройки: сервер, порт, логин и сгенерируйте пароль. Для пересылки используйте сервер <code>srv1.clusterfly.ru</code>.
# Зайдите в свой аккаунт на https://clusterfly.ru/ и выберите «Профиль» посмотрите настройки: сервер, порт, логин и сгенерируйте пароль. Для пересылки используйте сервер <code>srv1.clusterfly.ru</code>.
# Зайдите на контроллер и добавьте в конец файла <code>/etc/mosquitto/mosquitto.conf</code> следующие строки:
# Зайдите на контроллер и добавьте в конец файла <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/wb_6/bridge_status
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">
service mosquitto restart
systemctl restart mosquitto
</syntaxhighlight>
</syntaxhighlight>
#: Потребуется подождать некоторое время пока брокер <code>mosquitto</code> сможет организовать соединение. Подписавшись на контроллере к топику <code>/client/wb_6/bridge_status</code> можно увидеть статус соединения.
#: Потребуется подождать некоторое время пока брокер <code>mosquitto</code> сможет организовать соединение. Подписавшись на контроллере к топику <code>/client/wb_7/bridge_status</code> можно увидеть статус соединения.
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
mosquitto_sub -v -t "/client/wb_6/bridge_status"  
mosquitto_sub -v -t "/client/wb_7/bridge_status"  
/client/wb_6/bridge_status 0
/client/wb_7/bridge_status 0
/client/wb_6/bridge_status 1
/client/wb_7/bridge_status 1
</syntaxhighlight>
</syntaxhighlight>


Строка 280: Строка 327:
'''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг:
'''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
mcedit /etc/mosquitto/conf.d/bridge.conf
nano /etc/mosquitto/conf.d/20bridges.conf
</syntaxhighlight>
</syntaxhighlight>
Строки:
Строки:
Строка 291: Строка 338:
restart_timeout 20
restart_timeout 20


topic /temp1/# in 2 /devices /client
topic /temp1/# in 1 /devices /client
</syntaxhighlight>
</syntaxhighlight>


Строка 300: Строка 347:
'''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера.
'''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера.


Рассмотрим подробнее строчку <code>topic /temp1/# in 2 /devices /client</code>
Рассмотрим подробнее строчку <code>topic /temp1/# in 1 /devices /client</code>
где:
где:
* <code>/temp1/#</code> это топик от «корня». На брокере-источнике /client/'''temp1'''.
* <code>/temp1/#</code> это топик от «корня». На брокере-источнике /client/'''temp1'''.
Строка 355: Строка 402:
#Установите <code>mosquitto</code>:
#Установите <code>mosquitto</code>:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
apt update && apt install mosquitto mosquitto-clients -y
sudo apt update && sudo apt install mosquitto mosquitto-clients -y
</syntaxhighlight>
</syntaxhighlight>
#Отключите возможность анонимного входа, для этого:
#Отключите возможность анонимного входа, для этого:
#*Откройте файл конфигурации в редакторе
#*Откройте файл конфигурации в редакторе
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
nano /etc/mosquitto/mosquitto.conf
sudo nano /etc/mosquitto/mosquitto.conf
</syntaxhighlight>
</syntaxhighlight>
#*Добавьте строки:
#*Добавьте в конец файла строки:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
#Turn on port listening
listener 1883
#Disable anonomous login:
#Disable anonomous login:
allow_anonymous false
allow_anonymous false
Строка 369: Строка 418:
password_file /etc/mosquitto/mosquitto.pwd
password_file /etc/mosquitto/mosquitto.pwd
</syntaxhighlight>
</syntaxhighlight>
#Создайте пароль для пользователя, в примере использован пользователь <code>test</code> с паролем <code>test11test</code>:
#Создайте пароль для пользователя, в примере использован пользователь <code>test</code> с паролем <code>wbpassword</code>:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
mosquitto_passwd -c /etc/mosquitto/mosquitto.pwd test
sudo mosquitto_passwd -c /etc/mosquitto/mosquitto.pwd test
</syntaxhighlight>
</syntaxhighlight>
#Введите пароль дважды и запомните его, он вам пригодится ниже.
#Введите пароль дважды и запомните его, он вам пригодится ниже.
#Перезапустите <code>mosquitto</code> и проверьте его состояние:
#Перезапустите <code>mosquitto</code> и проверьте его состояние:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
systemctl restart mosquitto && systemctl status mosquitto
sudo systemctl restart mosquitto && sudo systemctl status mosquitto
</syntaxhighlight>
</syntaxhighlight>
#Подключитесь к брокеру для проверки, в примере адрес брокера <code>10.0.26.1</code>:
#Подключитесь к брокеру для проверки, в примере адрес брокера <code>127.0.0.1</code>:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
mosquitto_sub -v -h 10.0.26.1 -u test -P test11test -t "/#"
mosquitto_sub -v -h 127.0.0.1 -u test -P wbpassword -t "/#"
</syntaxhighlight>
</syntaxhighlight>
#Запустите в другой консоли команду ниже и убедитесь, что топик меняется:
#Запустите в другой консоли команду ниже и убедитесь, что топик меняется:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
for i in {1..25}; do mosquitto_pub -h 10.0.26.1 -u test -P test11test -t "/client/temp1/temp" -m "$i" -r; done
for i in {1..25}; do mosquitto_pub -h 127.0.0.1 -u test -P wbpassword -t "/client/temp1/temp" -m "$i" -r; done
</syntaxhighlight>
</syntaxhighlight>
Брокер установлен и доступен с контроллера. Для подключения нужно ввести логин и пароль.
Брокер установлен и доступен с контроллера. Для подключения нужно ввести логин и пароль.
Строка 390: Строка 439:
=== Настройка моста на контроллере ===
=== Настройка моста на контроллере ===


Создайте файл конфигурации моста, для этого:
Создайте конфигурацию моста, для этого:
# Создайте файл <code>/etc/mosquitto/conf.d/bridge1.conf</code>
# Откройте файл <code>/etc/mosquitto/conf.d/20bridges.conf</code>
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
nano /etc/mosquitto/conf.d/bridge1.conf
nano /etc/mosquitto/conf.d/20bridges.conf
</syntaxhighlight>
</syntaxhighlight>
# Вставьте в него строки:
# Вставьте в конец файла строки, где <code>10.0.0.105</code> — адрес брокера:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
/etc/mosquitto/conf.d/bridge1.conf
connection bridge1
connection bridge1
#address of server
#address of server
Строка 404: Строка 452:
notification_topic /clientnotification/bridge1_status
notification_topic /clientnotification/bridge1_status
remote_username test
remote_username test
remote_password test11test
remote_password wbpassword


topic /temp1/# both 2 /devices /controller
topic /temp1/# both 2 /devices /controller
wb_editors
886

правок