12 063
правки
м |
(Отметить эту версию для перевода) |
||
Строка 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 построена по следующему принципу: | ||
Строка 36: | Строка 38: | ||
Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам - так называемым соглашениям ([https://github.com/contactless/homeui/blob/master/conventions.md Wiren Board MQTT Conventions]). | Логика организации топиков, соответствующих разным устройствам и их параметрам, в 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> | ||
Строка 52: | Строка 55: | ||
Часть до пробела - название топика, после - само сообщение. | Часть до пробела - название топика, после - само сообщение. | ||
<!--T:140--> | |||
Название топика состоит из вложенных друг в друга "подтопиков": | Название топика состоит из вложенных друг в друга "подтопиков": | ||
* ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле) | * ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле) | ||
Строка 60: | Строка 64: | ||
* ''23.25'' - значение температуры | * ''23.25'' - значение температуры | ||
<!--T:141--> | |||
Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке Devices и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков. | Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке Devices и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков. | ||
Строка 99: | Строка 104: | ||
- веб-интерфейс сначала "даёт указание" включить реле, потом драйвер его включает и записывает актуальное состояние в "канал"("контрол"). | - веб-интерфейс сначала "даёт указание" включить реле, потом драйвер его включает и записывает актуальное состояние в "канал"("контрол"). | ||
==Работа с очередью сообщений== | ==Работа с очередью сообщений== <!--T:142--> | ||
Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto. | Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto. | ||
===Работа из командной строки=== | ===Работа из командной строки=== | ||
Строка 105: | Строка 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'''. Пример: | ||
Строка 117: | Строка 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"> | ||
Строка 125: | Строка 130: | ||
/devices/wb-w1/controls/28-0115a48fcfff 22.75 | /devices/wb-w1/controls/28-0115a48fcfff 22.75 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===Метасимволы=== | ===Метасимволы=== <!--T:13--> | ||
<!--T:144--> | |||
Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#'' означает любое количество уровней вложенных топиков. Выполним команду | Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#'' означает любое количество уровней вложенных топиков. Выполним команду | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 143: | Строка 149: | ||
<!--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]. | ||
Строка 158: | Строка 165: | ||
- удалит все топики, начинающиеся на '/devices/noolite_tx_1234/' | - удалит все топики, начинающиеся на '/devices/noolite_tx_1234/' | ||
<!--T:146--> | |||
Для удаления топиков "по маске", можно циклично вызывать runShellCommand из правил. Таким образом, задача сводится к задаче работы со строками в js. | Для удаления топиков "по маске", можно циклично вызывать runShellCommand из правил. Таким образом, задача сводится к задаче работы со строками в js. | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
Строка 163: | Строка 171: | ||
var controlName = 'Temperature'; | var controlName = 'Temperature'; | ||
<!--T:147--> | |||
for (var i = 0; i<deviceName.length; i++) { | for (var i = 0; i<deviceName.length; i++) { | ||
runShellCommand ('mqtt-delete-retained /devices/'+ deviceName[i] + '/controls/controlName/#'); | runShellCommand ('mqtt-delete-retained /devices/'+ deviceName[i] + '/controls/controlName/#'); | ||
Строка 173: | Строка 182: | ||
Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через очередь сообщений - ваша программа передаёт сообщение в очередь, драйвер управляет устройством, и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через очередь сообщений - ваша программа передаёт сообщение в очередь, драйвер управляет устройством, и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне. | ||
<!--T:148--> | |||
Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки. Примеры: | Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки. Примеры: | ||
* Python - [https://github.com/contactless/mqtt-tools] | * Python - [https://github.com/contactless/mqtt-tools] | ||
Строка 178: | Строка 188: | ||
=== Просмотр 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) === | === Настройка MQTT моста (bridge) === <!--T:150--> | ||
[[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]] | [[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]] | ||
MQTT мост (bridge) - это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно. На контроллере эта функция настраивается в конфигурационных файлах ''mosquitto''. Самый простой вариант конфигурации приведён ниже. | MQTT мост (bridge) - это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно. На контроллере эта функция настраивается в конфигурационных файлах ''mosquitto''. Самый простой вариант конфигурации приведён ниже. | ||
<!--T:151--> | |||
'''Задача:''' настроить пересылку всех сообщений MQTT на популярный бесплатный облачный MQTT брокер http://cloudmqtt.com/ и обратно. | '''Задача:''' настроить пересылку всех сообщений MQTT на популярный бесплатный облачный MQTT брокер http://cloudmqtt.com/ и обратно. | ||
<!--T:152--> | |||
'''Решение:''' | '''Решение:''' | ||
# Зарегистрируйтесь на http://cloudmqtt.com/ | # Зарегистрируйтесь на http://cloudmqtt.com/ |
правки