Передача данных с сервера на клиент через WebSocket NativeAPI и Centrifugo

24.04.20

Интеграция - WEB-интеграция

В статье описываю реализацию обмена для замены передачи сообщений через 1С Сервер взаимодействия.

Вводные:

1. Используем уведомления пользователей о входящих звонках.
2. Транспортом сообщений является "1С Сервер взаимодействия". В связи с лицензионной политикой дальнейшее использование невозможно.
 

Вариант решения:

1. Использование WebSocket соединений на клиентской части.
2. Использование HTTP API интерфейса на серверной. Поднимать WebSocket соединение на сервере неудобно.
 

Организация WebSocket сервера:

Первое что попалось при "гуглении" https://github.com/centrifugal/centrifugo. Прост в настройке и использовании.
Для тестирования скачал дистрибутив для windows c https://github.com/centrifugal/centrifugo/releases.
Запустить как сервис для windows не получилось, не передает код ответа и сервис не стартует.
Планирую запускать на виртуальной nix, дополнительно можно настроить безопасность с помощью NGINX.
 
Для запуска нужно
1. Распаковать zip архив
2. Запустить генерацию типового конфигурационного файла
centrifugo genconfig

3. Запустить сервис

centrifugo --config=config.json

Сервис запустится на localhost:8000

Реализация подключения клиента

Использую NatieAPI компоненту.

Компоненту приобрел у //infostart.ru/public/1112969/, умеет генерировать внешнее событие.

Подключение компоненты реализовал в общем модуле, сделал обращения к нему из МодуляПриложения
 
 Подключение компоненты

 

Далее анализирую сообщения от внешней компоненты

 
 Анализ сообщений от компоненты

 

И создаю подключение

 
 Создание подключения и подписка на канал

 

Для Аутентификации используется JWT, реализацию брал из //infostart.ru/public/611505/, исходный код https://github.com/pintov/1c-jwt

В качестве имени канала использую GUID текущего пользователя, смысла слать broadcast запросы в моей задаче нет. Канал создается при подписке на него хотя бы одного клиента. То что сообщения не будут доставлены до клиента при отключении в данный не критично, доставляю оперативные уведомления.

Обрабатываю сообщения от компоненты на клиенте

 
 Вариант обработки сообщений

 

Реализация отправки сообщений с сервера

Для отправки использую HTTP протокол

 
 Пример реализации отправки

 

При отправке используется Аутентификация по токену

 
 Пример настройки HTTP запроса

 

В результате получаем:

Реализовывал в виде расширения в которое включена компонента, поэтому все расширение не публикую.

Проверка подключений и восстановление:

Реализовано через ОбработчикОжидания, он обращается к глобальному клиентскому модулю который не видит переменную объявленную в модуле приложения, поэтому вызов передается в не глобальный клиентский общий модуль.

 
 Подключение
 
 Реализация проверки на клиенте

 

Состояния подключений фиксирую в РС "ph_srv_Centrifugo_СостоянияПодключений"

 
 Запись и запрос данных из РС

Установка и запуск как служба:

Windows: успешно создал службу из exe с помощью https://nssm.cc/, при использовании sc служба не запускалась.

Ubuntu 18.04:

1. Запускаем строку

curl -s https://packagecloud.io/install/repositories/FZambia/centrifugo/script.deb.sh | sudo bash

из https://packagecloud.io/FZambia/centrifugo/install, раздел Installation, это настроит подключение к репозиторию, далее запускаем

sudo apt install centrifugo

Проверяем что запустился сервис (конфиг генерируется при установке)

sudo service centrifugo status

 

UPD от 24.04.2020

Разработчик компоненты ws добавил реализацию для centrifugo //infostart.ru/public/1228139/

См. также

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    16250    14    18    

14

Интеграция 1С и Битрикс 24 — модуль синхронизации для обмена задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    18435    10    15    

16

Модуль для обмена "1С:Предприятие 8. УАТ. ПРОФ" с FortMonitor

