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

Навигация

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

3851 байт добавлено ,  4 года назад
Отметить эту версию для перевода
(Отметить эту версию для перевода)
(не показано 15 промежуточных версий 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 следует определённым правилам - так называемым Conventions [https://github.com/contactless/homeui/blob/contactless/conventions.md https://github.com/contactless/homeui/blob/contactless/conventions.md]
Логика организации топиков, соответствующих разным устройствам и их параметрам, в 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.
===Работа из командной строки===
===Работа из командной строки===
==== Просмотр MQTT-устройств в web-интерфейсе ====
MQTT-названия устройств и их элементов управления можно найти в разделе Settings web-интерфейса:
[[Файл:Wb_settings.png|800px|thumb|Информация об MQTT-названиях устройств]]


==== Управление устройствами из командной строки ==== <!--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'''. Пример:
Строка 119: Строка 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">
Строка 127: Строка 130:
/devices/wb-w1/controls/28-0115a48fcfff 22.75
/devices/wb-w1/controls/28-0115a48fcfff 22.75
</syntaxhighlight>
</syntaxhighlight>
Подписаться можно не только на один топик, но и на группу по wildcard:
===Метасимволы=== <!--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
Строка 135: Строка 141:
/devices/wb-w1/controls/28-0115a48fcfff 22.75
/devices/wb-w1/controls/28-0115a48fcfff 22.75
</syntaxhighlight>
</syntaxhighlight>
, где ''#'' - означает любое количество вложенных топиков. Соответственно, вывелись не только значения с "контрола" устройства, но и топики с метаданными - название драйвера устройства и тип "контрола" - ''temperature''.
В результате мы получили не только значения с "контрола" устройства, но и топики с метаданными - название драйвера устройства и тип "контрола" - ''temperature''.
Существует так же метасимвол ''+'', который обозначает один уровень, а не произвольное количество,как ''#'':
<syntaxhighlight lang="bash">
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].


Строка 151: Строка 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-->
Строка 157: Строка 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-интерфейсе === <!--T:149-->
MQTT-названия устройств, их элементов управления и последние значения можно найти в разделе Settings web-интерфейса:
[[Файл: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>
</translate>
12 063

правки