Блог Синявского
  • Разделы
  • Метки
  • Все статьи

Подключаемся к камерам по onvif

1

Что такое ONVIF (Open Network Video Interface Forum)

ONVIF - это стандарт сферы видеонаблюдения, содержащий протоколы взаимодействия IP камер, IP серверов (кодировщиков), регистрасторов, основанный на POST XML запросах.

В данной статье я буду придерживаться следующей терминологии:

  • Service - служба (Например: device management service - служба управления устройством);
  • PSIM (Physical security information management system) - автоматизированный охранный программный комплекс;

По типу устройств ONVIF подразделяется на несколько профилей:

  1. S - профиль IP камер, кодировщиков, других IP видео устройств (потоковое аудио и видео, управление параметрами потока, изображения и вещания);
  2. C - профиль систем контроля доступа основанных на IP (сигнализация, блокировка, разблокировка дверей и т.п.);
  3. Q - профиль упрощенного механизма настройки и расширенной безопасности (настройка устройств, обновление, NTP, SSL, мониторинг)
  4. G - профиль сетевых видеорегистраторов (NVR), систем управления зданиями и PSIM (управление и контроль записи, передача аудио и мета-информации);

Устройство поддерживающее ONVIF может поддерживать несколько профилей. Например камера с функцией записи может поддерживать профили S и G.

По предоставляемые протоколом ONVIF службы (более подробно можно ознакомиться на официальном сайте), также привожу характерные url служб для устройств с которыми я работаю:

  1. Access Control
  2. Action Engine
  3. Advanced Security
  4. Analytics http://onvif_host/onvif/Analytics
  5. Device IO http://onvif_host/onvif/DeviceIO
  6. Display
  7. Door Control
  8. Imaging http://onvif_host/onvif/Imaging
  9. Media http://onvif_host/onvif/Media
  10. PTZ (Pan, tilt, zoom - панорамирование, наклон, масштабирование)
  11. Receiver
  12. Recording Control
  13. Recording Search
  14. Replay Control
  15. Video Analytics Device
  16. Events http://onvif_host/onvif/Events

Любое устройство поддерживающее ONVIF поддерживает функции ядра, а дальше есть различия по назначению, например у регистратора нет поддержки PTZ и Door Control.

Поддержка сервисов по типам устройств:

  • NVD (Network video display) - устройства получающее видео изображение по сети и отображающее ее (Core, Streaming, Receiver, Display, Device IO);
  • NVT (Network video transmitter) - IP камера или кодировщик (Core, Media, Streaming, Device IO, Imaging, PTZ, Analytics);
  • NVA (Network video analytics) - устройство поддерживающее обработку информации, аналитику и передачу meta информации (Core, Streaming, Receiver, Analytics, Video Analytics Device, Device IO);
  • NVS (Network video storage) - устройства записи с NVT, как правило с поддержкой профиль G (Core, Streaming, Recording Search, Replay Control, Device IO, Receiver, Recording Control);

Полезные ссылки

Полная документация по ONVIF 2.5 на официальном сайте onvif

Спецификация ядра ONVIF на официальном сайте onvif

Полезная программа для изучения протокола - onvif device manager

Самый лучший кроссплатформенный сниффер - wireshark

Список всех функций onvif - список всех функций

Суть протокола

Протокол onvif относится к протоколам RPC с удалённым вызовом процедур на базе web-сервиса. В основе лежит WSDL - XML описание веб-сервиса. Обмен сообщениями также происходит с помощью XML сообщений (SOAP пакетов), последовательностями XML запрос-ответ.

Точка входа

Спецификация ядра onvif в разделе 5 (описание веб-сервисов) определяет единую точку входа для всех устройств для службы управления устройством:

http://onvif_host/onvif/device_service

Для работы с камерами по протоколу onvif в языке python существует python-onvif.

Установим библиотеку onvif

$ pwd
/onvif_cameras/
$ virtualenv -ppython2.7 env
$ source env/bin/activate
(env)$ pip install onvif

Находимся в директории /onvif_cameras/ Виртуальное окружение /onvif_cameras/env/ Важно! Путь к виртуальному окружению необходим поскольку при установке onvif скачивается пространства имен, схемы данных в папку wsdl

/onvif_cameras/env/wsdl$ ls

accesscontrol.wsdl     deviceio.wsdl     onvif.xsd             t-1.xsd
actionengine.wsdl      devicemgmt.wsdl   ptz.wsdl              types.xsd
addressing             display.wsdl      r-2.xsd               ws-addr.xsd
advancedsecurity.wsdl  doorcontrol.wsdl  receiver.wsdl         ws-discovery.xsd
analyticsdevice.wsdl   envelope          recording.wsdl        xmlmime
analytics.wsdl         events.wsdl       remotediscovery.wsdl  xml.xsd
b-2.xsd                imaging.wsdl      replay.wsdl
bf-2.xsd               include           rw-2.wsdl
bw-2.wsdl              media.wsdl        search.wsdl

