SNMP TrapV2/REST API To WebSocket – это прокси сервис (SNMPTrap_REST_To_WS), позволяющий перенаправлять оповещения SNMP Trap2 (заглушки) и запросы REST API на клиента Web Socket.
SNMP Trap – обычно это push оповещения о критических событиях от сетевых и других устройств и различного вида датчиков по протоколу SNMP.
В данном случае клиентом Web Socket может выступать 1С:Предприятие 8.3.27. Web Socket клиент поддерживается как на клиентской стороне, так и на серверной стороне 1С.
Использование SNMPTrap_REST_To_WS позволяет 1С принимать данные SNMP TrapV2, так и запросы REST API. Это также удобно в случае, если по каким-то причинам не используется веб-публикация базы 1С и нет возможности использовать публикацию HTTP-сервиса.
На основе SNMPTrap_REST_To_WS и 1С можно создать «Агрегатор событий и сервис оповещения». По SNMP можно собирать данные о критичных событиях от устройств (превышение температуры выше нормы в серверной), по REST API собирать данные (необработанные исключения в базах 1С ОбработкаОтображенияОшибки () ) и события других приложений, логи журнала событий операционной системы (скрипт PowerShell в Планировщике заданий).
В связке SNMPTrap_REST_To_WS и 1С можно реализовать онлайн-систему мониторинга за критичными событиями с оповещением в реальном времени на экране монитора и на мобильные устройства пользователей (по каким событиям кому и в каком виде отправлять оповещение), аналитические отчеты.
На стороне 1С:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОбработчикиСокета = Новый ОбработчикиWebSocketКлиентСоединения;
ОбработчикиСокета.Модуль = ЭтотОбъект;
ОбработчикиСокета.ОбработчикОткрытияСоединения = "ВебСокет_ОбработчикОткрытия";
ОбработчикиСокета.ОбработчикЗакрытияСоединения= "ВебСокет_ОбработчикЗакрытия";
ОбработчикиСокета.ОбработчикПолученияСообщения = "ВебСокет_ОбработчикПолученияСообщения";
ОбработчикиСокета.ОбработчикОшибки = "ВебСокет_ОбработчикОшибки";
WebSocketКлиентСоединения.ОткрытьСоединение("ws_localhost_3001", "ws://localhost:3001", ОбработчикиСокета,,"Администратор");
КонецПроцедуры
&НаКлиенте
Процедура ВебСокет_ОбработчикОткрытия(Соединение) Экспорт
СтруктураСоединение = ПараметрыСоединения(Соединение);
КонецПроцедуры
&НаКлиенте
Процедура ВебСокет_ОбработчикПолученияСообщения(Соединение, Сообщение) Экспорт
НоваяСтрока = Общение.Добавить();
НоваяСтрока.ТекстСообщения = Сообщение;
КонецПроцедуры
&НаКлиенте
Процедура ВебСокет_ОбработчикЗакрытия(Соединение, КодЗакрытия) Экспорт
ВидимостьДоступностьЭлементов(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура Зарегистрироваться(Команда)
ВебСокет = WebSocketКлиентСоединения.ПолучитьСоединение("ws_localhost_3001");
СтруктураРегистрации = Новый Структура("type,id","register",ИмяКлиента);
ТекстСообщения = ЗаписатьДанныеВJSON(,СтруктураРегистрации).Результат;
СостояниеСоединения = ВебСокет.ПолучитьСостояние();
СостояниеОткрыто = (СостояниеСоединения = СостояниеWebSocketСоединения.Открыто);
Если СостояниеОткрыто Тогда
// отправка данных в WebSocket
ВебСокет.ОтправитьСообщение(ТекстСообщения);
КонецЕсли;
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("Сообщение", ТекстСообщения);
//
ВидимостьДоступностьЭлементов(СостояниеОткрыто);
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьСообщение(Команда)
ВебСокет = WebSocketКлиентСоединения.ПолучитьСоединение("ws_localhost_3001");
СтруктураСообщения = Новый Структура("type,from,to,message","message",ИмяКлиента,ИмяПолучателя,ТекстОтправки);
ТекстСообщения = ЗаписатьДанныеВJSON(,СтруктураСообщения).Результат;
СостояниеСоединения = ВебСокет.ПолучитьСостояние();
СостояниеОткрыто = (СостояниеСоединения = СостояниеWebSocketСоединения.Открыто);
Если СостояниеОткрыто Тогда
// отправка данных в WebSocket
ВебСокет.ОтправитьСообщение(ТекстСообщения);
НоваяСтрока = Общение.Добавить();
НоваяСтрока.ТекстСообщения = ?(ПустаяСтрока(ИмяПолучателя),"you U94; all: ", "you U94; "+ИмяПолучателя+": ") + ТекстОтправки;
КонецЕсли;
ПараметрыЗаписи = Новый Структура;
ПараметрыЗаписи.Вставить("Сообщение", ТекстСообщения);
ВидимостьДоступностьЭлементов(СостояниеОткрыто);
КонецПроцедуры
Процедура ВидимостьДоступностьЭлементов(СостояниеОткрыто)
Элементы.Группа1.Видимость = Не СостояниеОткрыто;
Элементы.ИмяПолучателя.Видимость = СостояниеОткрыто;
Элементы.ТекстОтправки.Видимость = СостояниеОткрыто;
Элементы.ОтправитьСообщение.Видимость = СостояниеОткрыто;
Элементы.Общение.Видимость = СостояниеОткрыто;
КонецПроцедуры
///////////////////////////////////
&НаКлиенте
Функция ПараметрыСоединения(Соединение) Экспорт
СтруктураСоединение = Новый Структура;
СтруктураСоединение.Вставить("URLСервера", Соединение.URLСервера);
СтруктураСоединение.Вставить("ИмяПользователяИнформационнойБазы", Соединение.ИмяПользователяИнформационнойБазы);
СтруктураСоединение.Вставить("ОбработчикЗакрытияСоединения", Соединение.Обработчики.ОбработчикЗакрытияСоединения);
СтруктураСоединение.Вставить("ОбработчикОткрытияСоединения", Соединение.Обработчики.ОбработчикОткрытияСоединения);
СтруктураСоединение.Вставить("ОбработчикОшибки", Соединение.Обработчики.ОбработчикОшибки);
СтруктураСоединение.Вставить("ОбработчикПолученияСообщения", Соединение.Обработчики.ОбработчикПолученияСообщения);
СтруктураСоединение.Вставить("Заголовки", Соединение.Параметры.Заголовки);
Возврат СтруктураСоединение;
КонецФункции
&НаКлиенте
Функция ПараметрыКлиента(Клиент) Экспорт
СтруктураКлиент = Новый Структура;
СтруктураКлиент.Вставить("URLСервера", Клиент.URLСервера);
СтруктураКлиент.Вставить("ИмяПользователяИнформационнойБазы", Клиент.ИмяПользователяИнформационнойБазы);
СтруктураКлиент.Вставить("Заголовки", Клиент.ПараметрыСоединения.Заголовки);
СтруктураКлиент.Вставить("МетаданныеИмя", Клиент.Метаданные.Имя);
СтруктураКлиент.Вставить("МетаданныеURLСервера", Клиент.Метаданные.URLСервера);
Возврат СтруктураКлиент;
КонецФункции
#Область СериализацияДесериализацияДанных
// Возвращает чаще всего используемые ПараметрыЗаписиJSON (JSONWriterSettings)
//
// Возвращаемое значение:
// Результат - Структура - Стандартное заполнение
//
&НаСервере
Функция СтандартныеПараметрыJSON() Экспорт
Результат = Новый Структура;
Результат.Вставить("ПереносСтрок", ПереносСтрокJSON.Авто);
Результат.Вставить("СимволОтступа", " ");
Результат.Вставить("ИспользоватьДвойныеКавычки", Истина);
Результат.Вставить("ЭкранированиеСимволов", ЭкранированиеСимволовJSON.Нет);
Результат.Вставить("ЭкранироватьАмперсанд", Ложь);
Результат.Вставить("ЭкранироватьОдинарныеКавычки", Ложь);
Результат.Вставить("ЭкранироватьРазделителиСтрок", Ложь);
Результат.Вставить("ЭкранироватьУгловыеСкобки", Ложь);
Результат.Вставить("ЭкранироватьСлеш", Ложь);
Возврат Результат;
КонецФункции
// Преобразует данные в формат JSON
//
// Параметры:
// ВходящиеПараметры - Структура - Параметры формирование JSON
// ВходныеДанные - ЛюбоеЗначение - Данные которые нужно перевести в JSON
//
// Возвращаемое значение:
// Результат - Структура
// Отработал - Булево - Выполнено или нет
// ТекстОшибки - Строка - Текст ошибки если функция отработала с ошибкой
// Результат - Строка - JSON
//
&НаСервере
Функция ЗаписатьДанныеВJSON(Знач ВходящиеПараметры = Неопределено, Знач ВходныеДанные = "") Экспорт
Результат = Новый Структура("Результат, Отработал, ТекстОшибки", "", Истина, "");
Если ВходящиеПараметры = Неопределено Тогда
ВходящиеПараметры = СтандартныеПараметрыJSON();
КонецЕсли;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ВходящиеПараметры.ПереносСтрок,
ВходящиеПараметры.СимволОтступа,
ВходящиеПараметры.ИспользоватьДвойныеКавычки,
ВходящиеПараметры.ЭкранированиеСимволов,
ВходящиеПараметры.ЭкранироватьУгловыеСкобки,
ВходящиеПараметры.ЭкранироватьРазделителиСтрок,
ВходящиеПараметры.ЭкранироватьАмперсанд,
ВходящиеПараметры.ЭкранироватьОдинарныеКавычки,
ВходящиеПараметры.ЭкранироватьСлеш);
Попытка
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Истина;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
ЗаписатьJSON(ЗаписьJSON, ВходныеДанные,,"ФункцияПреобразованияЗаписи",ЭтотОбъект);
Результат.Вставить("Результат", ЗаписьJSON.Закрыть());
Исключение
Результат.Отработал = Ложь;
Результат.ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Возврат Результат;
КонецФункции
&НаСервере
Функция ФункцияПреобразованияЗаписи(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт
Если ТипЗнч(Значение) = Тип("СписокЗначений") Тогда
МассивЗначений = Значение.ВыгрузитьЗначения();
Значение = МассивЗначений;
КонецЕсли;
КонецФункции
#КонецОбласти
код 1С взят из обработки: //infostart.ru/1c/articles/2293957/
Публикация сопровождается файлом для загрузки:
- скрипт Python сервис SNMPTrap_REST_To_WS
Тестирование: Postman, SnmpTrapGen (https://ezfive.com/snmpsoft-tools/snmp-trap-gen).
Примечание:
SNMPTrap_REST_To_WS – это демонстрация возможностей использования WebSocket в 1С в целях интеграции. Для рабочей схемы необходимо доработать вопросы: безопасности и производительности.
Вступайте в нашу телеграмм-группу Инфостарт