Настройка работы контроллера TouchOn через MQTT: различия между версиями

Материал из Touchon
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
Для того, чтобы связать контроллер TouchOn с сервером по протоколу MQTT, необходимо выбрать опцию MQTT в поле SRV Type.
Для того, чтобы связать контроллер TouchOn с сервером по протоколу MQTT, необходимо выбрать опцию MQTT в поле SRV Type.
Порт 1883 пропишется автоматически.
Порт 1883 пропишется автоматически.
[[Файл:CTR web-conf-mqtt.jpg|300px|безрамки|центр]]
[[Файл:CTR web-conf-mqtt.jpg|300px|безрамки|центр]]
После старта устройство соединяется с сервером и подписывается на топик: megad/14/cmd, который используется для передачи команд контроллеру.
 
После старта устройство соединяется с сервером и подписывается на топик: '''megad/14/cmd''', который используется для передачи команд контроллеру.
Здесь 14 - последний байт IP адреса устройства.
Здесь 14 - последний байт IP адреса устройства.
Если прописан MegadID, то используется он.
Если прописан MegadID, то используется он.
Например, если в качестве MegadID указан "test", то контроллер подпишется на топик: test/cmd
Например, если в качестве MegadID указан "test", то контроллер подпишется на топик: '''test/cmd'''
Это же правило работает и при публикации в топиках информации о портах.
Это же правило работает и при публикации в топиках информации о портах.
  1486454199: New connection from 10.35.16.12 on port 1883.
  1486454199: New connection from 10.35.16.12 on port 1883.
Строка 16: Строка 18:
<br>
<br>
По умолчанию контроллер соединяется с брокером без авторизации.
По умолчанию контроллер соединяется с брокером без авторизации.
Если в поле Passwd указан пароль, используется авторизация. Логином является Megad-ID, который прописывается в соответствующей вкладке.
Если в поле '''Passwd''' указан пароль, используется авторизация. Логином является Megad-ID, который прописывается в соответствующей вкладке.
Опция Retain устанавливает соответствующий флаг в публикуемых сообщениях. Данный флаг указывает MQTT-брокеру сохранять последнее сообщение в каждом топике. Если серверное ПО перезагружалось или какое-то время не работало, то при запуске брокер отправит программному обеспечению опубликованные контроллером сообщения. По одному последнему сообщению на каждый топик.
Опция '''Retain''' устанавливает соответствующий флаг в публикуемых сообщениях. Данный флаг указывает MQTT-брокеру сохранять последнее сообщение в каждом топике. Если серверное ПО перезагружалось или какое-то время не работало, то при запуске брокер отправит программному обеспечению опубликованные контроллером сообщения. По одному последнему сообщению на каждый топик.


В данный момент при срабатывании входа устройство публикует информацию в топике: megad/14/n, где n - номер порта.
В данный момент при срабатывании входа устройство публикует информацию в топике: megad/14/n, где n - номер порта.
Строка 62: Строка 64:
Для протокола MQTT контроллер поддерживает технологию "Last Will and Testament". При разрыве соединения контроллера с брокером (по любой причине) последний будет публиковать в топик megad/14/status (а если указан megadID, то [megadid]/status) сообщение с текстом "Offline". Таким образом, сервер может своевременно получить информацию о недоступности контроллера. В то же время при подключении к брокеру контроллер будет публиковать в этот же топик сообщение с текстом "Online".
Для протокола MQTT контроллер поддерживает технологию "Last Will and Testament". При разрыве соединения контроллера с брокером (по любой причине) последний будет публиковать в топик megad/14/status (а если указан megadID, то [megadid]/status) сообщение с текстом "Offline". Таким образом, сервер может своевременно получить информацию о недоступности контроллера. В то же время при подключении к брокеру контроллер будет публиковать в этот же топик сообщение с текстом "Online".
<br><br>
<br><br>
Особенности настройки MQTT-брокера
<big>Особенности настройки MQTT-брокера</big>
<br><br>
<br><br>
Необходимо настроить брокер так, чтобы он автоматически не склеивал пакеты, поступающие со стороны серверного ПО.
Необходимо настроить брокер так, чтобы он автоматически не склеивал пакеты, поступающие со стороны серверного ПО.
Для брокера mosquitto необходимо настроить опцию set_tcp_nodelay.
Для брокера mosquitto необходимо настроить опцию '''set_tcp_nodelay'''.
  # Disable Nagle's algorithm on client sockets. This has the effect of reducing
  # Disable Nagle's algorithm on client sockets. This has the effect of reducing
  # latency of individual messages at the potential cost of increasing the number
  # latency of individual messages at the potential cost of increasing the number
  # of packets being sent.
  # of packets being sent.
  set_tcp_nodelay true
  set_tcp_nodelay true

Версия от 15:12, 9 декабря 2025

Для того, чтобы связать контроллер TouchOn с сервером по протоколу MQTT, необходимо выбрать опцию MQTT в поле SRV Type. Порт 1883 пропишется автоматически.