Hikvision DS-2CD8153F-E (Onvif 2.02)

  • Подключимся к камере
  • Определим сервис
  • Получим информацию об устройстве
  • Посмотрим и установим системное время
  • Перезагрузим камеру
from onvif import ONVIFCamera, ONVIFService, ONVIFError
camera = ONVIFCamera('192.168.0.112', 80, u'admin', u'password', u'/onvif_cameras/env/wsdl/')


response = camera.devicemgmt.GetDeviceInformation()
response
(reply){
   Manufacturer = "HIKVISION"
   Model = "DS-2CD8153F-E"
   FirmwareVersion = "V4.0.1 build 120508"
   SerialNumber = "DS-2CD8153F-E0120120914BBRR411180126"
   HardwareId = "88"
}

Посмотрим все сервисы

response = camera.devicemgmt.GetServices({'IncludeCapability': True})

[(Service){
   Namespace = "http://www.onvif.org/ver10/device/wsdl"
   XAddr = "http://192.168.0.112/onvif/device_service"
   Version =
      (OnvifVersion){
         Major = 1
         Minor = 3
      }
 }, (Service){
   Namespace = "http://www.onvif.org/ver10/media/wsdl"
   XAddr = "http://192.168.0.112/onvif/Media"
   Version =
      (OnvifVersion){
         Major = 1
         Minor = 3
      }
 }, (Service){
   Namespace = "http://www.onvif.org/ver10/events/wsdl"
   XAddr = "http://192.168.0.112/onvif/Events"
   Version =
      (OnvifVersion){
         Major = 1
         Minor = 4
      }
 }, (Service){
   Namespace = "http://www.onvif.org/ver20/ptz/wsdl"
   XAddr = "http://192.168.0.112/onvif/PTZ"
   Version =
      (OnvifVersion){
         Major = 2
         Minor = 1
      }
 }, (Service){
   Namespace = "http://www.onvif.org/ver20/imaging/wsdl"
   XAddr = "http://192.168.0.112/onvif/Imaging"
   Version =
      (OnvifVersion){
         Major = 2
         Minor = 1
      }
 }, (Service){
   Namespace = "http://www.onvif.org/ver10/deviceIO/wsdl"
   XAddr = "http://192.168.0.112/onvif/DeviceIO"
   Version =
      (OnvifVersion){
         Major = 1
         Minor = 1
      }
 }]

Так же можно определить отдельный сервис, что гораздо быстрее и посмотреть все сервисы аналогично

management_service = ONVIFService('http://192.168.0.112/onvif/media', u'admin', u'password', '/onvif_cameras/env/wsdl/devicemgmt.wsdl')
services = management_service.GetServices({'IncludeCapability': True})

Посмотрим системное время на камере

response = camera.devicemgmt.GetSystemDateAndTime()
response

(SystemDateTime){
   DateTimeType = "NTP"
   DaylightSavings = False
   TimeZone =
      (TimeZone){
         TZ = "CST-8:00:00"
      }
   UTCDateTime =
      (DateTime){
         Time =
            (Time){
               Hour = 8
               Minute = 26
               Second = 23
            }
         Date =
            (Date){
               Year = 2015
               Month = 1
               Day = 10
            }
      }
   LocalDateTime =
      (DateTime){
         Time =
            (Time){
               Hour = 12
               Minute = 26
               Second = 23
            }
         Date =
            (Date){
               Year = 2015
               Month = 1
               Day = 10
            }
      }
 }

Установим время через словарь dict или через определение объекта времени. Второй вариант при установке времени если будет задан неверный аттрибут вызовет ошибку, что очень удобно.

import datetime
time_dict = {
    'UTCDateTime': datetime.datetime.now()
}
camera.devicemgmt.SetSystemDateAndTime(time_dict)

или определим объект времени

time_object = camera.devicemgmt.create_type('SetSystemDateAndTime')
time_object.DateTimeType = 'Manual'
time_object.DaylightSavings = True
time_object.TimeZone = 'CST-8:00:00'
time_object.UTCDateTime.Date.Year = 2015
time_object.UTCDateTime.Date.Month = 1
time_object.UTCDateTime.Date.Day = 10
time_object.UTCDateTime.Time.Hour = 12
time_object.UTCDateTime.Time.Minute = 26
time_object.UTCDateTime.Time.Second = 0
camera.devicemgmt.SetSystemDateAndTime(time_object)

Перезагрузим камеру

response = camera.devicemgmt.SystemReboot()

Для написания скриптов на bash очень не плохо подходит ONVIF CLI

$ onvif-cli devicemgmt GetHostname --user 'admin' --password 'password' --host '192.168.0.112' --port 80

True: {'FromDHCP': True, 'Name': hision}


  • ← сюда
  • туда →

comments powered by Disqus

Опубликовано

20.01.2015

Обновление

05.05.2022

Категории

onvif

Тэги

  • nvt 1
  • python 30

Всегда на связи

  • Блог Синявского - Ничего не переносить на завтра, это тоже проблема с прокастинацией?
  • © Алексей Синявский, по лицензии CC BY-SA если не указано иное.
  • С использованием Pelican. Тема: Elegant от Talha Mansoor