WEB-интеграция 8.3.8 Конфигурации 1cv8 Автомобили, автосервисы Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Расширение предназначено для конфигурации "1С:Предприятие 8. Управление Автотранспортом. ПРОФ". Функционал модуля: 1. Заполнение регистров сведений по подсистеме "Мониторинг", а именно: события по мониторингу, координаты по мониторингу, пробег и расход по мониторингу, текущее местоположение ТС по мониторингу 2. Заполнение путевого листа: пробег по мониторингу, время выезда/заезда, табличная часть ГСМ, места стоянок по геозонам. 3. Отчеты по данным загруженным в регистры сведений. 4. Предусмотрена автоматическая загрузка данных в фоновом режиме (условия работы данной загрузке читайте в описании товара) Модуль работает без включенной константы по настройкам мониторинга. Модуль формы предоставляется с открытым кодом, общий модуль защищен. Любой заинтересованный пользователь, имеет возможность скачать демо-версию расширения.

22656 руб.

25.05.2021    13096    34    8    

13

Автоматическая загрузка файлов (например, прайс-листов) из электронной почты, FTP, HTTP, их обработка и выгрузка на FTP (на сайт) и для других целей

Прайсы WEB-интеграция Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Автомобили, автосервисы Оптовая торговля, дистрибуция, логистика Управленческий учет Платные (руб)

Программа с заданным интервалом времени (или по ручной команде) скачивает файлы (например, прайс-листы поставщиков) из различных источников: письма электронной почты, FTP или HTTP-адреса, и сохраняет их в каталог упорядоченной структуры. При этом извлекает файлы из архивов, может переименовывать файлы и менять их формат (csv, xls, txt). Можно настроить выгрузку обработанных файлов на сайт (через FTP-подключение). Программа будет полезна компаниям, у которых есть большое количество поставщиков и/или прайс-листы поставщиков обновляются часто (необязательно прайс-листы, файлы могут быть любого назначения). Собранные таким образом актуальные версии прайс-листов можно выгрузить с помощью программы себе на сайт (или на любой FTP-сервер) или выполнить другие необходимые задачи.

25200 руб.

28.05.2015    85763    26    51    

50
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Steelvan 303 23.09.19 11:41 Сейчас в теме
*) Для обертки приложения в службу можно использовать nssm https://www.nssm.cc/
*) Условно-бесплатная компонента для веб-гнезд с поддержкой "Внешнее Событие" https://infostart.ru/public/808432/
2. Steelvan 303 23.09.19 11:54 Сейчас в теме
Про "поднимать веб-гнезда на сервере сложно" согласен. Через костыли.
Что бы экземпляр компоненты жил в потоке на сервере этот самый поток надо создать.

Как вариант, написать фоновое задание, которое будет создавать поток.
Этот поток передать во внешнюю компоненту вызовом метода и удерживать его там, передавая управление 1С только при получении сообщения.

Пока Истина Цикл
Сообщение = ВнешняяКомпонента.ПолучитьСообщение() // Здесь поток замирает до получения сообщения
ОбработкаСообщения(Сообщение);
КонецЦикла

Для этого можно использовать https://infostart.ru/public/937068/
3. malikov_pro 1303 23.09.19 14:08 Сейчас в теме
(2) В моем случае нет смысла,
1. если что-то нужно передать на сервер, то вызов серверного метода,
2. если нужно отправить сообщение другому пользователю то организовать канал public и в него писать.

В Публикации 937068 нет описания функций. Загонять в бесконечный цикл с ПолучитьСообщение() не самое лучшее решение. В той что использую используется нормальный механизм.
4. sivin-alexey 508 23.09.19 14:35 Сейчас в теме
У нас есть компонента CentrifugoClient (основана на WebSocketClient), которая уже заточена под Centrifugo. Используем её на предприятии уже больше года. Скоро опубликую.

