Передача данных с сервера на клиент через 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/

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    5492    4    3    

7

WEB-интеграция Программист Бизнес-аналитик 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

14400 руб.

20.12.2024    2973    16    2    

17

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

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    38080    73    45    

31

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

В расширении реализован механизм интеграции между системой поставщика и Личным кабинетом СДТ. Реализован обмен заказами и реализациями (накладными), предусмотрено отслеживание статусов документов. Расширение предназначено для 1С:УТ 11.4.

35856 руб.

27.11.2024    1532    1    0    

1

Обмен с ГосИС WEB-интеграция Бухгалтер Пользователь 1С v8.3 Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия государственного учреждения 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Обработка является альтернативой механизму, разработанному фирмой 1С и заполняющему реквизиты контрагента по ИНН или наименованию. Не требуется действующей подписки ИТС. Вызывается как внешняя дополнительная обработка, т.е. используется, непосредственно, из карточки контрагента. Заполнение по ИНН или наименованию реквизитов контрагента по данным сайта ФНС (egrul.nalog.ru) для БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0, УТ 10.3, УТ 11.x, КА 1.1, КА 2.x, УПП 1.x, ERP 2.x, УНФ 1.5, УНФ 1.6, УНФ 3.0, ДО 2.1

3000 руб.

28.04.2016    96733    109    218    

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

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

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

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

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

В CentrifugoClient реализованы методы: 'Connect', 'Refresh', 'Disconnect', 'Subscribe', 'Unsubscribe', 'Publish', 'Presence', 'History', 'Ping', 'CreateToken'
9. malikov_pro 1346 18.04.20 09:53 Сейчас в теме
(4) Приветствую. Когда ожидать публикации компоненты? Есть желание собрать расширение с компонентой и опубликовать его.
10. sivin-alexey 513 24.04.20 14:09 Сейчас в теме
11. malikov_pro 1346 24.04.20 18:16 Сейчас в теме
(10) Благодарю, добавлю в описание.
5. sivin-alexey 513 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 1346 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 1346 23.10.19 14:11 Сейчас в теме
(6) Описание запуска в качестве сервиса windows добавил в статью.
user1286781; +1 Ответить
12. tolstyak_2000 01.12.21 10:36 Сейчас в теме
Добрый день! При создании подключения используется метод компоненты "ОтправитьСтроку". В описании методов компоненты такого не нашел. Подскажите пожалуйста куда смотреть?
13. malikov_pro 1346 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 1346 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)
Для отправки сообщения требуется регистрация/авторизация