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

Навигация

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

Удалённая из перевода страница
(Отметить эту версию для перевода)
(Удалённая из перевода страница)
Строка 1: Строка 1:
<translate>
== Описание ==
== Описание == <!--T:153-->
'''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:154-->
Драйверы, которые отвечают за аппаратную часть контроллера (цифровые и транзисторные входы, АЦП и т.п.) и функции внешних подключенных устройств публикуют их состояние по MQTT в виде сообщений. Веб-интерфейс читает эти сообщения и на их основе отображает состояние устройств.
Драйверы, которые отвечают за аппаратную часть контроллера (цифровые и транзисторные входы, АЦП и т.п.) и функции внешних подключенных устройств публикуют их состояние по MQTT в виде сообщений. Веб-интерфейс читает эти сообщения и на их основе отображает состояние устройств.


<!--T:155-->
Действия пользователя в веб-интерфейсе также публикуются по MQTT, где их получает драйвер и передает команду пользователя устройству.
Действия пользователя в веб-интерфейсе также публикуются по MQTT, где их получает драйвер и передает команду пользователя устройству.


<!--T:156-->
Через MQTT работают: веб-интерфейс, движок правил и встроенные драйверы. Если вы разрабатываете собственное ПО в дополнение к предустановленному — мы рекомендуем использовать MQTT.
Через MQTT работают: веб-интерфейс, движок правил и встроенные драйверы. Если вы разрабатываете собственное ПО в дополнение к предустановленному — мы рекомендуем использовать MQTT.


== Примеры работы через MQTT ==  <!--T:157-->
== Примеры работы через MQTT ==  ===Получение значения от датчика температуры и вывод его в веб-интерфейс===
===Получение значения от датчика температуры и вывод его в веб-интерфейс===
[[File:Web-devices-1-wire.png|400px|thumb|Показания датчика и его уникальный идентификатор на странице ''Devices'' веб-интерфейса]]
[[File:Web-devices-1-wire.png|400px|thumb|Показания датчика и его уникальный идентификатор на странице ''Devices'' веб-интерфейса]]


Строка 20: Строка 15:
#При получении значения драйвер публикует 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, получает это сообщение и выводит значение датчика на страницу.
===Нажатие кнопки в веб-интерфейсе и переключение реле на внешнем модуле=== <!--T:158-->
===Нажатие кнопки в веб-интерфейсе и переключение реле на внешнем модуле===
[[File:Web-devices-serial.png|400px|thumb|Веб-интерфейс после нажатия кнопки включения Реле 1 на подключённом по RS-485 релейном модуле [[WB-MRM2]]]]
[[File:Web-devices-serial.png|400px|thumb|Веб-интерфейс после нажатия кнопки включения Реле 1 на подключённом по RS-485 релейном модуле [[WB-MRM2]]]]
К контроллеру по шине [[RS-485]] подключён релейный модуль [[WB-MRM2]]. Пользователь в веб-интерфейсе нажимает кнопку включения реле. Проследим, как команда из веб-интерфейса попадает на внешний модуль:
К контроллеру по шине [[RS-485]] подключён релейный модуль [[WB-MRM2]]. Пользователь в веб-интерфейсе нажимает кнопку включения реле. Проследим, как команда из веб-интерфейса попадает на внешний модуль:
Строка 28: Строка 23:
#Драйвер 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 ==  <!--T:159-->
== Принцип работы MQTT ==  [[File:DebianLinux.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]]
[[File:DebianLinux.png | thumb | 600px | Через MQTT работают драйверы внутренних функций, внешних устройств, веб-интерфейс, система правил]]
Система сообщений MQTT построена по следующему принципу:
Система сообщений MQTT построена по следующему принципу:
*есть иерархическая система «топиков» (как на обычных форумах в интернете).
*есть иерархическая система «топиков» (как на обычных форумах в интернете).
Строка 36: Строка 30:
[http://mosquitto.org/man/mqtt-7.html Читать полное описание системы топиков и подписок].
[http://mosquitto.org/man/mqtt-7.html Читать полное описание системы топиков и подписок].


=== Отображение устройств в структуре сообщений === <!--T:160-->
=== Отображение устройств в структуре сообщений ===  


<!--T:161-->
Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам — так называемым соглашениям ([https://github.com/wirenboard/conventions/blob/main/README.md Wiren Board MQTT Conventions]).
Логика организации топиков, соответствующих разным устройствам и их параметрам, в Wiren Board следует определённым правилам — так называемым соглашениям ([https://github.com/wirenboard/conventions/blob/main/README.md Wiren Board MQTT Conventions]).


<!--T:162-->
Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]).
Полный список MQTT-топиков можно увидеть на странице ''Settings'' веб-интерфейса в разделе ''MQTT Channels'' (появилось в последних версиях [[Обновление прошивки|прошивки]]).


=== Клиенты MQTT ===  <!--T:163-->
=== Клиенты MQTT ===  *драйверы внутренних аппаратных функций,
*драйверы внутренних аппаратных функций,
*драйверы внешних подключённых устройств,
*драйверы внешних подключённых устройств,
*веб-интерфейс,
*веб-интерфейс,
Строка 51: Строка 42:
*(если есть) собственные программы пользователя.
*(если есть) собственные программы пользователя.


=== Структура сообщения о состоянии устройства ===  <!--T:164-->
=== Структура сообщения о состоянии устройства ===  Вот сообщение от драйвера температурного датчика 1-Wire из примера выше:
Вот сообщение от драйвера температурного датчика 1-Wire из примера выше:
<pre>
<pre>
/devices/wb-w1/controls/28-0115a48fcfff 23.25
/devices/wb-w1/controls/28-0115a48fcfff 23.25
Строка 58: Строка 48:
Часть до пробела — название топика, после — само сообщение.
Часть до пробела — название топика, после — само сообщение.


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


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


=== Структура сообщения об ошибке опроса устройства ===  <!--T:167-->
=== Структура сообщения об ошибке опроса устройства ===  Каждый «канал» («контрол») имеет «подтопик» <code>/meta/error</code>, в котором содержится информация о наличии ошибок взаимодействия с устройством. Ошибки получения данных (чтения) обозначаются символом '''r''', ошибки записи — '''w'''.
Каждый «канал» («контрол») имеет «подтопик» <code>/meta/error</code>, в котором содержится информация о наличии ошибок взаимодействия с устройством. Ошибки получения данных (чтения) обозначаются символом '''r''', ошибки записи — '''w'''.


<!--T:168-->
Пример ошибки получения данных:
Пример ошибки получения данных:
<pre>
<pre>
Строка 79: Строка 65:
</pre>
</pre>


<!--T:169-->
Это означает, что не удалось получить температуру термометра с адресом ''28-0115a48fcfff''.
Это означает, что не удалось получить температуру термометра с адресом ''28-0115a48fcfff''.


<!--T:170-->
[[Драйвер wb-mqtt-serial]] устанавливает признак '''r''', если не удалось запросить значение параметра устройства, признак '''w''' — не удалось передать значение устройству.
[[Драйвер wb-mqtt-serial]] устанавливает признак '''r''', если не удалось запросить значение параметра устройства, признак '''w''' — не удалось передать значение устройству.


<!--T:171-->
[https://github.com/wirenboard/wb-homa-adc Драйвер wb-mqtt-adc] устанавливает признак '''r''', если не удалось получить значение соотвествующего канала АЦП.
[https://github.com/wirenboard/wb-homa-adc Драйвер wb-mqtt-adc] устанавливает признак '''r''', если не удалось получить значение соотвествующего канала АЦП.


=== Пример подписки === <!--T:172-->
=== Пример подписки ===  


<!--T:173-->
Клиенты, которые хотят следить за значением температуры, «подписываются» на этот топик, и им приходят все новые сообщения — меняющиеся значения температуры. Один из таких клиентов — веб-интерфейс.
Клиенты, которые хотят следить за значением температуры, «подписываются» на этот топик, и им приходят все новые сообщения — меняющиеся значения температуры. Один из таких клиентов — веб-интерфейс.


<!--T:174-->
Подписаться на сообщения можно и из консоли Linux при помощи утилиты <code>mosquitto_sub</code>:
Подписаться на сообщения можно и из консоли Linux при помощи утилиты <code>mosquitto_sub</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 102: Строка 83:
</syntaxhighlight>
</syntaxhighlight>


<!--T:175-->
Полное описание работы с MQTT из командной строки смотрите ниже.
Полное описание работы с MQTT из командной строки смотрите ниже.


=== Структура сообщения — команды на изменение состояния === <!--T:176-->
=== Структура сообщения — команды на изменение состояния ===  


<!--T:177-->
Подпишемся на сообщения о состоянии первого реле подключённого по RS-485 релейного модуля WB-MRM2:
Подпишемся на сообщения о состоянии первого реле подключённого по RS-485 релейного модуля WB-MRM2:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 117: Строка 96:
Тут стоит отметить, что MQTT сохраняет часть сообщений (а именно те, которые при отправке были помечены флагом ''retained'') вечно, поэтому после подписки вы получите даже те сообщения, которые были отправлены раньше, чем вы подписались.
Тут стоит отметить, что MQTT сохраняет часть сообщений (а именно те, которые при отправке были помечены флагом ''retained'') вечно, поэтому после подписки вы получите даже те сообщения, которые были отправлены раньше, чем вы подписались.


<!--T:178-->
Релейный модуль управляется драйвером [[Драйвер wb-mqtt-serial]]. У него есть соответствующий топик-«канал» («контрол») ''Relay 1''. У него самого есть значение — ''0'' (реле выключено), и есть два подтопика. Один из них — служебный: в <code>/meta/type</code> записан тип «контрола». Здесь он ''switch'' — выключатель. Второй подтопик ''/on'' — интереснее: в него клиенты пишут то состояние, в которое они хотят установить реле. Заметим, что оно может не совпадать некоторое время (затрачиваемое на процесс переключения) с тем состоянием, в котором реле находится. Драйвер при этом ведёт себя следующим образом: при получении сообщения в топик <code>/devices/wb-mrm2_130/controls/Relay 1/on</code> он физически включает реле на релейном модуле, а лишь затем записывает новое состояние реле в топик <code>/devices/wb-mrm2_130/controls/Relay</code>.
Релейный модуль управляется драйвером [[Драйвер wb-mqtt-serial]]. У него есть соответствующий топик-«канал» («контрол») ''Relay 1''. У него самого есть значение — ''0'' (реле выключено), и есть два подтопика. Один из них — служебный: в <code>/meta/type</code> записан тип «контрола». Здесь он ''switch'' — выключатель. Второй подтопик ''/on'' — интереснее: в него клиенты пишут то состояние, в которое они хотят установить реле. Заметим, что оно может не совпадать некоторое время (затрачиваемое на процесс переключения) с тем состоянием, в котором реле находится. Драйвер при этом ведёт себя следующим образом: при получении сообщения в топик <code>/devices/wb-mrm2_130/controls/Relay 1/on</code> он физически включает реле на релейном модуле, а лишь затем записывает новое состояние реле в топик <code>/devices/wb-mrm2_130/controls/Relay</code>.


<!--T:179-->
Например, если мы сейчас нажмём на кнопку реле в веб-интерфейсе (переключим его состояние), то получим новые сообщения:
Например, если мы сейчас нажмём на кнопку реле в веб-интерфейсе (переключим его состояние), то получим новые сообщения:
<pre>
<pre>
Строка 128: Строка 105:
- веб-интерфейс сначала «даёт указание» включить реле, потом драйвер его включает и записывает актуальное состояние в «канал» («контрол»).
- веб-интерфейс сначала «даёт указание» включить реле, потом драйвер его включает и записывает актуальное состояние в «канал» («контрол»).


==Локальная работа с сообщениями MQTT== <!--T:180-->
==Локальная работа с сообщениями MQTT==
Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto.
Программа (демон), отвечающая за рассылку сообщений от одних клиентов другим, называется брокером сообщений. В Wiren Board используется брокер сообщений [http://mosquitto.org/ Mosquitto]. Фактически, все драйверы и веб-интерфейс передают свои сообщения именно демону-брокеру Mosquitto.
===Работа из командной строки===
===Работа из командной строки===


==== Управление устройствами из командной строки ==== <!--T:181-->
==== Управление устройствами из командной строки ====


<!--T:182-->
Для управления устройством (изменения значения канала), необходимо отправить сообщение в топик <code>/devices/<device-id>/controls/<control-id>/on</code> (обратите внимание на /on в конце).
Для управления устройством (изменения значения канала), необходимо отправить сообщение в топик <code>/devices/<device-id>/controls/<control-id>/on</code> (обратите внимание на /on в конце).
Это делается с помощью консольной команды '''mosquitto_pub'''. Пример:
Это делается с помощью консольной команды '''mosquitto_pub'''. Пример:
Строка 142: Строка 118:
команда отправляет сообщение «1» (логическую единицу, «включить») в топик, соответствующий подключённому по RS-485 релейном модуле WM-MRM2 с адресом 130.
команда отправляет сообщение «1» (логическую единицу, «включить») в топик, соответствующий подключённому по RS-485 релейном модуле WM-MRM2 с адресом 130.


==== Слежение за состоянием устройства / подписка на топик ==== <!--T:183-->
==== Слежение за состоянием устройства / подписка на топик ====  


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


Строка 154: Строка 129:
/devices/wb-w1/controls/28-0115a48fcfff 22.75
/devices/wb-w1/controls/28-0115a48fcfff 22.75
</syntaxhighlight>
</syntaxhighlight>
===Метасимволы=== <!--T:185-->
===Метасимволы===  


<!--T:186-->
Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#''  означает любое количество уровней вложенных топиков. Выполним команду
Подписаться можно не только на один топик, но и на группу топиков по метасиволу. В MQTT применяется два метасимвола: '''#''' и '''+'''. Метасимвол ''#''  означает любое количество уровней вложенных топиков. Выполним команду
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 172: Строка 146:
В этом случае мы получим имена всех виджетов.
В этом случае мы получим имена всех виджетов.


