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 3031 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 234 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 234 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 3031 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/ , кажется это именно то что для вас нужно
Оставьте свое сообщение
Вакансии
Технический архитектор
Москва
зарплата от 300 000 руб. до 380 000 руб.
Полный день

Программист 1С
Казань
зарплата от 150 000 руб.
Полный день

Программист 1С:ERP
Москва
зарплата от 100 000 руб.
Полный день

Разработчик 1С
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день

Программист 1С (удаленно)
Самара
зарплата от 230 000 руб. до 230 000 руб.
Полный день