FAQ по интеграции с продуктами серии GOALcity.
Версия от 10 июля 2007г.
Внимание! Большинство запросов к GOALcity требуют авторизации
на сервере. Помимо стандартной Basic authentication начиная с версии 4.50.15 GOALcity
поддерживает передачу параметров авторизации прямо в сроке URL запроса. Для
этого к строке запроса добавить параметр authentication(user:password). С
версии 5 вместо полного Moniker'а можно использовать его hash (см. тег
moniker_hash).
В. Какой протокол
необходимо использовать для интеграции с GOALcity?
О. Интеграция
с продуктами серии GOALcity происходит с помощью
протокола HTTP. В этом случае в качестве простого клиента для GOALcity может служить любой WebBrowser, позволяющий работать с Content-type типа “text/xml” и “text/jpeg”.
В. Какие настройки WebBrowser’а нужно использовать для подключения к GOALcity?
О. По
умолчанию GOALcity запускает свои Web-службы на 3107 порту. Для подключения, например, к компьютеру с IP-адресом 192.168.10.57
можно воспользоваться следующей строкой подключения – http://192.168.10.57:3107/enum/all.
В ответ на такой запрос GOALcity
сформирует xml-документ примерно следующего содержания:
В. Приведите пример программной
реализации подключения к GOALcity?
О. В
качестве примера рассмотрим вариант подключения к GOALcity на языке программирования Object Pascal в среде
программирования Delphi 7.
Для этого воспользуемся встроенными компонентами Indy
TidHTTP, Indy TidURI и TMmoryStream:
//..
PROCEDURE Connect; VAR
//..
HTTPText : TMemoryStream; // Буфер для GOALcity HTTP : TidHTTP; // Реализация протокола HTTP URL : TidURI; // Класс для генерации строк подключения
BEGIN TRY HTTPText := TMemoryStream.Create; HTTP := TidHTTP.Create(NIL); URL := TidURI.Create;
// Генерируем URL подключения URL.Protocol := 'http'; URL.Host := '192.168.10.57'; URL.Port := '3107'; //Строка запроса для GOALcity URL.Path := TidURI.PathEncode('/enum/all'); // Для корректной работы с GOALcity необходимо использовать // TidURI.PathEncode со всеми строками запроса // URL.URI теперь содержит URL подключения. // В данном случае это http://192.168.10.57:3107/enum/all
// Настраиваем параметры HTTP протокола HTTP.ReadTimeout := 10000;
// Устанавливаем простой режим авторизации на сервере HTTP.HTTPOptions := HTTP.HTTPOptions + [hoInProcessAuth]; HTTP.Request.BasicAuthentication := True;
// В качестве дополнительных параметров для // HTTP протокола можно указать адрес и порт прокси сервера HTTP.ProxyParams.ProxyServer := 'proxy.speclab.loc'; HTTP.ProxyParams.ProxyPort := '6588';
TRY // Пытаемся подключиться HTTP.Get(URL.URI, HTTPText); // Подключение прошло успешно // Для '/enum/all' возвращаемым типом может быть только text/xml IF (Pos('text/xml', HTTP.Response.ContentType) > 0) THEN BEGIN // В HTTPText находятся данные, полученные от GOALcity // .. END;
EXCEPT //Ошибка подключения END;
FINALLY HTTPText.Free; HTTP.Free; URL.Free; END;
END. |
В. Какой формат xml-документа использует GOALcity для ответа на
запрос “enum/all”?
О. Запрос
“enum/all” используется для получения описания текущей конфигурации GOALcity. Ответом на этот запрос является
xml-документ. Для описания конфигурации GOALcity
используются следующие тэги:
Тэг |
Описание |
Host |
Корневой тэг |
Name |
Тэг, содержащий
имя Host’а |
Servers |
Тэг, содержащий описание серверов |
Server |
Тэг, содержащий описание
элемента сервера |
Children |
Тэг, содержащий описание
потомков серверов уровня 1 |
Child |
Тэг, содержащий описание
потомка серверов уровня 1 |
Grandchildren |
Тэг, содержащий описание
потомков серверов уровня 2 |
Grandchild |
Тэг, содержащий описание
потомка серверов уровня 2 |
Clsid |
Тэг, содержащий текстовое
представление COM класса данного объекта |
Moniker |
Тэг, содержащий информационную
строку, используемую системой GOALcity
для доступа к объекту |
moniker_hash |
Тэг, содержащий хеш
моникера, также может использоваться для доступа к объекту |
Description |
Тэг, содержащий
описание объекта |
Videosignal |
Тэг, содержащий информацию
о наличии видеосигнала |
Sensorstate |
Тэг, содержащий информацию
о текущем состоянии датчика |
Пример файла с описанием значений тэгов.
<host> <name>ALPHA</name>
// Имя Host’а <servers> // Начало
описания серверов <server version="4.00 (base) build
29"> // первый сервер // Описание сервера <clsid>{0B3EF723-295D-11D8-823E-0008C7B3416D}</clsid> <description>Аудиосервер
ALPHA</description> <moniker>
NetMoniker:,GCITY:{0B3EF723-295D-11D8-823E-0008C7B3416D}:{00-11-2F-EB-D4-43}: </moniker> //
Описание элементов потомков аудиосервера. <children> <child> // Первая плата аудиозахвата
// Описание
платы <description>Плата1</description> <moniker> ComMoniker:NetMoniker:,GCITY:{0B3EF723-295D-11D8-823E-0008C7B3416D}:{00-11-2F-EB-D4-43}:~ItemMoniker:Slmedia&14F1-8811&0-19-1 </moniker> //
Описание элементов потомков первой платы аудиосервера. <grandchildren> <grandchild> <description>Микрофон1</description> // Дополнительные поля, описывающие Микрофон 1 ... </grandchild> <grandchild> <description>Микрофон2</description> // Дополнительные поля, описывающие Микрофон 2 ... </grandchild> </grandchildren> </child> // Описание других плат аудиосервера ... </children> </server> <server version="4.00 (base)
build 29"> //
второй сервер
//Описание сервера <clsid>{0B3EF77D-295D-11D8-823E-0008C7B3416D}</clsid> <description>Видеосервер ALPHA</description> <moniker>
NetMoniker:,GCITY:{0B3EF77D-295D-11D8-823E-0008C7B3416D}:{00-11-2F-EB-D4-43}: </moniker> //
Описание элементов потомков видеосервера. <children> <child> <description>Плата1</description> <moniker> ComMoniker:NetMoniker:,GCITY:{0B3EF77D-295D-11D8-823E-0008C7B3416D}:{00-11-2F-EB-D4-43}:~ItemMoniker:Slmedia&14F1-8800&0-19-0 </moniker> //
Описание элементов потомков первой платы видеосервера. ... </child> </children> </server> </servers> </host> |
В. Как получить видео с камер GOALcity?
О. Получить
видео с камер GOALcity можно с помощью URL запроса. Формат URL этого запроса имеет вид:
Ответ на такой запрос будет в формате Content-type типа “multipart/mixed”.
В составе этого формата будут содержаться части типа “text/xml”, “image/SLEX” или “image/SLJP”. В части “text/xml” будет содержаться текущая информация о состояния
видеосигнала и информация о сработке фильтров. В части “image/SLEX” и “image/SLJP” будет содержаться закодированное изображение. Для
раскодирования кадров необходимо установить видеокодек от компании “Спецлаборатория”.
Пример части “text/xml”.
<?xml version='1.0' encoding='UTF-8'?> <properties> <ProcAmp bAutoContrast='true' brightness='114' contrast='63' hue='0' saturation='128'/> <Signal type='bool' value='true'/> <MotionDetector> <rect type='RECT' x='332' y='8' width='20' height='66'/> <rect type='RECT' x='452' y='8' width='180' height='464'/> <rect type='RECT' x='8' y='114' width='384' height='358'/> </MotionDetector> </properties> |
В. Как получить информацию от модуля
распознавания автомобильных номеров?
О. Все
очень просто. Алгоритм должен быть примерно таким:
1.
Опрашиваем
конфигурацию системы с помощью запроса “/enum/all”. В результате получаем XML файл с настройками,
как это описано выше.
2.
Парсим этот XML в поисках доступных
видеоисточников. Это будут узлы XML
дерева, описываемые тэгом
<grandchild>, у которого атрибут videosignal равен true.
3.
К такому
видеоисточнику обращаемся по команде:
4.
Ответ на такой запрос будет в формате Content-type типа “multipart/mixed”.
В составе этого формата будут содержаться части типа “text/xml”, “image/SLEX” или “image/SLJP”. В части “text/xml” будет находиться информация о сработке детектора
автомобильных номеров. В случае, если нужна только эта информация, то в конец
запроса можно модифицировать до: "video?info=only". Вот пример такого xml:
Пример части “text/xml”.
<?xml version='1.0' encoding='UTF-8'?> <properties> <ProcAmp bAutoContrast='true' brightness='114' contrast='63' hue='0' saturation='128'/> <Signal type='bool' value='true'/> <MotionDetector> <rect type='RECT' x='332' y='8' width='20' height='66'/> <rect type='RECT' x='452' y='8' width='180' height='464'/> <rect type='RECT' x='8' y='114' width='384' height='358'/> </MotionDetector>
<CarNumberDetector>
<CarNumber probability='92%' status='1'> <number>Е908АА177</number> <rect type='RECT' x='112' y='126'
width='98' height='14'/> </CarNumber> </CarNumberDetector> </properties> |
Описание:
Тэг
<CarNumberDetector> присутствует всегда, когда включен детектор автономеров.
Внутри него содержатся поля с тэгом <CarNumber> для каждого найденного
номера. Эти поля описывают найденные номера. Формат описания номера представлен
в примере выше.
Для тестирования мы рекомендуем поставить VSS и
подцепить оттуда AVI файл. В ключе должна быть обязательно прошита поддержка
модуля поиска автономеров.
В. С подключением по http://host:port/MONIKER/video?info у меня проблемы
– имя пользователя и пароль спрашивает, но потом ничего не показывает. Выводит
стандартное сообщение, что страницу показать нельзя.
О. Это
нормально. В данном случае используется так называемая, basic authorization. В
браузере пароль и логин нужно оставить пустыми. Ошибка же значит, что ваш
браузер не поддерживает режим Content-type типа “multipart/mixed”. Можно попробовать вот такой
вариант - http://host:port/MONIKER/video?jpeg. В ответ на этот запрос видеосервер вернет только сжатый кадр в
формате JPEG. В этом случае Content-type будет типа "image/jpeg”, который корректно
воспринимают все браузеры.
В. Как получить
информацию о сработке датчиков?
О. Все
очень просто. Алгоритм должен быть примерно таким:
1.
Опрашиваем
конфигурацию системы с помощью запроса “/enum/all”. В результате получаем XML файл с настройками,
как это описано выше.
2.
Парсим этот XML в поисках доступных
датчиков. Это будут узлы XML
дерева, описываемые тэгом
<grandchild>, которые являются потомками сервера устройств.
3.
К такому
источнику обращаемся по команде:
1.
Ответ на такой
запрос будет в формате Content-type типа “text/xml”. В нем будет содержаться информация о текущем состоянии
датчика.
Пример части “text/xml”.
<sensor_keys KeyXPath="name/text()" displayname="`Датчики и ключи" group-edit="item" expand="false"> <item displayname="`Виртуальный ключ" removable="true" _kind="virtual_sensor_key" summary="concat( name/text(), ':', value/item[text() = current()/value/text()]/@displayname )" expand="false"> <name type="BSTR" displayname="`Имя" check_value="!=''" expand="false">virtual_key</name> <state type="bool" displayname="`Замкнут" expand="false">true</state> <damage type="BSTR" displayname="`Поврежден" lookup="item" expand="false"> NoDamage <item type="BSTR" displayname="`Нет">NoDamage</item> <item type="BSTR" displayname="`Короткое замыкание">ShortCircuit</item> <item type="BSTR" displayname="`Обрыв">BrokenCircuit</item> </damage> </item> </sensor_keys> |
Описание:
Тэг <state>
присутствует всегда. Значение тега (оно выделено красным) может быть true (замкнут) или false (разомкнут).
Состояние виртуальных ключей можно изменить, заменив в
полученном XML это значение и отправив XML обратно. См. пример SensUtil.
В. Как просмотреть запись из
архива?
О. Все
очень просто. Алгоритм должен быть примерно таким:
1.
Опрашиваем
конфигурацию системы с помощью запроса “/enum/all”. В результате получаем XML файл с настройками,
как это описано выше.
2.
Парсим этот XML в поисках доступных
архивных источников. Это будут узлы XML дерева, описываемые тэгом <grandchild>, для
которых доступен скрипт ranges.
3.
К такому
источнику обращаемся по команде:
4.
time_t -
количество миллисекунд прошедших, с 1 января 1970 года. Параметры begin и end указывают
начало и конец интересующих записей.
5.
Ответ на такой
запрос будет в формате Content-type типа “text/xml”. В нем будет содержаться информация о доступных записях
в виде временных отрезков (ranges).
6.
Для получения
видео для некоторого выбранного отрезка времени необходимо обратиться к скрипту
video:
7.
Где begin - начало
интересующего отрезка, а skip - сколько
кадров нужно пропустить от его начала.
В. Какие функции
предоставляет пользователю GOALcity SDK?
О. Основная
функция, которую предоставляет GOALcity SDK - это просмотр видео со всех возможных источников GOALcity,
включая архивные. Дополнительно с видеокадрами GOALcity
SDK позволяет получать информацию о
сработке всех алгоритмов детекции:
·
Детектора
движения
·
Детектора фона
·
Детектора
автомобильных номеров
·
Детектора лиц.
Информация о сработке алгоритмов детекции представлена в виде XML файла, структура которого представлена ниже:
// Стандартный заголовок XML документа <?xml version='1.0' encoding='UTF-8'?>
// Информация о сработке детекторов находится в тэге <properties> <properties>
// Описание физических характеристик видеоисточника. В данном случае // включен алгоритм автоконтраста, текущая яркость 114 и текущий контраст 63. <ProcAmp bAutoContrast='true' brightness='114' contrast='63' hue='0' saturation='128'/>
// Описание информации о сработке Детектора движения находится в тэге <MotionDetector> <MotionDetector> // В данном случае обнаружено три области движения. <rect type='RECT' x='332' y='8' width='20' height='66'/> <rect type='RECT' x='452' y='8' width='180' height='464'/> <rect type='RECT' x='8' y='114' width='384' height='358'/> </MotionDetector>
// Описание информации о сработке Детектора фона находится в тэге <LostThingDetector> <LostThingDetector> // В данном случае обнаружено две области опасного изменения фона. <rect type='RECT' x='32' y='8' width='120' height='166'/> <rect type='RECT' x='42' y='8' width='110' height='264'/> </LostThingDetector>
// Описание информации о сработке Детектора автономеров находится в тэге <CarNumberDetector> <CarNumberDetector> // В данном случае обнаружен один автомобильный номер Е908АА177, достоверность которого // составляет 92%. <CarNumber probability='92%'> <number>Е908АА177</number> <rect type='RECT'
x='112' y='126' width='98' height='14'/> </CarNumber> </CarNumberDetector> // Описание информации о сработке Детектора лиц находится в тэге <FaceDetector> <FaceDetector> // В данном случае обнаружено одно лицо, которому присвоен номер 123134 <Face nTrackingId=’123134’> <rect type='RECT'
x='112' y='126' width='98' height='14'/> </Face> </FaceDetector> </properties>
|
|