Передача данных с сервера на клиент через 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С:ITIL, 1С:ITILIUM, Управление IT-отделом 8 через интернет с любого устройства посредством браузера, увеличивая эффективность работы пользователей и снижая нагрузку на сервер. Быстрая инсталляция портала за пару часов, удобный и интуитивно понятный интерфейс и безопасность данных помогут упростить работу с порталом и ускорить выполнение бизнес-процессов компании.

128000 руб.

19.12.2023    2038    2    0    

9

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

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

57600 руб.

26.11.2024    1805    1    1    

4

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

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

60000 руб.

07.05.2019    34101    63    45    

24

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

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки.

24000 руб.

27.09.2024    3247    3    2    

3

WEB-интеграция Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разрабатывалась для загрузки документов из Ветменеджер в 1С: Бухгалтерия 3.0

12000 руб.

02.02.2021    18481    53    50    

29

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

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

36000 руб.

03.08.2020    18714    20    22    

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

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

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

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

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

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