FAQ по интеграции с продуктами серии GOALcity.

 

Версия от 10 июля 2007г.

 

Внимание! Большинство запросов к GOALcity требуют авторизации на сервере. Помимо стандартной Basic authentication начиная с версии 4.50.15 GOALcity поддерживает передачу параметров авторизации прямо в сроке URL запроса.  Для этого к строке запроса добавить параметр authentication(user:password). С версии 5 вместо полного Moniker'а можно использовать его hash (см. тег moniker_hash).

 

  1. Какой протокол необходимо использовать для интеграции с GOALcity?
  2. Какие настройки WebBrowser’а нужно использовать для подключения к GOALcity?
  3. Приведите пример программной реализации подключения к GOALcity?
  4. Какой формат xml-документа использует GOALcity для ответа на запрос ‘enum/all”?
  5. Как получить видео с камер системы GOALcity?
  6. Как получить информацию от модуля распознавания автомобильных номеров?
  7. С подключением по http://host:port/MONIKER/video?info у меня проблемы – имя пользователя и пароль спрашивает, но потом ничего не показывает. Выводит стандартное сообщение что страницу показать нельзя.
  8. Как получить информацию о сработке датчиков?
  9. Как просмотреть запись из архива?
  10. Какие функции предоставляет пользователю GOALcity SDK?

 

В.   Какой протокол необходимо использовать для интеграции с 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 этого запроса имеет вид:

 

http://host:port/Здесь нужно указать Moniker/video?info

 

 

Ответ на такой запрос будет в формате 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.        К такому видеоисточнику обращаемся по команде:

 

http://host:port/Здесь нужно указать Moniker/video?info

 

 

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.        К такому источнику обращаемся по команде:

 

http://host:port/Здесь нужно указать Moniker/config

 

 

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.        К такому источнику обращаемся по команде:

 

http://host:port/Здесь нужно указать Moniker/ranges?begin=&end=&interval=

 

 

4.        time_t - количество миллисекунд прошедших, с 1 января 1970 года. Параметры begin и end указывают начало и конец интересующих записей.

5.        Ответ на такой запрос будет в формате Content-type типа text/xml. В нем будет содержаться информация о доступных записях в виде временных отрезков (ranges).

6.        Для получения видео для некоторого выбранного отрезка времени необходимо обратиться к скрипту video:

 

http://host:port/Здесь нужно указать Moniker/video?begin=&skip=

 

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>