ThinkingHome.Plugins.Mqtt
Предоставляет возможность публиковать и получать MQTT сообщения.
При старте плагин подключается к MQTT брокеру, заданному в настройках и подписывается на указанные каналы. При появлении сообщений в прослушиваемых каналах плагин генерирует события.
Вы можете настраивать параметры подключения к MQTT брокеру и список каналов, в которых нужно обрабатывать сообщения.
{
"plugins": {
...
"ThinkingHome.Plugins.Mqtt.MqttPlugin": {
"host": "localhost",
"port": 1883,
"login": "",
"password": "",
"topics": ["#", "$devices/#"]
}
}
}
Публикует сообщение в указанном канале.
string topic
- название канала.byte[] payload
- передаваемые данные.bool retain
- признак "хранить сообщение". Если передатьtrue
, брокер сохранит сообщение и при следующей подписке на этот топик сразу отправит его подписчику.
public class MyPlugin : PluginBase
{
private readonly MqttPlugin mqtt;
private void MyMethod()
{
mqtt.Publish("myhome/kitchen/temperature", new byte[] {12}, false);
}
}
Публикует сообщение в указанном канале. Работает полностью аналогично предыдущему методу, но данные передаются в виде строки. Строка с данными будет преобразована в набор байтов (кодировка UTF8).
public class MyPlugin : PluginBase
{
private readonly MqttPlugin mqtt;
private void MyMethod()
{
mqtt.Publish("myhome/kitchen/temperature", "value=12", false);
}
}
Публикует сообщение в указанном канале. Работает полностью аналогично предыдущему методу, но данные передаются в виде объекта Buffer
. Метод предназначен для использования в сценариях.
public class MyPlugin : PluginBase
{
private readonly MqttPlugin mqtt;
private void MyMethod()
{
Buffer payload = ...
mqtt.Publish("myhome/kitchen/temperature", payload, false);
}
}
Вы можете отметить методы своего плагина атрибутом ThinkingHome.Plugins.Mqtt.MqttMessageHandlerAttribute
. Метод вашего плагина будет автоматически вызываться при получении MQTT сообщений в одном из прослушиваемых каналов.
Сигнатура метода, вызываемого по таймеру, должна соответствовать делегату ThinkingHome.Plugins.Mqtt.MqttMessageHandlerDelegate
:
public delegate void MqttMessageHandlerDelegate(string topic, byte[] payload);
string topic
- название канала, в который пришло сообщение.byte[] payload
- полученные данные.
[MqttMessageHandler]
public void HandleMqttMessage(string topic, byte[] payload)
{
var str = Encoding.UTF8.GetString(payload);
Logger.LogInformation($"{topic}: {str}");
}
Публикует MQTT сообщение в заданном канале. Данные для сообщения задаются строкой (будет преобразована в массив байтов, кодировка UTF8).
host.api.mqttPublishString('myhome/kitchen/temperature', 'value=31', false);
Публикует MQTT сообщение в заданном канале. Данные для сообщения задаются объектом Buffer
.
var buffer = ...
host.api.mqttPublishBuffer('myhome/kitchen/temperature', buffer, false);
Сценарное событие mqtt:message:received
генерируется при получени сообщения в одном из прослушиваемых каналов. В обработчик события передаются параметры:
arguments[0]
- название канала, в который пришло сообщение (string
).arguments[1]
- полученные данные (Buffer
).
var topic = arguments[0];
var text = arguments[1].ToUtf8String();
host.log.info('[MQTT MESSAGE] ' + topic + ': ' + text)
# создаем конфиг, в котором разрешаем анонимное подключение
# без этого конфига анонимно можно подключиться только с localhost
echo "listener 1883\nallow_anonymous true" > mosquitto.conf
# запускаем контейнер и кладем в него конфиг
docker run --name mosquitto -it -p 1883:1883 -p 9001:9001 -v $PWD/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
# подписка на события (в отдельной вкладке)
docker exec -i mosquitto mosquitto_sub -t '$devices/#' -v
# отправка сообщений (в отдельной вкладке)
docker exec -i mosquitto mosquitto_pub -t '$devices/1377/events' -m '{"text":"MOO"}'