Перейти к основному содержимому

Протокол MQTT в Eclipse 4diac

MQTT (Message Queuing Telemetry Transport) — лёгкий протокол pub/sub для IoT и промышленного мониторинга. Широко используется для передачи данных с датчиков в облако или SCADA-системы.

Когда использовать MQTT

✅ Телеметрия с датчиков в реальном времени ✅ Интеграция с облачными платформами (AWS IoT, Azure IoT Hub, Thingsboard) ✅ Много устройств → один брокер ✅ Ненадёжные или медленные каналы связи ❌ Не подходит для синхронных команд (лучше OPC-UA)

Требования

  • MQTT-брокер: Eclipse Mosquitto (рекомендуется), HiveMQ, EMQX
  • FORTE собранный с -DFORTE_COM_MQTT=ON

Установка Mosquitto-брокера

# Ubuntu / Debian
sudo apt install mosquitto mosquitto-clients
sudo systemctl enable mosquitto

Публикация данных (PUBLISH)

Структура FB:

         ┌──────────────────────────┐
INIT ──►│ │──► CNF
REQ ──►│ PUBLISH_1 │
│ ID = "mqtt://broker │
│ #factory/temp/sensor1" │
│ SD_1: REAL │
└──────────────────────────┘

Пример применения:

E_CYCLE(T#5s) ──EO──► SENSOR_READ ──EO──► PUBLISH_1
temperature ──────► SD_1

Параметры PUBLISH_1:

ID = "mqtt://192.168.1.100#factory/line1/temperature"
SD_1 = (значение температуры в REAL)

Формат параметра ID для MQTT:

mqtt://[username:password@]hostname[:port]#topic[/path]

Примеры:

mqtt://localhost#sensors/temp           # локальный брокер
mqtt://user:pass@broker.io:1883#prod # с аутентификацией
mqtt://192.168.1.100#factory/line1/rpm # по IP

Подписка на данные (SUBSCRIBE)

Структура FB:

         ┌──────────────────────────┐
INIT ──►│ │──► CNF
│ SUBSCRIBE_1 │──► IND
│ ID = "mqtt://broker │
│ #commands/actuator1" │
│ RD_1: STRING │
└──────────────────────────┘

При получении сообщения срабатывает событие IND, а RD_1 содержит значение.

Качество обслуживания (QoS)

FORTE поддерживает все уровни QoS:

QoSГарантияПрименение
0Не более 1 раза (fire & forget)Высокочастотная телеметрия
1Не менее 1 раза (с подтверждением)Команды управления
2Ровно 1 раз (двойное подтверждение)Критические данные

Уровень QoS задаётся в параметре ID:

mqtt://broker#topic[qos=1]

Пример: Мониторинг температуры

Полная система из 3 FB:

E_CYCLE(5s) ──►[TEMP_SENSOR]──────►[PUBLISH_1]
temperature(REAL) ──► SD_1

ID = "mqtt://mqtt.factory.local#monitoring/room1/temp"

Проверка в командной строке:

# Подписаться и смотреть данные
mosquitto_sub -h 192.168.1.100 -t "monitoring/room1/temp" -v

# Ожидаемый вывод:
monitoring/room1/temp 23.5
monitoring/room1/temp 23.7
monitoring/room1/temp 23.4

Безопасность

Для продакшн-систем обязательно настройте:

# /etc/mosquitto/mosquitto.conf
listener 8883
cafile /certs/ca.crt
certfile /certs/server.crt
keyfile /certs/server.key
require_certificate false
allow_anonymous false
password_file /etc/mosquitto/passwd

Подключение с TLS в FORTE:

mqtts://user:pass@broker.io:8883#topic   # mqtts = MQTT over TLS

Интеграция с Thingsboard

Thingsboard — популярная IoT-платформа для визуализации:

FORTE PUBLISH ──[MQTT]──► Thingsboard
SD_1 = {"temperature": 23.5}
topic = "v1/devices/me/telemetry"
ID = "mqtt://demo.thingsboard.io#v1/devices/me/telemetry"
Токен устройства

В Thingsboard используйте токен устройства как имя пользователя: mqtt://ACCESS_TOKEN@demo.thingsboard.io#v1/devices/me/telemetry

Следующий шаг

  • Modbus TCP — интеграция с ПЛК и датчиками по Modbus
  • HTTP API — отправка данных в REST-сервисы