IoT (Internet of Things) в 1С или как подружить 1С с ESP32 при помощи MQTT-брокера |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2020-07-05 12:05 Что делать, если надо подключить удалённое устройство к серверу 1С, но ни устройство, ни сервер 1С нельзя "светить" наружу? А если таких устройств десятки или сотни по всей стране? Ответ: Использовать промежуточный сервис, который будет пересылать данные между сервером 1С и устройствами. Такие функции замечательно выполняет MQTT-брокер, но вот не задача, 1С не умеет с ним работать. А теперь подробности. Чтобы решить это недоразумение, я написал скрипт на Node.JS, который при запуске выполняет функцию моста между MQTT-брокером и 1С сервером. Схема взаимодействия такая:
Для работы скрипта требуется установить Node.js. Писать инструкцию по установке я не буду, в интернете их полно, кроме самого Node.js понадобиться ещё и менеджер пакетов npm для установки дополнительных библиотек. Создаём каталог, где будут лежать все файлы для скрипта, например: "c:mqtt_over_http" Далее установим необходимые библиотеки, для это в командной строке (cmd.exe), находясь в созданном каталоге, выполним следующие команды:
Видео с процессом установки библиотек
Теперь приступим к самому скрипту. Сохраняем его в файл, например: "c:mqtt_over_httpserver.js" Текст скрипта на Node.js require('dotenv').config(); constconfig = { 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 } } constmqtt = require('mqtt'); constexpress = require('express') constapp = express() constbodyParser = require('body-parser'); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended:true })); constclient = mqtt.connect(config.mqtt.server, config.mqtt.options); //handle incoming messages client.on('message',function(topic, msg, packet){ varreq = 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 functionpublish(topic,msg,options){ if (client.connected == true){ client.publish(topic,msg,options); } } app.post('/subscribe', (request, response) => { vartopic = request.body.topic; varqos = request.body.qos; if (typeoftopic == "undefined") { response.status(400).send('topic not specified'); } elseif (typeofqos == "undefined") { response.status(400).send('qos not specified'); } else { client.subscribe(topic,{qos:qos}); response.status(200).send(); } }) app.post('/publish', (request, response) => { vartopic = request.body.topic; varmsg = request.body.msg; varretain = request.body.retain; varqos = request.body.qos; if (typeoftopic == "undefined") { response.status(400).send('topic not specified'); } elseif (typeofmsg == "undefined") { response.status(400).send('msg not specified'); } elseif (typeofretain == "undefined") { response.status(400).send('retain not specified'); } elseif (typeofqos == "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-брокера, я в примере использовал бесплатный сервер HTTP_SERVERPORT=3000 // порт, который будет слушать скрипт для входящих от 1С запросов Таким должен получиться каталог со скриптом: Готово, теперь можно запускать.
Запущенный скрипт Скрипт работает и может принять запрос на подписку. В качестве примера устройств, которые будет обмениваться информацией с 1С, были выбраны ESP32 с WiFi на борту. На платы установлена RTOS (Mongoose-OS) в ней уже есть библиотеки для работы с MQTT-брокером и для примера я буду управлять вcтроенным синим светодиодом. В архив к этой статье я прикреплю прошивку, которую можно прошить. Алгоритм прошивки следующий: В программе mos.exe переходим в каталог с прошивкой (в примере C:/mos/app1)
Процесс прошивки
Сделаем конфигурацию, которая будет демонстрировать пример взаимодействия. Для этого в конфигурации создадим и опубликуем HTTP-сервис c функцией принимающей сообщения и регистр сведений, который будет хранить последнее сообщение в топике: И панель управления нашими платами: Теперь всё готово. Задержка между событиями возникает из-за того, что обмен происходит через сервер, а клиент получает ответы только по "таймеру", но события на сервере возникают моментально, так-что реагировать на них можно оперативно. Материал из статьи не претендует на использование его в продуктивных средах "из коробки", но для возможного варианта архитектуры очень может пригодиться. Источник: infostart.ru Комментарии: |
|