Настройка работы контроллера TouchOn через MQTT

Материал из Touchon

Для того, чтобы связать контроллер 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("10.35.16.1", 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