MQTT протокол

24-05-2022

(UPD) - Обновление конфигурации.

MQTT или Message Queue Telemetry Transport – это легкий, компактный и открытый протокол обмена данными созданный для передачи данных на удалённых локациях, где требуется небольшой размер кода и есть ограничения по пропускной способности канала.

Брокер MQTT в основном отвечает за получение всех сообщений, отправленных по этому протоколу, их фильтрацию, определение получателей и передачу их конечным устройствам.

Брокеров достаточно много, установим один из самых популярных – Mosquitto MQTT Broker. Он очень прост в установке, конфигурации и использовании.

Выполняем:

sudo apt-get update
sudo apt-get install mosquitto mosquitto-clients

Откроем новый терминал. Запустим в новом терминале команду mosquitto_sub, чтобы подписаться на тему:

mosquitto_sub -h localhost -t test

Флаг -h указывает имя хоста сервера MQTT, флаг -t - тему. После запуска команды на экране не появится вывода, поскольку mosquitto_sub ждет получения сообщений. В первом терминале публикуем сообщение:

mosquitto_pub -h localhost -t test -m "hello world"

Команда mosquitto_pub использует те же флаги, что и mosquitto_sub, но в этот раз нужен флаг -m (он позволяет ввести текст сообщения). Нажимаем Enter, и в другом терминале появится MQTT-сообщение "hello world".

Теперь настроим парольную аутентификацию.

Запустим утилиту mosquitto_passwd для создания файла паролей. Эта команда предложит ввести пароль для указанного пользователя и поместит его в файл /etc/mosquitto/passwd.

sudo mosquitto_passwd -c /etc/mosquitto/passwd usermqtt

В файл конфигурации Mosquitto добавим информацию о новом файле:

sudo nano /etc/mosquitto/conf.d/default.conf

На экране появится пустой файл. Вводим в него:

allow_anonymous false
password_file /etc/mosquitto/passwd

listener 1883 0.0.0.0

В конце файла нужно обязательно оставить пустую строку. Строка allow_anonymous false блокирует анонимных пользователей. Строка password_file задает путь к файлу паролей. Строка listener 1883 0.0.0.0 позволяет слушать стандартный порт MQTT по любому адресу. Сохраняем настройки, перезапускаем Mosquitto и проверяем новые настройки:

sudo systemctl restart mosquitto

Читаем тестовый топик:

mosquitto_sub -h localhost -t test -u "usermqtt" -P "passmqtt"

Публикуем тестовый топик:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "usermqtt" -P "passmqtt"

Также можно публиковать топик по локальному сетевому адресу:

mosquitto_pub -h 10.150.10.150 -t "test" -m "hello world" -u "usermqtt" -P "passmqtt"

Дополнительные статьи:

Напишем скрипт на Python, который будет публиковать данные по использованию процессора, памяти и диска. Установим необходимые библиотеки:

pip install psutil
pip install paho-mqtt

Psutil - это кросс-платформенная библиотека Python, используемая для доступа к системным деталям и утилитам процессов. Она используется для отслеживания использования различных ресурсов в системе.

Paho - библиотека клиента MQTT Python Eclipse Paho.

Код скрипта:

import time
import psutil
from paho.mqtt import client as mqtt_client

broker = '10.150.10.150'
port = 1883
client_id = f'server'
username = 'usermqtt'
password = 'passmqtt'

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client

def publish(client):
    while True:
        time.sleep(5)
        topic = 'server/cpu/percent'
        msg = psutil.cpu_percent()
        result = client.publish(topic, msg)
        topic = 'server/memory/percent'
        msg = psutil.virtual_memory()[2]
        result = client.publish(topic, msg)
        topic = 'server/disk/disk_usage'
        msg = psutil.disk_usage('/')[3]
        result = client.publish(topic, msg)

def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)

if __name__ == '__main__':
    run()

Просмотрим подробный вывод:

mosquitto_sub -h localhost -t "#" -u "usermqtt" -P "passmqtt" -v

server/cpu/percent 8.0
server/memory/percent 90.6
server/disk/disk_usage 92.3

Данный скрипт можно добавить в CRON.

Дополнительные статьи:

Пришло время настроить MQTT и Home Assistant. Для установки переходим в Настройки->Дополнения->Магазин дополнений и выбираем Mosquitto broker.

Если система установлена по статье Установка Home Assistant Supervised, то достаточно установить только дополнение Mosquitto broker, сервер устанавливать не требуется.

MQTT

Устанавливаем, включаем - Перезапускать дополнение при сбоях. Настраиваем конфигурацию.

Можно использовать тех пользователей, которые есть в системе, но лучше создать отдельного пользователя.

MQTT

Сохраняем, запускаем. Переходим в Настройки->Устройства и службы. На вкладке Интеграции видим:

MQTT

Нажимаем Настроить. Соглашаемся, получаем подключенную интеграцию. Вновь нажимаем Настроить.

MQTT

Выбираем RE-CONFIGURE MQTT.

MQTT

Нажимаем Далее.

MQTT

Отмечаем Разрешить обнаружение, остальное оставляем по умолчанию.

MQTT

Переходим в редактор и в файл includes/sensor/system.yaml добавим новые сенсоры:

- platform: mqtt
  name: "Server CPU load"
  icon: "mdi:cpu-64-bit"
  expire_after: 60
  unit_of_measurement: "%"
  state_topic: "server/cpu/percent"

- platform: mqtt
  name: "Server Memory load"
  icon: "mdi:memory"
  expire_after: 60
  unit_of_measurement: "%"
  state_topic: "server/memory/percent"

- platform: mqtt
  name: "Server Disk load"
  icon: "mdi:harddisk"
  expire_after: 60
  unit_of_measurement: "%"
  state_topic: "server/disk/disk_usage"

Изменился формат конфигурации элементов MQTT, настроенных вручную. Старый формат, в котором конфигурации размещаются под sensor ключом платформы, больше не должен использоваться и устарел.

Новый вариант добавления датчиков в файл configuration.yaml:

mqtt:
  sensor:
    - name: "Server CPU load"
      icon: "mdi:cpu-64-bit"
      expire_after: 60
      unit_of_measurement: "%"
      state_topic: "server/cpu/percent"

    - name: "Server Memory load"
      icon: "mdi:memory"
      expire_after: 60
      unit_of_measurement: "%"
      state_topic: "server/memory/percent"

    - name: "Server Disk load"
      icon: "mdi:harddisk"
      expire_after: 60
      unit_of_measurement: "%"
      state_topic: "server/disk/disk_usage"

Проверим конфигурацию в Панель разработчика->YAML:

MQTT

Перезапускаем Home Assistant. Или:

Некоторые компоненты Home Assistant можно перезагрузить без необходимости перезапуска всей системы. При нажатии на одну из приведенных ниже опций выгружается текущая конфигурация YAML этой опции и загружается новая.

Нажимаем - Объекты интеграции "MQTT", настроенные вручную.

MQTT

Результат на вкладке - Обзор.

Ссылки по теме: