IoT (Internet of Things) в 1С или как подружить 1С с ESP32 при помощи MQTT-брокера

23.05.22

Интеграция - Робототехника и умный дом (Arduino, NFC, RFID)

Что делать, если надо подключить удалённое устройство к серверу 1С, но ни устройство, ни сервер 1С нельзя "светить" наружу? А если таких устройств десятки или сотни по всей стране? Ответ: Использовать промежуточный сервис, который будет пересылать данные между сервером 1С и устройствами. Такие функции замечательно выполняет MQTT-брокер, но вот не задача, 1С не умеет с ним работать.

Скачать файлы

Наименование Файл Версия Размер
IoT (Internet of Things) в 1С или как подружить 1С с ESP32 при помощи MQTT-брокера:
.zip 10,46Mb
21
.zip 10,46Mb 21 Скачать

Что в итоге получилось можно увидеть на видео:

А теперь подробности.

Чтобы решить это недоразумение, я написал скрипт на Node.JS, который при запуске выполняет функцию моста между MQTT-брокером и 1С сервером.

Схема взаимодействия такая:

Диаграмма взаимодействия

 

Для работы скрипта требуется установить Node.js. Писать инструкцию по установке я не буду, в интернете их полно, кроме самого Node.js понадобиться ещё и менеджер пакетов npm для установки дополнительных библиотек.

 

Создаём каталог, где будут лежать все файлы для скрипта, например: "c:\mqtt_over_http"

Далее установим необходимые библиотеки, для это в командной строке (cmd.exe), находясь в созданном каталоге, выполним следующие команды:

npm install mqtt --save
npm install express --save
npm install request --save
npm install dotenv --save

 
 Видео с процессом установки библиотек

Теперь приступим к самому скрипту. Сохраняем его в файл, например: "c:\mqtt_over_http\server.js"

 
 Текст скрипта на Node.js
require('dotenv').config();

const config = {
    mqtt : {
        server : process.env.MQTT_SERVER,
        options : {
            clientId : process.env.MQTT_CLIENTID,
            username : process.env.MQTT_USERNAME,
            password : process.env.MQTT_PASSWORD,
            keepalive : 60,
            reconnectPeriod : 1000,
            clean : true            
        }
    },
    http : {
        serverport : parseInt(process.env.HTTP_SERVERPORT),
        url : process.env.HTTP_REQUESTURL,
        username : process.env.HTTP_USERNAME,
        password : process.env.HTTP_PASSWORD
    }
}
  
const mqtt = require('mqtt');
const express = require('express')
const app = express()
const bodyParser = require('body-parser');
  
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
  
const client = mqtt.connect(config.mqtt.server, config.mqtt.options);
  
//handle incoming messages
client.on('message',function(topic, msg, packet){
    
    var req = require('request');
    req.post({
        url: config.http.url,
        headers: {
            "Content-Type": "application/json"
        },
        auth : {
            username: config.http.username,
            password: config.http.password
        },
        body: {
            "topic": topic,
            "msg": msg.toString('utf8'),
            "qos": packet.qos
        },
        json: true
    });
});
  
client.on("connect",function(){ 
    console.log("connected  "+ client.connected);
})
//handle errors
client.on("error",function(error){
    console.log("Can't connect" + error);
    process.exit(1)
})
  
//publish
function publish(topic,msg,options){
  
    if (client.connected == true){
        client.publish(topic,msg,options);
    }
}
  
app.post('/subscribe', (request, response) => {   
    var topic = request.body.topic;
    var qos = request.body.qos;
    if (typeof topic == "undefined") {
        response.status(400).send('topic not specified');
    } else if (typeof qos == "undefined") {
        response.status(400).send('qos not specified');
    } else {
        client.subscribe(topic,{qos:qos});
        response.status(200).send();
    }
})
  