<!--T:187-->
[http://mosquitto.org/man/mqtt-7.html Полное описание системы топиков и подписок].
[http://mosquitto.org/man/mqtt-7.html Полное описание системы топиков и подписок].


=== Очистка очереди сообщений === <!--T:188-->
=== Очистка очереди сообщений ===


<!--T:189-->
Ненужные retained-сообщения могут остаться в системе MQTT после удаления неиспользуемых драйверов или отключения каких-либо устройств.
Ненужные retained-сообщения могут остаться в системе MQTT после удаления неиспользуемых драйверов или отключения каких-либо устройств.
Это приводит к тому, что несуществующие больше устройства могут отображаться в разделе ''Devices'' веб-интерфейса.
Это приводит к тому, что несуществующие больше устройства могут отображаться в разделе ''Devices'' веб-интерфейса.


<!--T:190-->
Для удаления топиков можно воспользоваться командой <code>mqtt-delete-retained</code>.  
Для удаления топиков можно воспользоваться командой <code>mqtt-delete-retained</code>.  


<!--T:191-->
Например, удалим все топики, начинающиеся на <code>/devices/noolite_tx_1234/</code>
Например, удалим все топики, начинающиеся на <code>/devices/noolite_tx_1234/</code>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 190: Строка 160:
</syntaxhighlight>
</syntaxhighlight>


<!--T:192-->
Для удаления топиков «по маске», можно циклично вызывать <code>runShellCommand</code> из правил. Таким образом, задача сводится к задаче работы со строками в js.
Для удаления топиков «по маске», можно циклично вызывать <code>runShellCommand</code> из правил. Таким образом, задача сводится к задаче работы со строками в js.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 196: Строка 165:
var controlName = 'Temperature';
var controlName = 'Temperature';


<!--T:193-->
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/#');  
Строка 202: Строка 170:
</syntaxhighlight>
</syntaxhighlight>


=== Работа с MQTT из внешних программ === <!--T:194-->
=== Работа с MQTT из внешних программ ===


<!--T:195-->
Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через протокол MQTT — ваша программа передаёт сообщение по MQTT, драйвер управляет устройством и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне.
Если вы разрабатываете собственное ПО для Wiren Board, взаимодействовать с его аппаратными ресурсами лучше всего через протокол MQTT — ваша программа передаёт сообщение по MQTT, драйвер управляет устройством и вашей программе не нужно напрямую взаимодействовать с устройством на низком уровне.


<!--T:196-->
Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки:
Для того, чтобы отправлять сообщения MQTT, для многих языков программирования есть библиотеки:
* Python - [https://github.com/contactless/mqtt-tools]
* Python - [https://github.com/contactless/mqtt-tools]
Строка 213: Строка 179:




=== Просмотр MQTT-каналов в web-интерфейсе === <!--T:197-->
=== Просмотр MQTT-каналов в web-интерфейсе ===
MQTT-названия устройств, их элементов управления и последние значения можно найти в разделе '''Settings''' web-интерфейса:
MQTT-названия устройств, их элементов управления и последние значения можно найти в разделе '''Settings''' web-интерфейса:
[[Файл:Wb_settings.png|900px|thumb|center|Информация об MQTT-названиях устройств]]
[[Файл:Wb_settings.png|900px|thumb|center|Информация об MQTT-названиях устройств]]


==Работа с сообщениями MQTT с внешнего устройства== <!--T:198-->
==Работа с сообщениями MQTT с внешнего устройства==


<!--T:199-->
Установленный на контроллер брокер mosquitto по умолчанию принимает подключения внешних клиентов по порту 1883 без пароля.
Установленный на контроллер брокер mosquitto по умолчанию принимает подключения внешних клиентов по порту 1883 без пароля.


<!--T:200-->
Например, если контроллер имеет адрес 192.168.0.67, его топики можно прочитать с другого компьютера с Linux, находящегося в той же сети:
Например, если контроллер имеет адрес 192.168.0.67, его топики можно прочитать с другого компьютера с Linux, находящегося в той же сети:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 228: Строка 192:
</syntaxhighlight>
</syntaxhighlight>


<!--T:201-->
Альтернативный вариант — использовать [[MQTT Explorer]].
Альтернативный вариант — использовать [[MQTT Explorer]].


=== Настройка MQTT моста (bridge) ===  <!--T:202-->
=== Настройка MQTT моста (bridge) ===  [[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]]
[[File:CloudMQTT.png | thumb | 400px | Настройки брокера Cloud MQTT]]
MQTT мост (bridge) — это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно.
MQTT мост (bridge) — это функция MQTT-брокера, позволяющая пересылать все или часть сообщений на другой MQTT-брокер, и получать сообщения с другого брокера обратно.


<!--T:203-->
Эту функцию удобно применять в следующей ситуации: хотя на самом контроллере уже есть MQTT-брокер, к нему часто неудобно подключаться, так как контроллер может не иметь белого IP-адреса, а иногда может быть выключен или не в сети. В таком случае удобно иметь отдельный брокер в облаке с фиксированным адресом, который будет всегда онлайн, и на который будут пересылаться сообщения с брокера контроллера.
Эту функцию удобно применять в следующей ситуации: хотя на самом контроллере уже есть MQTT-брокер, к нему часто неудобно подключаться, так как контроллер может не иметь белого IP-адреса, а иногда может быть выключен или не в сети. В таком случае удобно иметь отдельный брокер в облаке с фиксированным адресом, который будет всегда онлайн, и на который будут пересылаться сообщения с брокера контроллера.


<!--T:204-->
На контроллере эта функция настраивается в конфигурационных файлах ''mosquitto''. Самый простой вариант конфигурации приведён ниже.
На контроллере эта функция настраивается в конфигурационных файлах ''mosquitto''. Самый простой вариант конфигурации приведён ниже.


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


<!--T:206-->
'''Решение:'''
'''Решение:'''
# Зарегистрируйтесь на http://cloudmqtt.com/
# Зарегистрируйтесь на http://cloudmqtt.com/
Строка 267: Строка 226:
[[File:Clusterfly3.png | thumb | 400px | Настройки брокера CLUSTERFLY]]
[[File:Clusterfly3.png | thumb | 400px | Настройки брокера CLUSTERFLY]]


==== Настройка моста с MQTT брокером Clusterfly ==== <!--T:207-->
==== Настройка моста с MQTT брокером Clusterfly ====
'''Задача:''' настроить пересылку всех сообщений MQTT на бесплатный облачный MQTT брокер https://clusterfly.ru/ и обратно.
'''Задача:''' настроить пересылку всех сообщений MQTT на бесплатный облачный MQTT брокер https://clusterfly.ru/ и обратно.


<!--T:208-->
'''Решение:'''
'''Решение:'''


<!--T:209-->
# Зарегистрируйтесь на https://clusterfly.ru/
# Зарегистрируйтесь на https://clusterfly.ru/
# Зайдите в свой аккаунт на https://clusterfly.ru/ и выберите "Профиль" посмотрите настройки: сервер, порт, логин и сгенерируйте пароль. Для пересылки используйте сервер <code>srv1.clusterfly.ru</code>.
# Зайдите в свой аккаунт на https://clusterfly.ru/ и выберите "Профиль" посмотрите настройки: сервер, порт, логин и сгенерируйте пароль. Для пересылки используйте сервер <code>srv1.clusterfly.ru</code>.
Строка 302: Строка 259:
</syntaxhighlight>
</syntaxhighlight>


==== Другие облачные брокеры ==== <!--T:210-->
==== Другие облачные брокеры ====


<!--T:211-->
Список облачных брокеров, в том числе бесплатных: [https://github.com/mqtt/mqtt.github.io/wiki/public_brokers https://github.com/mqtt/mqtt.github.io/wiki/public_brokers]
Список облачных брокеров, в том числе бесплатных: [https://github.com/mqtt/mqtt.github.io/wiki/public_brokers https://github.com/mqtt/mqtt.github.io/wiki/public_brokers]


<!--T:212-->
'''Задача:''' настроить пересылку топика MQTT на другой контроллер.
'''Задача:''' настроить пересылку топика MQTT на другой контроллер.
Есть два контроллера в одной сети:
Есть два контроллера в одной сети:
Строка 313: Строка 268:
# ''SourceController'' с адресом <code>10.0.0.70</code>, с этого контроллера будем забирать топик.
# ''SourceController'' с адресом <code>10.0.0.70</code>, с этого контроллера будем забирать топик.


<!--T:213-->
На  ''SourceController'' есть <code>/client/temp1</code>, но его нужно видеть на ''DestinationController'' в <code>/devices/temp1</code>.
На  ''SourceController'' есть <code>/client/temp1</code>, но его нужно видеть на ''DestinationController'' в <code>/devices/temp1</code>.


<!--T:214-->
Решается двумя способами, можно с ''SourceController'' публиковать на ''DestinationController'' или с ''DestinationController'' подписаться на топик ''SourceController'' и забирать изменения. От выбора стратегии зависит на каком контроллере будем проводить настройки.
Решается двумя способами, можно с ''SourceController'' публиковать на ''DestinationController'' или с ''DestinationController'' подписаться на топик ''SourceController'' и забирать изменения. От выбора стратегии зависит на каком контроллере будем проводить настройки.


<!--T:215-->
Мы будем настраивать ''DestinationController''.
Мы будем настраивать ''DestinationController''.


<!--T:216-->
'''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг:
'''Решение:''' На контроллере ''DestinationController'' добавьте в конфиг:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 336: Строка 287:
restart_timeout 20
restart_timeout 20


<!--T:217-->
topic /temp1/# in 2 /devices /client
topic /temp1/# in 2 /devices /client
</syntaxhighlight>
</syntaxhighlight>


<!--T:218-->
Перезапустите <code>mosquitto</code> на ''DestinationController'':
Перезапустите <code>mosquitto</code> на ''DestinationController'':
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 347: Строка 296:
'''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера.
'''ВАЖНО:''' перед перезапуском желательно [[watchdog |остановить watchdog]]. В случае ошибки в конфигурационных файлах брокер не запустится и watchdog вызовет перезапуск контроллера.


<!--T:219-->
Рассмотрим подробнее строчку <code>topic /temp1/# in 2 /devices /client</code>
Рассмотрим подробнее строчку <code>topic /temp1/# in 2 /devices /client</code>
где:
где:
Строка 355: Строка 303:
* <code>/client</code> — «корень» откуда забираем на удаленном. На контроллере ''SourceController'' это <code>/client</code> и полный путь будет выгляджеть как '''/client'''/temp1.
* <code>/client</code> — «корень» откуда забираем на удаленном. На контроллере ''SourceController'' это <code>/client</code> и полный путь будет выгляджеть как '''/client'''/temp1.


<!--T:220-->
'''Проверка:'''
'''Проверка:'''
Дожидаемся статуса бриджа «1» в топике <code>/client/wb_40/bridge_status</code> на контроллере ''SourceController''.
Дожидаемся статуса бриджа «1» в топике <code>/client/wb_40/bridge_status</code> на контроллере ''SourceController''.
Строка 366: Строка 313:
</syntaxhighlight>
</syntaxhighlight>


<!--T:221-->
Подписавшись на контроллере ''DestinationController'' на целевой топик можно видеть:
Подписавшись на контроллере ''DestinationController'' на целевой топик можно видеть:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 398: Строка 344:
</syntaxhighlight>
</syntaxhighlight>


== Создание своего брокера MQTT == <!--T:222-->
== Создание своего брокера MQTT ==
Вы можете создать отдельный брокер на компьютере или на VDS-сервере в интернете и собирать на нем данные с контроллеров.
Вы можете создать отдельный брокер на компьютере или на VDS-сервере в интернете и собирать на нем данные с контроллеров.


Инициировать соединение будет контроллер, поэтому контроллеру не нужен «белый» IP-адрес. Если контроллеров несколько, вы можете разделить данные от них на брокере, для этого в настройках моста укажите для каждого контроллера отдельный корневой топик.
Инициировать соединение будет контроллер, поэтому контроллеру не нужен «белый» IP-адрес. Если контроллеров несколько, вы можете разделить данные от них на брокере, для этого в настройках моста укажите для каждого контроллера отдельный корневой топик.
=== Установка брокера === <!--T:223-->
=== Установка брокера ===
#Установите <code>mosquitto</code>:
#Установите <code>mosquitto</code>:
#:<syntaxhighlight lang="bash">
#:<syntaxhighlight lang="bash">
Строка 440: Строка 386:
Брокер установлен и доступен с контроллера. Для подключения нужно ввести логин и пароль.
Брокер установлен и доступен с контроллера. Для подключения нужно ввести логин и пароль.


=== Настройка моста на контроллере === <!--T:224-->
=== Настройка моста на контроллере ===


<!--T:225-->
Создайте файл конфигурации моста, для этого:
Создайте файл конфигурации моста, для этого:
# Создайте файл <code>/etc/mosquitto/conf.d/bridge1.conf</code>
# Создайте файл <code>/etc/mosquitto/conf.d/bridge1.conf</code>
Строка 458: Строка 403:
remote_password wbpassword
remote_password wbpassword


<!--T:226-->
topic /temp1/# both 2 /devices /controller
topic /temp1/# both 2 /devices /controller
</syntaxhighlight>
</syntaxhighlight>


<!--T:227-->
Содержимое топика <code>/devices/temp1/#</code> контроллера будет отображаться на брокере в <code>/controller</code>. Вместо <code>/controller</code> можете указать уникальное имя контроллера, например, серийный номер.
Содержимое топика <code>/devices/temp1/#</code> контроллера будет отображаться на брокере в <code>/controller</code>. Вместо <code>/controller</code> можете указать уникальное имя контроллера, например, серийный номер.
</translate>