12 063
правки
Kilpio (обсуждение | вклад) |
(Отметить эту версию для перевода) |
||
(не показано 10 промежуточных версий 5 участников) | |||
Строка 4: | Строка 4: | ||
'''MQTT''' - очередь сообщений, использующаяся в [[Программное обеспечение Wiren Board|программном обеспечении Wiren Board]]. [http://en.wikipedia.org/wiki/MQTT Базовая информация по MQTT на Википедии]. | '''MQTT''' - очередь сообщений, использующаяся в [[Программное обеспечение Wiren Board|программном обеспечении Wiren Board]]. [http://en.wikipedia.org/wiki/MQTT Базовая информация по MQTT на Википедии]. | ||
<!--T:134--> | |||
Драйверы, отвечающие за аппаратные возможности контроллера (цифровые входы, АЦП, транзисторный выходы, ...) и функции внешних подключённых устройств (например, подключённых по RS-485 модулей реле) записывают их состояние в очередь MQTT в виде специальных сообщений. Веб-интерфейс читает эти сообщения и на их основе отображает состояние устройств. | Драйверы, отвечающие за аппаратные возможности контроллера (цифровые входы, АЦП, транзисторный выходы, ...) и функции внешних подключённых устройств (например, подключённых по RS-485 модулей реле) записывают их состояние в очередь MQTT в виде специальных сообщений. Веб-интерфейс читает эти сообщения и на их основе отображает состояние устройств. | ||
<!--T:135--> | |||
Если же происходит нажатие кнопки в веб-интерфейсе, уже веб-интерфейс отправляет сообщение в очередь MQTT, драйвер устройства его получает и отдаёт команду устройству. | Если же происходит нажатие кнопки в веб-интерфейсе, уже веб-интерфейс отправляет сообщение в очередь MQTT, драйвер устройства его получает и отдаёт команду устройству. | ||
Строка 23: | Строка 25: | ||
#Драйвер wb-mqtt-serial получает это уведомление по RS-485 и публикует в очереди сообщение:<pre>/devices/wb-mrm2_130/controls/Relay 1 1</pre>Оно значит, что первое реле на устройстве WB-MRM2 с адресом ''130'' находится (уже переведено) в состоянии логической единицы ("включено"). | #Драйвер wb-mqtt-serial получает это уведомление по RS-485 и публикует в очереди сообщение:<pre>/devices/wb-mrm2_130/controls/Relay 1 1</pre>Оно значит, что первое реле на устройстве WB-MRM2 с адресом ''130'' находится (уже переведено) в состоянии логической единицы ("включено"). | ||
== Принцип работы очереди сообщений == | == Принцип работы очереди сообщений == <!--T:136--> | ||
[[File:MQTT.png | thumb | 600px | Через очередь сообщений MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]] | [[File:MQTT.png | thumb | 600px | Через очередь сообщений MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]] | ||
Система сообщений MQTT построена по следующему принципу: | Система сообщений MQTT построена по следующему принципу: | ||
Строка 34: | Строка 36: | ||
<!--T:25--> | <!--T:25--> | ||
Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам - так называемым | Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам - так называемым соглашениям ([https://github.com/contactless/homeui/blob/master/conventions.md Wiren Board MQTT Conventions]). | ||
<!--T:137--> | |||
Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]). | Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]). | ||
=== Клиенты очереди сообщений === | === Клиенты очереди сообщений === <!--T:138--> | ||
*драйверы внутренних аппаратных функций | *драйверы внутренних аппаратных функций | ||
*драйверы внешних подключённых устройств | *драйверы внешних подключённых устройств | ||
Строка 45: | Строка 48: | ||
*(если есть) собственные программы пользователя | *(если есть) собственные программы пользователя | ||
=== Структура сообщения о состоянии устройства === | === Структура сообщения о состоянии устройства === <!--T:139--> | ||
Вот пример сообщения от драйвера температурного датчика 1-Wire из примера выше: | Вот пример сообщения от драйвера температурного датчика 1-Wire из примера выше: | ||
<pre> | <pre> | ||
Строка 53: | Строка 55: | ||
Часть до пробела - название топика, после - само сообщение. | Часть до пробела - название топика, после - само сообщение. | ||
<!--T:140--> | |||
Название топика состоит из вложенных друг в друга "подтопиков": | Название топика состоит из вложенных друг в друга "подтопиков": | ||
* ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле) | * ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле) | ||
Строка 61: | Строка 64: | ||
* ''23.25'' - значение температуры | * ''23.25'' - значение температуры | ||
<!--T:141--> | |||
Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке Devices и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков. | |||
<!--T: | === Пример подписки === <!--T:113--> | ||
<!--T:122--> | |||
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс. | Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс. | ||
<!--T: | <!--T:133--> | ||
Подписаться на сообщения можно и из консоли Linux при помощи утилиты '''mosquitto_sub''' (полное описание работы с очередью из командной строки смотрите ниже): | Подписаться на сообщения можно и из консоли Linux при помощи утилиты '''mosquitto_sub''' (полное описание работы с очередью из командной строки смотрите ниже): | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 98: | Строка 104: | ||
- веб-интерфейс сначала "даёт указание" включить реле, потом драйвер его включает и записывает актуальное состояние в "канал"("контрол"). | - веб-интерфейс сначала "даёт указание" включить реле, потом драйвер его включает и записывает актуальное состояние в "канал"("контрол"). | ||
==Работа с очередью сообщений== | ==Работа с очередью сообщений== <!--T:142--> | ||
Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto. | Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto. | ||
===Работа из командной строки=== | ===Работа из командной строки=== | ||
Строка 104: | Строка 110: | ||
==== Управление устройствами из командной строки ==== <!--T:20--> | ==== Управление устройствами из командной строки ==== <!--T:20--> | ||
<!--T:143--> | |||
Для управления устройством (изменения значения канала), необходимо отправить сообщение в топик "/devices/<device-id>/controls/<control-id>/on" (обратите внимание на /on в конце). | Для управления устройством (изменения значения канала), необходимо отправить сообщение в топик "/devices/<device-id>/controls/<control-id>/on" (обратите внимание на /on в конце). | ||
Это делается с помощью консольной команды '''mosquitto_pub'''. Пример: | Это делается с помощью консольной команды '''mosquitto_pub'''. Пример: | ||
Строка 116: | Строка 123: | ||
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс. | Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс. | ||
Подписаться на сообщения можно и из консоли Linux при помощи утилиты '''mosquitto_sub''' (полное описание утилиты смотрите на [http://mosquitto.org/man/mosquitto_sub-1.html http://mosquitto.org/man/mosquitto_sub-1.html]): | Подписаться на сообщения можно и из консоли Linux при помощи утилиты '''mosquitto_sub''' (полное описание утилиты смотрите на [http://mosquitto.org/man/mosquitto_sub-1.html http://mosquitto.org/man/mosquitto_sub-1.html]): | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 124: | Строка 130: | ||
/devices/wb-w1/controls/28-0115a48fcfff 22.75 | /devices/wb-w1/controls/28-0115a48fcfff 22.75 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Подписаться можно не только на один топик, но и на группу по | ===Метасимволы=== <!--T:13--> | ||
<!--T:144--> | |||
Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#'' означает любое количество уровней вложенных топиков. Выполним команду | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
root@wirenboard:~# mosquitto_sub -t '/devices/wb-w1/#' -v | root@wirenboard:~# mosquitto_sub -t '/devices/wb-w1/#' -v | ||
Строка 132: | Строка 141: | ||
/devices/wb-w1/controls/28-0115a48fcfff 22.75 | /devices/wb-w1/controls/28-0115a48fcfff 22.75 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
В результате мы получили не только значения с "контрола" устройства, но и топики с метаданными - название драйвера устройства и тип "контрола" - ''temperature''. | |||
Существует так же метасимвол ''+'', который обозначает один уровень, а не произвольное количество,как ''#'': | Существует так же метасимвол ''+'', который обозначает один уровень, а не произвольное количество,как ''#'': | ||
<syntaxhighlight lang="bash"> | |||
mosquitto_sub -v -t "/config/widgets/+/name" | mosquitto_sub -v -t "/config/widgets/+/name" | ||
</syntaxhighlight> | |||
В этом случае мы получим имена всех виджетов. | |||
<!--T:145--> | |||
Полное описание системы топиков и подписок [http://mosquitto.org/man/mqtt-7.html http://mosquitto.org/man/mqtt-7.html]. | Полное описание системы топиков и подписок [http://mosquitto.org/man/mqtt-7.html http://mosquitto.org/man/mqtt-7.html]. | ||
Строка 152: | Строка 164: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
- удалит все топики, начинающиеся на '/devices/noolite_tx_1234/' | - удалит все топики, начинающиеся на '/devices/noolite_tx_1234/' | ||
<!--T:146--> | |||
Для удаления топиков "по маске", можно циклично вызывать runShellCommand из правил. Таким образом, задача сводится к задаче работы со строками в js. | |||
<syntaxhighlight lang="bash"> | |||
var deviceName = ['name1',.., 'nameN']; | |||
var controlName = 'Temperature'; | |||
<!--T:147--> | |||
for (var i = 0; i<deviceName.length; i++) { | |||
runShellCommand ('mqtt-delete-retained /devices/'+ deviceName[i] + '/controls/controlName/#'); | |||
} | |||
</syntaxhighlight> | |||
=== Работа с очередью из внешних программ === <!--T:34--> | === Работа с очередью из внешних программ === <!--T:34--> | ||
Строка 158: | Строка 182: | ||
Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через очередь сообщений - ваша программа передаёт сообщение в очередь, драйвер управляет устройством, и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через очередь сообщений - ваша программа передаёт сообщение в очередь, драйвер управляет устройством, и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | ||
<!--T:148--> | |||
Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки. Примеры: | Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки. Примеры: | ||
* Python - [https://github.com/contactless/mqtt-tools] | * Python - [https://github.com/contactless/mqtt-tools] | ||
* C - [http://mosquitto.org/man/libmosquitto-3.html] | * C - [http://mosquitto.org/man/libmosquitto-3.html] | ||
=== Просмотр MQTT-каналов в web-интерфейсе === | |||
=== Просмотр MQTT-каналов в web-интерфейсе === <!--T:149--> | |||
MQTT-названия устройств, их элементов управления и последние значения можно найти в разделе Settings web-интерфейса: | MQTT-названия устройств, их элементов управления и последние значения можно найти в разделе Settings web-интерфейса: | ||
[[Файл:Wb_settings.png|900px|thumb|center|Информация об MQTT-названиях устройств]] | [[Файл:Wb_settings.png|900px|thumb|center|Информация об MQTT-названиях устройств]] | ||
=== Настройка MQTT моста (bridge) === <!--T:150--> | |||
[[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]] | |||
MQTT мост (bridge) - это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно. На контроллере эта функция настраивается в конфигурационных файлах ''mosquitto''. Самый простой вариант конфигурации приведён ниже. | |||
<!--T:151--> | |||
'''Задача:''' настроить пересылку всех сообщений MQTT на популярный бесплатный облачный MQTT брокер http://cloudmqtt.com/ и обратно. | |||
<!--T:152--> | |||
'''Решение:''' | |||
# Зарегистрируйтесь на http://cloudmqtt.com/ | |||
# Зайдите в свой аккаунт на http://cloudmqtt.com/ и посмотрите настройки: сервер, порт, логин, пароль. | |||
# Зайдите на контроллер и добавьте в конец файла ''/etc/mosquitto/mosquitto.conf'' следующие строки: | |||
#: <syntaxhighlight lang="bash"> | |||
connection cloudmqtt | |||
address m21.cloudmqtt.com:10858 | |||
remote_username fs_user_kp | |||
remote_password 5dn_pass_pm | |||
clientid pavel_test | |||
try_private false | |||
start_type automatic | |||
topic # both | |||
</syntaxhighlight> | |||
#: (последняя строка говорит, что нужно пересылать все сообщения (метасимвол '''#''', смотрите описание выше) в обе ('''both''') стороны (с брокера контроллера на облачный брокер и обратно) | |||
#: Более подробное описание всех опций смотрите на https://mosquitto.org/man/mosquitto-conf-5.html. | |||
# Перезапустите mosquitto, выполнив в консоли | |||
#: <syntaxhighlight lang="bash"> | |||
service mosquitto restart | |||
</syntaxhighlight> | |||
</translate> |
правки