В современной автоматизации зданий и производственных процессов часто возникает необходимость связать учетную систему 1С с реальным оборудованием: датчиками, реле, лампочками и исполнительными механизмами. Одним из наиболее популярных протоколов для таких задач является MQTT (Message Queuing Telemetry Transport). В этой статье мы детально разберем, как наладить взаимодействие между 1С и популярным контроллером Wiren Board, рассмотрим типичные ошибки начинающих и изучим программные способы управления устройствами. При комплексной автоматизации можно воспользоваться готовой конфигурацией для управления датчиками и реле умного дома на платформе 1С.
Разберем типичную ситуацию: программист 1С, привыкший к работе с HTTPСоединение или прямыми TCP/IP сокетами, пытается подключиться к MQTT-брокеру через обычный telnet или браузер. Зачастую это приводит к ошибке 403 Forbidden или потере соединения. Проанализируем причину: современные контроллеры, такие как Wiren Board, используют библиотеку libwebsockets для работы веб-интерфейса. Ошибка 403 возникает потому, что вы пытаетесь постучаться на порт, ожидающий специфический протокол (например, WebSockets), обычным HTTP-запросом без нужных заголовков.
Важно понимать, что MQTT — это не HTTP. Он работает по принципу "Издатель-Подписчик" через промежуточный узел — брокер. Чтобы работать с ним эффективно, нам понадобятся специализированные инструменты и методы.
Прежде чем писать код в 1С, нам необходимо убедиться, что контроллер доступен и мы правильно понимаем структуру его данных. Для этого мы рекомендуем использовать бесплатную утилиту MQTT Explorer. Рассмотрим алгоритм работы с ней:
1883./devices/.Проанализируем структуру топиков Wiren Board. Каждое устройство имеет свои элементы управления в ветке controls. Например, путь к реле может выглядеть так: /devices/wb-gpio/controls/EXT1_ON1. Именно в эти пути мы будем отправлять значения "0" или "1" для управления.
Поскольку в платформе 1С на данный момент отсутствует нативная поддержка протокола MQTT (в отличие от FTP или HTTP), самым быстрым и надежным способом "завести" систему будет использование внешней консольной утилиты mosquitto_pub. Она входит в состав пакета Mosquitto и позволяет отправить сообщение в брокер одной командой в командной строке. Для практической реализации обмена данными с контроллерами можно использовать решение для интеграции 1С с микроконтроллерами через MQTT-брокер.
Разберем по шагам, как реализовать это в коде 1С. Для начала создадим универсальную процедуру, которая будет принимать имя устройства и нужное состояние.
Процедура УправлениеУстройством(ИмяУстройства, Значение)
// Путь к исполняемому файлу mosquitto_pub на сервере или клиенте
ПутьКПрограмме = "C:\Program Files\Mosquitto";
// IP-адрес вашего контроллера Wiren Board
АдресБрокера = "192.168.1.100";
// Формируем текст команды
// -h: хост, -t: топик (путь), -m: сообщение (значение)
ШаблонКоманды = "mosquitto_pub -h %1 -t ""/devices/wb-gpio/controls/%2/on"" -m %3";
ТекстКоманды = СтрШаблон(ШаблонКоманды, АдресБрокера, ИмяУстройства, Значение);
// Запускаем команду через системную оболочку
КомандаСистемы(ТекстКоманды, ПутьКПрограмме);
КонецПроцедуры
Обратите внимание на важный нюанс: в Wiren Board для управления физическим выходом нужно отправлять значение в топик, который заканчивается суффиксом /on. Если вы отправите значение просто в основной топик устройства, оно может не сработать, так как контроллер ожидает команду именно в "подтопик" управления.
Рассмотрим пример вызова этой процедуры для включения трех лампочек:
Процедура Поморгать()
Состояние = "1"; // Включаем
УправлениеУстройством("EXT1_ON1", Состояние);
УправлениеУстройством("EXT1_ON2", Состояние);
УправлениеУстройством("EXT1_ON3", Состояние);
КонецПроцедуры
Использование КомандаСистемы удобно для простых задач (подать сигнал при проезде оборудования), но имеет свои минусы: при каждом вызове порождается новый процесс в ОС, что замедляет работу при массовой отправке данных и может приводить к "фризам" интерфейса. Рассмотрим альтернативные варианты развития системы:
ВнешнееСобытие.HTTPСоединение.Проанализируем специфику работы брокера внутри Wiren Board, которую нужно учитывать при разработке на 1С:
Retained сообщения: Почти все данные датчиков в Wiren Board публикуются с флагом retained. Это означает, что брокер запоминает последнее состояние. Когда ваша 1С (через компоненту или сервис) подпишется на топик, она мгновенно получит последнее известное значение, не дожидаясь, пока датчик пришлет новое обновление.
Уровни QoS (Quality of Service): Протокол поддерживает три уровня гарантии доставки. QoS 0 — "отправил и забыл", QoS 1 — гарантированная доставка (сообщение может дублироваться), QoS 2 — строго одна доставка. Для включения лампочки обычно достаточно QoS 0 или 1.
Самая сложная часть — заставить 1С "слушать" брокер. Поскольку 1С — это система, работающая по запросу, она не может просто так "ждать" данные. Рассмотрим, как это реализовать:
Если мы используем внешнюю компоненту, мы должны подписаться на нужные топики при старте системы. Когда в топике (например, от датчика движения или кнопки) появится новое значение, компонента сгенерирует ВнешнееСобытие. Мы перехватим его в модуле управляемого приложения:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "MQTT_Broker" Тогда
// Разбираем данные (обычно это путь топика и значение)
// Например: /devices/wb-gpio/controls/Input1 = 1
ОбработатьСигналДатчика(Событие, Данные);
КонецЕсли;
КонецПроцедуры
Если же мы используем метод с mosquitto_sub, то нам придется запускать его в фоновом задании 1С, которое будет постоянно опрашивать текстовый файл или базу данных, куда утилита записывает приходящие значения. Однако мы рекомендуем использовать внешние компоненты или HTTP-шлюзы для этих целей.
Таким образом, мы рассмотрели путь от простого вызова командной строки до понимания архитектуры MQTT. Начните с использования mosquitto_pub и MQTT Explorer для решения вашей текущей задачи (сигнал на лампочку), а при усложнении проекта переходите к использованию Native API компонентов для полноценного двухстороннего обмена.