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

10

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

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

60000 руб.

07.05.2019    34642    68    45    

27

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

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

57600 руб.

26.11.2024    2354    2    2    

4

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

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

36000 руб.

03.08.2020    19056    21    22    

18

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

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

12000 руб.

02.02.2021    18829    54    50    

30

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    833    4    1    

5

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

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

24000 руб.

27.09.2024    4028    3    2    

4

Обмен с ГосИС 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

2400 руб.

28.04.2016    93000    190    217    

343
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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 1330 23.09.19 14:08 Сейчас в теме
(2) В моем случае нет смысла,
1. если что-то нужно передать на сервер, то вызов серверного метода,
2. если нужно отправить сообщение другому пользователю то организовать канал public и в него писать.

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

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