Skip to content

Latest commit

 

History

History

ThinkingHome.Plugins.Mqtt

ThinkingHome.Plugins.Mqtt

NuGet Pre Release

MqttPlugin

Предоставляет возможность публиковать и получать MQTT сообщения.

При старте плагин подключается к MQTT брокеру, заданному в настройках и подписывается на указанные каналы. При появлении сообщений в прослушиваемых каналах плагин генерирует события.

Конфигурация

Вы можете настраивать параметры подключения к MQTT брокеру и список каналов, в которых нужно обрабатывать сообщения.

{
    "plugins": {

        ...

        "ThinkingHome.Plugins.Mqtt.MqttPlugin": {
            "host": "localhost",
            "port": 1883,
            "login": "",
            "password": "",
            "topics": ["#", "$devices/#"]
        }
    }
}

API

void Publish(string topic, byte[] payload, bool retain = false)

Публикует сообщение в указанном канале.

Параметры

  • 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);
    }
}

void Publish(string topic, string payload, bool retain = false)

Публикует сообщение в указанном канале. Работает полностью аналогично предыдущему методу, но данные передаются в виде строки. Строка с данными будет преобразована в набор байтов (кодировка UTF8).

Пример

public class MyPlugin : PluginBase
{
    private readonly MqttPlugin mqtt;
    
    private void MyMethod()
    {
        mqtt.Publish("myhome/kitchen/temperature", "value=12", false);
    }
}

void Publish(string topic, Buffer payload, bool retain = false)

Публикует сообщение в указанном канале. Работает полностью аналогично предыдущему методу, но данные передаются в виде объекта Buffer. Метод предназначен для использования в сценариях.

Пример

public class MyPlugin : PluginBase
{
    private readonly MqttPlugin mqtt;
    
    private void MyMethod()
    {
        Buffer payload = ...
        
        mqtt.Publish("myhome/kitchen/temperature", payload, false);
    }
}

[MqttMessageHandler]

Вы можете отметить методы своего плагина атрибутом 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}");
}

API сценариев

mqttPublishString

Публикует MQTT сообщение в заданном канале. Данные для сообщения задаются строкой (будет преобразована в массив байтов, кодировка UTF8).

Пример

host.api.mqttPublishString('myhome/kitchen/temperature', 'value=31', false);

mqttPublishBuffer

Публикует MQTT сообщение в заданном канале. Данные для сообщения задаются объектом Buffer.

Пример

var buffer = ...

host.api.mqttPublishBuffer('myhome/kitchen/temperature', buffer, false);

Сценарные события

mqtt:message:received

Сценарное событие 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"}'