Get запрос в режиме keepAlive бесконечное соединение

1. SvetlanaSchipakina 26.02.20 12:39 Сейчас в теме
Есть документация SDK для синхронизации с ПО Макроскоп распознавание номеров. мне нужно получать события распознавания онлайн. События можно получать в JSON-формате в «бесконечном» HTTP-соединении. Для этого
необходимо выполнить следующий запрос:
http://127.0.0.1:8080/event?login=root&password=&responsetype=json
При попытке сделать такой запрос из 1С - 1С зависает, т.к. считает, что результатом должен быть скачанный файл, пытается его скачать, но никогда не скачает.
Так же себя ведет и браузер Explorer

При запуске из браузера Chrome получаю бесконечный ответ в текстовом виде:

{
"EventId" : "c9d6d086-c965-4cf8-aef6-85b3894e3a4a",
"Timestamp" : "26.02.2020 07:38:47",
"EventDescription" : "Обнаружен автономер",
"IsAlarmEvent" : "False",
"ChannelId" : "6ca6fb85-25d0-4108-8e5c-4ed4f485a0ad",
"ChannelName" : "Камера 1",
"Comment" : "Н111НВ799",
"IsIdentified" : "False",
"plateText" : "Н111НВ799",
"Speed" : "0",
"Reliability" : "81,0176315307617",
"lastName" : "",
"firstName" : "",
"patronymic" : "",
"carbrand" : "",
"carcolor" : "",
"additionalInfo" : "",
"groups" : "",
"direction" : ["Unknown"],
"Numberplate" : "Н111НВ799"
}
{
"EventId" : "e9e7a69c-7ee2-3fee-a530-9f8a88124fcc",
"Timestamp" : "26.02.2020 07:38:54",
"EventDescription" : "",
"IsAlarmEvent" : "False",
"ChannelId" : "00000000-0000-0000-0000-000000000000",
"ChannelName" : "",
"Comment" : "KeepAlive"
}

Вероятно мне нужен промежуточный инструмент, который будет обрабатывать этот поток данных, отсекая пустые события keepAlive, а в 1С методом Get запроса, например, отправлять распознанный номер.
Кто-то сталкивался с подобным вопросом? Есть идеи как это можно реализовать?
В итоге мне все это нужно, чтобы отображать на табло текущий распознанный номер. Можно и без 1С все решить, напрямую отправлять POST запрос в табло с номером автомобиля.

пробовала через powershell, но он обрабатывает подобный запрос путем скачивания файла потока.
Вознаграждение за ответ
Показать полностью
Найденные решения
17. starik-2005 3036 27.02.20 15:04 Сейчас в теме
Можете на питончике сделать вечный цикл, внутри request.session, дальше проверка на соединение и получение данных. Если соединение свалилось (а обычно разные промежуточные сервера могут сбрасывать соединение через 30 сек, например - прокси там всякие) - снова его поднимать.

А можно, полагаю, и как-то так:
import requests
import json

r = requests.get('http://ххххххх.уууу/оооо.json',
    stream=True)

for line in r.iter_lines():
    if line: # filter out keep-alive new lines
        ...
Показать
raddik14; SvetlanaSchipakina; HAMAZ; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. user623969_dusa 26.02.20 13:59 Сейчас в теме
(1) так вы можете поставить в 1с чтобы результатом была строка... а насчет бесконечного соединения - интересно посмотреть ссылку на СДК если оно открытое, что имеется ввиду под бесконечным хттп соединением, никогда в своей жизни такого не встречал, любой запрос всегда конечен.. или там схема передатчик передает, а считыватель что успел то считал)
4. leemuar 26.02.20 14:43 Сейчас в теме
(3) имеется в виду TCP-соединение, которое не разрывается и остается открытым. Это помогает экономить ресурсы если с одним и тем же хостом нужно постоянно обменитьвася данными по http.

Почитайте что такое keep-alive в http
9. SvetlanaSchipakina 27.02.20 10:14 Сейчас в теме
14. user623969_dusa 27.02.20 11:10 Сейчас в теме
(9) а что ж вы сдк не сначала читаете)
в самом начале написано, что в качестве среды разработки предполагается использование
Microsoft Visual Studio.
сдк предлагает писать плагины как наследники класса
именно в эти наследники и пойдет информация с http соединения, вероятно это и есть тот промежуточный инструмент который вам нужен

а так что касается "бесконечного" http 1с как тут писали не разрывает соединение если таймаут = 0 при его создании, но это не то что вам нужно, разбить поток данных на отдельные json 1с не сможет, 1с читает пока идет информация

