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

Навигация

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

1329 байт добавлено ,  4 года назад
Отметить эту версию для перевода
(Отметить эту версию для перевода)
(не показано 6 промежуточных версий 3 участников)
Строка 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>
Строка 53: Строка 55:
Часть до пробела - название топика, после - само сообщение.
Часть до пробела - название топика, после - само сообщение.


<!--T:140-->
Название топика состоит из вложенных друг в друга "подтопиков":
Название топика состоит из вложенных друг в друга "подтопиков":
* ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле)
* ''/devices'' - коренной топик для всех "устройств" - как встроенных функций Wiren Board (цифровые, АЦП, ...), так и подключённых внешних (например, модулей реле)
Строка 61: Строка 64:
* ''23.25'' - значение температуры
* ''23.25'' - значение температуры


=== Пример подписки === <!--T:11-->
<!--T:141-->
Если вы хотите самостоятельно написать драйвер устройства, и хотите, что оно отображалось на вкладке Devices и его можно было использовать в правилах, вам необходимо придерживаться такой же структуры топиков.


<!--T:12-->
=== Пример подписки === <!--T:113-->
 
<!--T:122-->
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс.
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс.


<!--T:13-->
<!--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:
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс.
Клиенты, которые хотят следить за значением температуры, "подписываются" на этот топик, и им приходят все новые сообщения - меняющиеся значения температуры. Один из таких клиентов - веб-интерфейс.


<!--T:13-->
Подписаться на сообщения можно и из консоли 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 применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#''  означает любое количество уровней вложенных топиков. Выполним команду
Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#''  означает любое количество уровней вложенных топиков. Выполним команду
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 142: Строка 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].


Строка 156: Строка 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-->
Строка 162: Строка 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]
</translate>


=== Просмотр 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''. Самый простой вариант конфигурации приведён ниже.


'''Задача:''' настроить пересылку всех сообщений MQTT на популярный бесплатный облачный MQTT брокер http://cloudmqtt.com/.
<!--T:151-->
'''Задача:''' настроить пересылку всех сообщений MQTT на популярный бесплатный облачный MQTT брокер http://cloudmqtt.com/ и обратно.


<!--T:152-->
'''Решение:'''
'''Решение:'''
# Зарегистрируйтесь на http://cloudmqtt.com/
# Зарегистрируйтесь на http://cloudmqtt.com/
Строка 192: Строка 215:
</syntaxhighlight>
</syntaxhighlight>
#: (последняя строка говорит, что нужно пересылать все сообщения (метасимвол '''#''', смотрите описание выше) в обе ('''both''') стороны (с брокера контроллера на облачный брокер и обратно)
#: (последняя строка говорит, что нужно пересылать все сообщения (метасимвол '''#''', смотрите описание выше) в обе ('''both''') стороны (с брокера контроллера на облачный брокер и обратно)
Более подробное описание всех опций смотрите на https://mosquitto.org/man/mosquitto-conf-5.html.
#: Более подробное описание всех опций смотрите на https://mosquitto.org/man/mosquitto-conf-5.html.
# Перезапустите mosquitto, выполнив в консоли
#: <syntaxhighlight lang="bash">
service mosquitto restart
</syntaxhighlight>
</translate>
12 063

правки