app.post('/publish', (request, response) => {
    var topic = request.body.topic;
    var msg = request.body.msg;
    var retain = request.body.retain;
    var qos = request.body.qos;
    if (typeof topic == "undefined") {
        response.status(400).send('topic not specified');
    } else if (typeof msg == "undefined") {
        response.status(400).send('msg not specified');
    } else if (typeof retain == "undefined") {
        response.status(400).send('retain not specified');
    } else if (typeof qos == "undefined") {
        response.status(400).send('qos not specified');
    } else {
        publish(topic, msg, {retain:retain,qos:qos});
        response.status(200).send();
    }
})

app.listen(config.http.serverport)

 

Рядом с ним необходимо создать файл ".env" (прям с таким названием, как-будто только расширение) со следующим содержимым:

 
 Содержимое файла настроек .env
MQTT_SERVER=mqtt://srv2.mqtt.4api.ru:9991 // адрес mqtt-брокера, я в примере использовал бесплатный сервер
MQTT_CLIENTID=mqqt_over_http // тут указывается Client ID, который должен быть уникальным для каждого клиента
MQTT_USERNAME=myuser // логин для подключения
MQTT_PASSWORD=mypassword // пароль для подключения

HTTP_SERVERPORT=3000 // порт, который будет слушать скрипт для входящих от 1С запросов
HTTP_REQUESTURL=http://127.0.0.1:8080/iot/hs/mqtt/publish // адрес HTTP-сервиса сервера 1С, куда будут отправляться полченные по подписке сообщения. Выполняется POST запрос с JSON-телом {topic, msg, qos}
HTTP_USERNAME=mqtt_user // имя пользователя 1С
HTTP_PASSWORD=mqtt_password // пароль пользователя 1С

 

Таким должен получиться каталог со скриптом:

Каталог скрипта

Готово, теперь можно запускать.

node c:\mqtt_over_http\server.js

 
 Запущенный скрипт

 

 

Скрипт работает и может принять запрос на подписку.

В качестве примера устройств, которые будет обмениваться информацией с 1С, были выбраны ESP32 с WiFi на борту.

На платы установлена RTOS (Mongoose-OS) в ней уже есть библиотеки для работы с MQTT-брокером и для примера я буду управлять вcтроенным синим светодиодом.

В архив к этой статье я прикреплю прошивку, которую можно прошить. Алгоритм прошивки следующий:

В программе mos.exe переходим в каталог с прошивкой (в примере C:/mos/app1)

  1. Выбираем порт для подключения (в примере COM3)
  2. Выбираем плату (в примере ESP32)
  3. Запускаем сборку прошивки: mos build
  4. Запускаем прошивку платы: mos flash
  5. Настраиваем подключение к WiFi: mos wifi mywifi 012345467 (где mywifi - имя сети, а 01234567 - пароль)
  6. Настраиваем подключение к MQTT-брокеру: mos config-set mqtt.enable=true mqtt.server=srv2.mqtt.4api.ru:9991 mqtt.user=myuser mqtt.pass=mypassword (Client ID - это серийный номер платы)
  7. И указываем, что диод, которым мы будем управлять находится на ноге 2: mos config-set board.led1.pin=2
  8. Всё
 
 Процесс прошивки

 

Сделаем конфигурацию, которая будет демонстрировать пример взаимодействия.

Для этого в конфигурации создадим и опубликуем HTTP-сервис c функцией принимающей сообщения и регистр сведений, который будет хранить последнее сообщение в топике:

И панель управления нашими платами:

Теперь всё готово.

 

Задержка между событиями возникает из-за того, что обмен происходит через сервер, а клиент получает ответы только по "таймеру", но события на сервере возникают моментально, так-что реагировать на них можно оперативно.

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

IIoT IoT ESP32 MQTT HTTP internetOfThings ИнтрнетВещей MongooseOS NodeJS

См. также

У.дача каждому 1С-нику или Умный дом для ленивых (зачеркнуто) пытливых

Робототехника и умный дом (Arduino, NFC, RFID) Бесплатно (free)

Обладая минимальными навыками инженера, вполне можно сделать «умными» относительно недорогие устройства, и управлять всей логикой на 1С. Возможности огромны: управление светом, включением-выключением розеток, автополив, сигнализация и т.д. О самостоятельной реализации в 1С нестандартной логики управления устройствами пойдет речь в статье.

29.02.2024    1938    atland    6    

25

Умный дом на 1С: это намного проще, чем кажется, и значительно лучше, чем можно предположить

Робототехника и умный дом (Arduino, NFC, RFID)

Кто сказал, что умный дом на 1С сделать невозможно? На конференции Infostart Event 2021 Moscow Premiere Юрий Лазаренко из компании «Цифровой Кот» показал, какие уникальные прикольные вещи можно делать на базе IoT (интернета вещей), где в этом всем 1С, и как это все между собой интегрируется.

19.06.2023    4094    TitanLuchs    28    

16

Мобильное приложение 1С и Умный дом. В каждый дом. Пролог

Мобильная разработка Робототехника и умный дом (Arduino, NFC, RFID) Мобильная платформа Конфигурации 1cv8 Абонемент ($m)

Хотите попробовать свои силы в разработке собственного мобильного приложения на 1С для управления светом и электроприборами в своём доме? Добро пожаловать! Хочу поделиться собственными наработками в этой области. Это будет приложение, разработанное для мобильных устройств на базе Android. Основное предназначение: управление включением/выключением устройств, работающих от сети 220 V (свет, телевизор, чайник, вентилятор, микроволновка и т.д.). Управлять будем: из приложения, голосом, на заданный промежуток времени, интенсивностью света, расписанием работы.

1 стартмани

19.12.2022    2988    osivv    8    

22

У.дача каждому 1С-нику, или умный дом для ленивых (конфигурация)

Робототехника и умный дом (Arduino, NFC, RFID) Платформа 1С v8.3 Россия Абонемент ($m)

Конфигурация для создании умных домов на базе 1С. Приложение сконструировано как сервер для устройств Arduino, к которому подключены датчики и реле (и другие исполнительные механизмы), так и для публикации мобильного приложения для управления умным домом.

1 стартмани

26.09.2022    5051    10    atland    0    

24

RFID считыватели Impinj и RRU9516

Робототехника и умный дом (Arduino, NFC, RFID) Платформа 1С v8.3 8.3.14 Конфигурации 1cv8 Россия Абонемент ($m)

Компонента для работы с RFID метками. Поддерживает считыватели Impinj 120, 220, 420. А также настольный RRU9816.

1 стартмани

24.11.2021    3637    3    pavelmael    6    

6

1С и Умный дом. Управление голосом

Робототехника и умный дом (Arduino, NFC, RFID) 8.3.6 Бесплатно (free)

Возможно ли управление устройствами умного дома из 1С, да ещё и голосом? Можно ли без умных колонок Google Home, Alexa, Алиса и иных платформ, а также без приложений от Google, Amazon и других управлять этими устройствами? Мой ответ – ДА, можно, нужно просто иметь умное устройство, имеющее возможность работы в DIY, 1С и программу распознавания голоса и взаимодействия с 1С.

04.01.2021    48568    osivv    15    

12
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. frutty 123 26.06.20 12:59 Сейчас в теме
Вам интересна эта тема? Продолжать?
vladnet; vedas; Serj1C; Ali1976; TerveRus; +5 Ответить
2. simgo83 69 27.06.20 07:53 Сейчас в теме
3. seregapolygon 15 21.07.20 11:32 Сейчас в теме
Я сейчас работаю над 1С конфигурацией - "FMEC IOT Платформа". (FMEC IOT Платформа)

Эту платформу можно использовать как универсального брокера между любым IOT устройством и 1С. Причем для интеграции можно написать пару, а может даже один http сервис и все.

Т.е. 1С-нику не нужно вообще выходить за пределы 1С. :-)
Zorro_arm; frutty; +2 Ответить
4. frutty 123 12.08.20 15:56 Сейчас в теме
(3)
Эту платформу можно использовать как универсального брокера между любым IOT устройством и 1С. Причем для интеграции можно написать пару, а может даже один http сервис и все.

очень крутое начинание!
5. papami 55 21.08.20 12:10 Сейчас в теме
Есть две темы, которые очень интересны и опробованы, но под которые нет задач. Это как раз IOT и вычисления на GPU)
Вот по IOT, коллеги, есть опыт применения реальный (без маркетинговой лабуды)?
23. Zorro_arm 08.07.22 18:03 Сейчас в теме
(5) могу привести пример например вендинг. Данные о продажах грузить в 1с сразу. Можно прикольный информер в виде цветного индикатора в офисе сделать например если продажи растут он зеленый Падают - красный-)
24. papami 55 08.07.22 21:27 Сейчас в теме
(23) Я на тот момент имел в виду реальные задачи, включая тот же MQTT. Ваши примеры решаются простыми вызовами по http(s)
На сегодня могу сказать, что на 1С (OneScript) реально запускать управление умным домом через Алису (Яндекс Диалоги). Причем код будет в облаке. Но это опять все на уровне хобби.
25. Zorro_arm 09.07.22 10:38 Сейчас в теме
(24)
(24) с точки зрения iot устройств http вызовы не такие и простые. MQTT очень упрощенный протокол котоый просто реализовать на устройствах с ограниченными ресурсами. HTTPS к тому же многие устройства iot не поддерживают из-за ограниченности ресурсов. Да и задачи для которых создан HTTP куда более объемные чем задачи iot устройств - получить принять несколько байтов данных
26. papami 55 09.07.22 20:04 Сейчас в теме
(25)
Да я в теме. Делал и то и то.
Просто, 1С штатно поддерживает http-сервисы, а MQTT - нет.
А про ресурсы под MQTT. Ну если выложите скетч для Arduino UNO, буду очень благодарен) У меня взлетело только на ESP.
27. Zorro_arm 10.07.22 10:57 Сейчас в теме
(26)
(26) ну как же ему на UNO взлететь если у него нет сетевых интерфейсов-) разве что в связки с wizznet модулем.-) Если нужно уно то покупайте ethernet shield и примеры к нему собирайте. ESP лучший и недорогой вариант при этом относительно надежный. К нему и конструкторы кода есть так что вообще писать код не нужно-)
28. papami 55 10.07.22 11:37 Сейчас в теме
(27) я именно про ресурсы. Любой вариант на уно, чтобы работал. Модуль - не проблема.
Это я к тому, что ресурсов под MQTT не хватит. А под http - вполне.
29. Zorro_arm 10.07.22 12:05 Сейчас в теме
(26)
(28) вот пример подключения uno + w5100 по mqtt - http://mediaunix.com/arduino-c-setevym-modulem-i-mqtt-v-openhab/
Отправлять с ардуино запросы легче гораздо чем разбирать ответы. mqtt проще и возможостей у него меньше чем http.
32. papami 55 12.07.22 23:35 Сейчас в теме
(29)
За это спасибо! Пробовал и не получилось. У меня не собиралось вообще. Правда мне нужно было подключаться с сертификатом.
34. Zorro_arm 13.07.22 10:20 Сейчас в теме
(32) для криптографии камень нужно помощнее чем уно-)
30. Zorro_arm 10.07.22 12:07 Сейчас в теме
(28) и вот пример библиотеки отправки и подписки что на uno + wizznet будет работать.
https://github.com/knolleary/pubsubclient
33. papami 55 12.07.22 23:37 Сейчас в теме
(30) pubsubсlient да. На esp запускал как раз
31. Zorro_arm 10.07.22 12:11 Сейчас в теме
(28) ну и вопрос в том что mqtt лучше для телеметрии использовать а разовые дела лучше и проще через http сделать. Я планировал как-то сделать устройство на esp для 1с фастфуд где оплата за покупки была по внутренним депозитным картам возможна. И для того, что бы смотреть остатки на карте сделать просто автономный считыватель с экранчиком. Вот там http как-раз самое что нужно. Ссылки в других сообщениях скинул - появятся после проврки модератором.
6. orcdunaev 28.01.21 15:55 Сейчас в теме
Добрый день!
Запускаю скрипт, но не вижу ни connected true, ни connected false, ни любого другого сообщения. Командная строка просто зависает.
Попробовал отлаживать скрипт в VS Code. Вижу, что скрипт принимает сообщения от 1С и отсылает в брокер subscribe. Но при этом не срабатывают обработчики connect и message. Т.е. скрипт, похоже, не полноценно общается с брокером.
Сменил несколько бесплатных брокеров, ситуация не меняется.
Не подскажете, в чем может быть затык?
7. frutty 123 29.01.21 12:28 Сейчас в теме
(6)
рокеров, ситуация не меняется.
Не подскажете, в чем может бы

возможно не все библиотеки установили?
14. orcdunaev 09.02.21 11:48 Сейчас в теме
(7) спасибо за ответ.
Разобрался с проблемой, это корпоративная сеть резала обращения к внешним брокерам. С локальным mosquitto все получилось.
8. Serj1C 483 29.01.21 23:13 Сейчас в теме
Максим, подскажите пожалуйста, что нужно еще установить, если ESP находятся в той же сети и я не хочу использовать сторонний брокер.
У меня все офф-лайн без интернета находятся.
11. frutty 123 01.02.21 18:29 Сейчас в теме
(8) тогда проще http использовать.
13. Serj1C 483 06.02.21 21:28 Сейчас в теме
(8) установил mosquitto.
Идеально когда много устройств и некоторые могут отваливаться.
9. Serj1C 483 01.02.21 14:42 Сейчас в теме
Зачем поднимается отдельный скрипт на node.js? почему нельзя на чистой 1С сделать соединение с брокером mqtt?
10. frutty 123 01.02.21 18:27 Сейчас в теме
(9) если у вас есть идеи как это проще сделать, то я не против узнать как.
15. orcdunaev 17.02.21 13:39 Сейчас в теме
(10) есть альтернативный вариант: 1С интегрировать с RabbitMQ с помощью бесплатной компоненты PinkRabbitMQ (ищется на инфостарте), а для RabbitMQ активировать плагин rabbitmq_mqtt. MQTT-клиенты смогут постить сообщения в Rabbit, как в MQTT-брокер. Не сказать, что этот вариант проще, но может кому пригодится...
Zorro_arm; +1 Ответить
16. skyboy13 13 26.02.21 17:44 Сейчас в теме
(10) на google можно поднять любой сервис и по api обмен
12. Serj1C 483 04.02.21 18:26 Сейчас в теме
Большое спасибо за публикацию, у меня получилось!
17. Serj1C 483 09.04.21 23:23 Сейчас в теме
(12)стабильность похрапывает. После обновления конфигурации могут перестать приходить сообщения. Причем mosquitto все сообщения видит, 1с же капризничает. Танцами с бубном иногда получается все запустить без перезагрузок
18. frutty 123 10.04.21 13:21 Сейчас в теме
(17) я не думаю что это решение без доработок можно/нужно пускать в реальные проекты.
19. Serj1C 483 13.04.21 09:58 Сейчас в теме
(18) а в какую сторону дорабатывать?
PS: Заменил файловую базу на серверную - стабильность резко улучшилась
20. Serj1C 483 15.12.21 17:31 Сейчас в теме
На серверной базе (MS SQL + Apache) работает уже более полугода. Полет нормальный.
Бывает, после нединамического обновления перестают прилетать события. Лечится полной перезагрузкой. Сочетанием перезапуска служб не особо получается оживить.
21. frutty 123 15.12.21 21:25 Сейчас в теме
(20)рад слышать что идея кому-то пригодилась.
22. SashinPapa 24.03.22 16:07 Сейчас в теме
Волшебно!
Спасибо за идею и реализацию.
Оставьте свое сообщение