В CentrifugoClient реализованы методы: 'Connect', 'Refresh', 'Disconnect', 'Subscribe', 'Unsubscribe', 'Publish', 'Presence', 'History', 'Ping', 'CreateToken'
9. malikov_pro 1303 18.04.20 09:53 Сейчас в теме
(4) Приветствую. Когда ожидать публикации компоненты? Есть желание собрать расширение с компонентой и опубликовать его.
10. sivin-alexey 508 24.04.20 14:09 Сейчас в теме
11. malikov_pro 1303 24.04.20 18:16 Сейчас в теме
(10) Благодарю, добавлю в описание.
5. sivin-alexey 508 23.09.19 14:36 Сейчас в теме
Пример обмена CentrifugoClient и Android будет рассмотрен в публикации.
6. user1286781 27.09.19 11:58 Сейчас в теме
Запустить как сервис для windows не получилось, не передает код ответа и сервис не стартует.


Вообще Centrifugo работает под Windows, по крайней мере запускается и пускает в административный веб-интерфейс:

C:\Users\admin>centrifugo.exe --admin
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"starting Centrifugo 2.2.2 (go1.12.6)"}
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"config path: C:\\Users\\admin\\config.json"}
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"pid: 12684"}
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"engine: Memory"}
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"gomaxprocs: 4"}
{"level":"info","time":"2019-09-27T11:50:44+03:00","message":"serving websocket, SockJS, API, admin endpoints on :8000"}
{"level":"info","time":"2019-09-27T11:53:11+03:00","message":"signal received: interrupt"}
{"level":"info","time":"2019-09-27T11:53:11+03:00","message":"shutting down, wait..."}
Показать
7. malikov_pro 1303 29.09.19 09:39 Сейчас в теме
(6) В ручную запустить возможно, но настроить запуск как "Службу" (чтобы запускалась при запуске windows без необходимости запускать сеанс пользователя) у меня не получилось. Пробовал https://support.microsoft.com/ru-ru/help/251192/how-to-create-a-windows-service-by-using-sc-exe. Для меня не критично, потому что планирую развернуть на отдельной виртуальной машине с ubuntu.
8. malikov_pro 1303 23.10.19 14:11 Сейчас в теме
(6) Описание запуска в качестве сервиса windows добавил в статью.
user1286781; +1 Ответить
12. tolstyak_2000 01.12.21 10:36 Сейчас в теме
Добрый день! При создании подключения используется метод компоненты "ОтправитьСтроку". В описании методов компоненты такого не нашел. Подскажите пожалуйста куда смотреть?
13. malikov_pro 1303 01.12.21 11:22 Сейчас в теме
(12) предположу что коллеги объединили в ОтправитьСообщение("Данные" тип Строка). Заменить ОтправитьСтроку() на ОтправитьСообщение()
14. tolstyak_2000 01.12.21 12:24 Сейчас в теме
Спасибо! В принципе так и предположил. Но при реализации, - Centrifugo дает ошибку. Делаю так:

1 Открыть(адрес сервера) - здесь все хорошо:

2. Дожидаюсь Оpen
Внешнее событие Источник=WebSocketClient_928599 Событие=Open Данные={"ip":"0::1"}

3 SendMessage(Json c токеном)

{
"id": 1,
"method": "connect",
"params": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM3MjIiLCJleHAiOjE2Mzg3ODgyMzB9.zTdj0bd08HHFZ7qbzlnXBe2_r0gCIIJxVMHzFpH9cpA"
}
}

Внешнее событие Источник=WebSocketClient_993140 Событие=Close Данные={"reason":"bad request","reconnect":false}


Понимаю, что в ответе ругается на плохой запрос. Но не понимаю - почему?
15. malikov_pro 1303 01.12.21 13:05 Сейчас в теме
(14)
С ходу не скажу, можно уточнить у разработчика компоненты https://infostart.ru/profile/32333/
Пробуйте работать с сокетами из postman.
Так же посмотрите https://infostart.ru/public/1228139/, она заточена именно под центрифугу.
16. tolstyak_2000 01.12.21 13:12 Сейчас в теме
Еще раз спасибо! Если все получиться отпишу сюда.
17. tolstyak_2000 01.12.21 16:57 Сейчас в теме
Добрый вечер! Нашел в чем дело, может кому пригодится:

параметр "metod" должен быть числовым (пример из документации):

{
"id": 1,
"method": 0,
"params": {
"token": "JWT",
"data": {}
}
}

Вероятно это особенность версии центрифуги (использую последнюю 3.0.1)
Оставьте свое сообщение