1с с http так как написано в сдк работать не сможет, он работает как браузер - принимает все что в него лезет, не сможет анализировать на транспортном уровне данные между заголовками http
2. SyachinS 26.02.20 13:28 Сейчас в теме
Попробуйте открыть через встроенный браузер и парсить результат.
8. uno-c 235 26.02.20 22:57 Сейчас в теме
(2)Кстати да, работает в динамике, по крайней мере на 15й платформе не ждет полной загрузки.
&НаКлиенте
Процедура Браузерр(Команда)
	АдресДляПоляХТМЛДокумента = "http://geek-nose.com";
	ПодключитьОбработчикОжидания("Чилдрен", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура Чилдрен()
	Сообщить ("Знаков Чилдрен :" + СтрДлина(Элементы.ПолеХТМЛДокумента.Документ.children[0].textContent));
	ПодключитьОбработчикОжидания("Чилдрен", 0.1, Истина);
КонецПроцедуры
Показать

Вывод сообщений:
Знаков Чилдрен :0
Знаков Чилдрен :4 795
Знаков Чилдрен :29 483
Знаков Чилдрен :47 254
Знаков Чилдрен :48 927
5. leemuar 26.02.20 14:47 Сейчас в теме
Напрямую работать с открытыми http-соединениями в 1С нельзя. Встроенных средств работы с сетевыми потоками нет. Вам нужно постоянно делать запрос на получение новой порции данных. И обязательно ставьте таймаут, без него столкнетесь с зависанием при ожидании ответа.

Если есть в SDK возможность получать данные НЕ в реальном времени (например, получать данные за какой-то промежуток времени) - лучше использовать ее. т.е. не ждать пока ПО пришлет новые данные, а каждую минуту отправлять запрос "дай мне данные за прошедшую минуту".

Поддерживает ли SDK Макроскопа веб-сокеты? Если да - возьмите компоненту работы с веб-сокетами в 1С и интегрируйтесь через нее

В крайнем случае, если ничего не поможет, сделайте прокси веб-сервис-обертку на том языке, который поддерживает работу с открытым соединением, орашивайте его на предмет новых данных с какой-то периодичностью.
6. uno-c 235 26.02.20 17:12 Сейчас в теме
(5)
Напрямую работать с открытыми http-соединениями в 1С нельзя
Что Вы имеете в виду? Соединение в 1С можно открыть один раз и делать через него несколько запросов. Соединение по умолчанию создается как keep-alive в HTTP 1.1, и эска умеет его держать в объекте ХТТПСоединение = Новый HTTPСоединение(..). Другое дело, когда в ответе сервера нет признака, что ответ законченный.
7. leemuar 26.02.20 17:44 Сейчас в теме
(6) да, действительно сформулировал я неудачно. То что 1С держит соединение открытым - внутренняя особенность, оптимизация объекта HTTPСоединение, управлять этим во встроенном языке мы не можем. Но это не то что нужно спрашивающему.

Я имел в виду, что используя HTTPСоединение нельзя открыть соединение и прослушивать его как поток, в режиме реального времени, ожидая новую порцию данных. Именно это требуется топикстартеру
10. SvetlanaSchipakina 27.02.20 10:18 Сейчас в теме
(5) работать не в реальном времени нет смысла, мне нужно отобразить номер автомобиля который подъехал и вспомогательную информацию по его лицевому счету, если требуется (например сообщить, что у него задолженность по оплате)
Макроскоп других вариантов не предоставляет
13. leemuar 27.02.20 11:06 Сейчас в теме
(10) в реальном времени получать данные в платформе, открыв соединение и постоянно получая из него данные, к сожалению, невозможно.
Либо вы часто делаете запросы в цикле на стороне 1С, либо сторонняя программа присылает в 1С данные (через веб-сервисы, Odata и т.п.)
11. SvetlanaSchipakina 27.02.20 10:21 Сейчас в теме
(5)
В крайнем случае, если ничего не поможет, сделайте прокси веб-сервис-обертку на том языке, который поддерживает работу с открытым соединением, орашивайте его на предмет новых данных с какой-то периодичностью.


пока я прорабатываю версию php + curl
curl умеет прослушивать поток, php может его обработать, отсекая пустые данные и отправлять get запрос в 1С, передавая номер авто и номер точки прохода.
Нашла сообщения на форумах, что это должно работать. Сегодня буду тестировать.
12. пользователь 27.02.20 11:03
Сообщение было скрыто модератором.
...
15. HAMAZ 7 27.02.20 12:29 Сейчас в теме
а какова должна быть частота опроса Макроскопа? и каков событийный механизм должен быть в 1С?
регламентное задание с интервало в n секунд или обработчик ожидания? с сервера запрос или с клиента?
Если с клиента, то можно ВК написать и вызывать внешнее событие
Если с сервера, то все равно придется прокладку писать и хттп сервис поднимать...
16. SvetlanaSchipakina 27.02.20 14:23 Сейчас в теме
(15) у меня http сервис для этого есть. планирую, при появлении машины на него отправляется GET запрос с номером авто и точкой прохода.
мне нужно, чтобы какая-то программа/сервис слушал это бесконечное соединение от макроскоп и создавал GET запрос на мой HTTP сервис при появлении машины.
17. starik-2005 3036 27.02.20 15:04 Сейчас в теме
Можете на питончике сделать вечный цикл, внутри request.session, дальше проверка на соединение и получение данных. Если соединение свалилось (а обычно разные промежуточные сервера могут сбрасывать соединение через 30 сек, например - прокси там всякие) - снова его поднимать.

А можно, полагаю, и как-то так:
import requests
import json

r = requests.get('http://ххххххх.уууу/оооо.json',
    stream=True)

for line in r.iter_lines():
    if line: # filter out keep-alive new lines
        ...
Показать
raddik14; SvetlanaSchipakina; HAMAZ; +3 Ответить
18. SvetlanaSchipakina 25.03.20 15:41 Сейчас в теме
(17)
Попробовала ваш вариант с python - все получилось. Спасибо за идею.
19. leemuar 17.07.20 19:44 Сейчас в теме
Обратите внимание на https://infostart.ru/public/1161011/ , кажется это именно то что для вас нужно
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот