Получение событий видеоаналитики

Получение данных через web-stomp

Тонкий клиент взаимодействует со службой Spot для:

  • получения информации о событиях видеоаналитики в реальном времени,
  • получения информации о тревогах, выявленных детекторами видеоаналитики,
  • доступа к архиву событий видеоаналитики.

Для подключения к через STOMP используется URL ws://HOST:PORT/spot, где:

  • HOST - адрес службы InSentry.Spot
  • PORT - порт службы InSentry.Spot (обычно 8081)

Взаимодействие тонкого клиента со службой Spot.Lite ведется по протоколу STOMP, работающему поверх протокола WebSocket.

Получение событий в реальном времени

Для получения событий видеоаналитики в реальном времени тонкий клиент подписывается на топик, выполняя STOMP-запрос SUBSCRIBE:

/topic/[camera_id]/[detector_id]

где:

  • camera_id — идентификатор камеры в формате GUID
  • detector_id — идентификатор детектора, указанный в дескрипторе kernel (Формат дескриптора Kernel) в поле $.detectors[*].id

Например:

/topic/f0a72c41-79e2-4ba5-a894-6726c6f5358b/motionDetector

Для подписки на события сразу с нескольких камер могут быть использованы маски, задаваемые символом > и означающие подписку на все субтопики. Например, для получения событий по камере f0a72c41-79e2-4ba5-a894-6726c6f5358b от любых детекторов необходимо подписаться на топик:

/topic/f0a72c41-79e2-4ba5-a894-6726c6f5358b/>

Для получения событий от любых детекторов с любых камер, обслуживаемых одной и той же службой Spot, необходимо подписаться на топик:

/topic/>

Получение состояния сцены и изменений состояния

После входу в систему тонкому клиенту необходимо получить информацию об изменениях состояния сцены, которые произошли до его подключения: состояние счетчиков, объекты разметки и т.д. Перед началом проигрывания архива, тонкому клиенту необходимо состояние сцены, которое сформировалось до того момента, с которого планируется начать просмотр архива.

Когда архив находится на паузе, при кликах по таймлайну в архиве тонкому клиенту необходимо состояние сцены на тот момент времени, для которого отображается скриншот в режиме паузы. Для получения этой информации тонкий клиент выполняет STOMP-запрос SUBSCRIBE:

/api/state/[camera_id]

Заголовки запроса: frameTimestamp:[frameTimestamp] где:

  • camera_id — идентификатор камеры в формате GUID, состояние сцены по которой необходимо получить,
  • frameTimestamp — момент времени, для которого необходимо получить текущее состояние сцены (unix-time в микросекундах). Параметр не обязательный и может отсутствовать, в этом случае возвращается состояние сцены на текущий момент времени.

Например:

/api/state/edc366f3-a80b-4d6e-a306-0946bef3e527

В ответ на подписку к этому топику клиент получает сообщение, содержащее состояние сцены по каждому из детекторов в том же формате, как и в запросе получения информации из архива событий видеоаналитики.

Пример ответа от детектора

Пример ответа детектора движения в запрещённой зоне:

content-type: application/json;charset=utf-8
content-length: 1237
cameraId: 8f05484c-7a79-41fd-9c71-ea4916a68b40
timestamp: 1531945640234
detectorId: faceDetector
eventType: sceneUpdate
frameWidth: 1024
frameHeight: 768
   
{
  "objects": [
    {
      "id": "91307ce9-332b-41a9-b53b-617a28c8b878",
      "action": "shot",
      "class": "motion",
      "points": [
        {
          "x": 100,
          "y": 120
        },
        {
          "x": 300,
          "y": 200
        }
      ],
      "states": [
        {
          "id": "zone",
          "float": 0
        }
      ]
    },
    {
      "id": "3c4c0f95-476c-4291-a05f-f0f20c439475",
      "action": "shot",
      "class": "motion",
      "points": [
        {
          "x": 500,
          "y": 320
        },
        {
          "x": 600,
          "y": 420
        }
      ],
      "states": [
        {
          "id": "zone",
          "float": 1
        }
      ]
    },
    {
      "id": "4b29e160-c4e2-4172-9685-7fcfd51a10ac",
      "action": "shot",
      "class": "motion",
      "points": [
        {
          "x": 10,
          "y": 12
        }
      ],
      "states": [
        {
          "id": "zone",
          "float": 3
        }
      ]
    }
  ]
}