После старта устройство соединяется с сервером и подписывается на топик: megad/14/cmd, который используется для передачи команд контроллеру. Здесь 14 - последний байт IP адреса устройства. Если прописан MegadID, то используется он. Например, если в качестве MegadID указан "test", то контроллер подпишется на топик: test/cmd Это же правило работает и при публикации в топиках информации о портах.

1486454199: New connection from 10.35.16.12 on port 1883.
1486454199: New client connected from 10.35.16.12 as megad-14 (c1, k30).
1486454199: Sending CONNACK to megad-14 (0, 0)
1486454200: Received SUBSCRIBE from megad-14
1486454200:     megad/14/cmd (QoS 0)
1486454200: megad-14 0 megad/14/cmd
1486454200: Sending SUBACK to megad-14


По умолчанию контроллер соединяется с брокером без авторизации. Если в поле Passwd указан пароль, используется авторизация. Логином является Megad-ID, который прописывается в соответствующей вкладке. Опция Retain устанавливает соответствующий флаг в публикуемых сообщениях. Данный флаг указывает MQTT-брокеру сохранять последнее сообщение в каждом топике. Если серверное ПО перезагружалось или какое-то время не работало, то при запуске брокер отправит программному обеспечению опубликованные контроллером сообщения. По одному последнему сообщению на каждый топик.

В данный момент при срабатывании входа устройство публикует информацию в топике: megad/14/n, где n - номер порта. Например, при срабатывании P0 топик будет megad/14/0

1486454392: Received PUBLISH from megad-14 (d0, q0, r0, m0, 'megad/14/0', ... (22 bytes))

Передача информации происходит в JSON-формате

{"port":"0","cnt":"1"}

Соответственно "сервер", подписанный на megad/14/0 и получивший информацию о событии, публикует сообщение в топике megad/14/cmd Формат сообщений, которые публикуются в топик, соответствует стандартным командам сценариев: 7:2;8:2 (пример)

1486454501: Received PUBLISH from megad-14 (d0, q0, r0, m0, 'megad/14/0', ... (22 bytes))
1486454501: Sending PUBLISH to server (d0, q0, r0, m0, 'megad/14/0', ... (22 bytes))
1486454501: Received PUBLISH from server (d0, q0, r0, m0, 'megad/14/cmd', ... (7 bytes))
1486454501: Sending PUBLISH to megad-14 (d0, q0, r0, m0, 'megad/14/cmd', ... (7 bytes))

В качестве "брокера" можно использовать mosquitto. В качестве "сервера" можно использовать PHP-скрипт с библиотекой phpMQTT.php

Вот грубый пример такого "сервера".

<?php
require("phpMQTT.php");
$mqtt = new phpMQTT("192.168.0.250", 1883,  "server");
if(!$mqtt->connect()){
  exit(1);
}
$topics['megad/14'] = array("qos"=>0,  "function"=>"procmsg");
$mqtt->subscribe($topics,0);
while($mqtt->proc()){}
$mqtt->close();
function procmsg($topic,$msg){
  global $mqtt;
     echo "Msg Recieved: ".date("r")."Topic:{$topic}      $msg";
     $mqtt->publish("megad/14/cmd","8:2;7:2",0);
}
?>


Через протокол MQTT также можно запросить состояние порта устройства. Для этого следует отправить в топик "megad/14/cmd" (где 14 - последний байт IP-адреса) команду вида "get:10" (где 10 - номер порта). Устройство в ответ на полученный запрос опубликует в топике megad/14/10 следующее: {"port":"10","value":"ON"} В поле "value" в текущий момент содержится то, что содержалось бы в ответе на HTTP GET-запрос. В ситуации, когда к порту подключен датчик температуры, ответ будет примерно таким: {"port":"32","value":"temp:26.31"}

Начиная с версии 4.36b4 контроллер может принимать команды, отправленные в топик "cmd", в формате JSON

{"port":6} // получить состояние порта P6
{"port":10,"value":"ON"} // включить порт P10


Для протокола MQTT контроллер поддерживает технологию "Last Will and Testament". При разрыве соединения контроллера с брокером (по любой причине) последний будет публиковать в топик megad/14/status (а если указан megadID, то [megadid]/status) сообщение с текстом "Offline". Таким образом, сервер может своевременно получить информацию о недоступности контроллера. В то же время при подключении к брокеру контроллер будет публиковать в этот же топик сообщение с текстом "Online".

Особенности настройки MQTT-брокера

Необходимо настроить брокер так, чтобы он автоматически не склеивал пакеты, поступающие со стороны серверного ПО. Для брокера mosquitto необходимо настроить опцию set_tcp_nodelay.

# Disable Nagle's algorithm on client sockets. This has the effect of reducing
# latency of individual messages at the potential cost of increasing the number
# of packets being sent.
set_tcp_nodelay true