Что такое ONVIF (Open Network Video Interface Forum)
ONVIF - это стандарт сферы видеонаблюдения, содержащий протоколы взаимодействия IP камер, IP серверов (кодировщиков), регистрасторов, основанный на POST XML запросах.
В данной статье я буду придерживаться следующей терминологии:
- Service - служба (Например: device management service - служба управления устройством);
- PSIM (Physical security information management system) - автоматизированный охранный программный комплекс;
По типу устройств ONVIF подразделяется на несколько профилей:
- S - профиль IP камер, кодировщиков, других IP видео устройств (потоковое аудио и видео, управление параметрами потока, изображения и вещания);
- C - профиль систем контроля доступа основанных на IP (сигнализация, блокировка, разблокировка дверей и т.п.);
- Q - профиль упрощенного механизма настройки и расширенной безопасности (настройка устройств, обновление, NTP, SSL, мониторинг)
- G - профиль сетевых видеорегистраторов (NVR), систем управления зданиями и PSIM (управление и контроль записи, передача аудио и мета-информации);
Устройство поддерживающее ONVIF может поддерживать несколько профилей. Например камера с функцией записи может поддерживать профили S и G.
По предоставляемые протоколом ONVIF службы (более подробно можно ознакомиться на официальном сайте), также привожу характерные url служб для устройств с которыми я работаю:
- Access Control
- Action Engine
- Advanced Security
- Analytics
http://onvif_host/onvif/Analytics - Device IO
http://onvif_host/onvif/DeviceIO - Display
- Door Control
- Imaging
http://onvif_host/onvif/Imaging - Media
http://onvif_host/onvif/Media - PTZ (Pan, tilt, zoom - панорамирование, наклон, масштабирование)
- Receiver
- Recording Control
- Recording Search
- Replay Control
- Video Analytics Device
- 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}