Перейти к основному содержимому

ONVIF

ONVIF (Open Network Video Interface Forum) – это международный стандарт, разработанный для обеспечения совместимости между различными устройствами видеонаблюдения, такими как IP-камеры, видеорегистраторы (NVR/DVR), системы контроля доступа и другие устройства безопасности. Основная цель ONVIF заключается в упрощении интеграции различных устройств от разных производителей в единую систему видеонаблюдения, а также в обеспечении возможности их взаимодействия через открытые протоколы.

Структура стандарта ONVIF

Стандарт ONVIF включает несколько профилей, каждый из которых предназначен для выполнения определенных задач:

Профили ONVIF

Вот обновленная таблица с назначением профилей ONVIF в формате списка:

ПрофильНазначение
Profile S- Запись, поиск и воспроизведение видео.
- Управление архивами.
- Работа с NVR/DVR системами и камерами с поддержкой записи.
Profile T- Расширенная потоковая передача видео.
- Улучшенные алгоритмы сжатия (H.265).
- Метаданные: детекторы движения, аналитика.
Profile C- Интеграция систем контроля доступа (ACS / СКУД).
- Управление дверными замками, считывателями карт и другими элементами физической безопасности.
Profile G- Управление записью и настройкой камер.
- Конфигурация параметров камеры: разрешение, частота кадров, битрейт.
Profile Q- Быстрое подключение к устройствам.
- Минимизация задержек при настройке и управлении устройствами.
Profile A- Интеграция систем аналитики.
- Расширенная обработка данных с видеокамер.
Profile M- Работа с мультимедийным контентом.
- Управление аудио- и видеопотоками.

Техническая реализация стандарта ONVIF

ONVIF использует веб-сервисы для реализации своих функций. Основные компоненты технической реализации включают HTTP, SOAP и XML.

HTTP

Протокол HTTP (HyperText Transfer Protocol) является основным транспортным уровнем для обмена данными между устройствами ONVIF. Все запросы и ответы передаются через HTTP, что делает взаимодействие простым и доступным для большинства современных платформ и языков программирования.

SOAP

SOAP (Simple Object Access Protocol) – это протокол для обмена структурированными сообщениями в распределённых вычислительных системах. В контексте ONVIF, SOAP используется для передачи запросов и ответов между клиентами и серверами. Сообщения SOAP представляют собой XML-документы, содержащие данные о запросах и ответах.

XML

XML (eXtensible Markup Language) – это язык разметки, который используется для описания структуры сообщений SOAP. Каждый запрос и ответ содержат заголовки и тело сообщения, где тело представляет собой XML-документ, содержащий необходимые параметры и данные.

Onvif в Python

Для работы с ONVIF в Python существует несколько библиотек, которые позволяют легко взаимодействовать с устройствами, поддерживающими этот стандарт. Одной из наиболее популярных библиотек является onvif_zeep.

Пример установки библиотеки:

pip install onvif_zeep

Примеры использования

Простое подключение к камере

from onvif import ONVIFCamera

# Подключение к камере
mycam = ONVIFCamera('192.168.0.100', 80, 'admin', 'password')
media_service = mycam.create_media_service()

# Получение списка профилей
profiles = media_service.GetProfiles()
for profile in profiles:
print(profile.Name)

В этом примере мы подключаемся к камере с использованием IP-адреса, порта, имени пользователя и пароля. Затем получаем список профилей, доступных на этой камере.

Управление PTZ (Pan-Tilt-Zoom)

PTZ-функции позволяют управлять положением камеры (панорамирование, наклон и масштабирование).

from onvif import ONVIFCamera

# Подключение к камере
mycam = ONVIFCamera('192.168.0.100', 80, 'admin', 'password')
ptz_service = mycam.create_ptz_service()

# Получаем текущие настройки PTZ
request = ptz_service.create_type('GetStatus')
status = ptz_service.GetStatus(StatusToken=request)
print(status.Position)

# Перемещение камеры вверх
request = ptz_service.create_type('ContinuousMove')
request.Velocity.PanTilt.x = 0.1 # Скорость панорамирования
request.Velocity.PanTilt.y = -0.1 # Скорость наклона
ptz_service.ContinuousMove(request)

Этот пример демонстрирует, как получить текущее положение камеры и переместить её вверх.

Пример команды SOAP для получения статуса PTZ

Вот пример SOAP-запроса для получения текущего состояния PTZ:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body>
<GetStatus xmlns="http://www.onvif.org/ver20/ptz/wsdl">
<ProfileToken>token</ProfileToken>
</GetStatus>
</s:Body>
</s:Envelope>

Ответ будет содержать информацию о текущем положении камеры и других параметрах PTZ.

Пример программы управления камерой PTZ с клавиатуры

Для создания программы на Python 3, которая позволит управлять камерой PTZ с помощью клавиш со стрелками и зумом, нужно использовать библиотеку onvif_zeep вместе с модулем keyboard. Ниже приведен пример кода, который реализует такую функциональность:

import time
from onvif import ONVIFCamera
import keyboard

# Настройки подключения к камере
IP_ADDRESS = '192.168.0.100'
PORT = 80
USERNAME = 'admin'
PASSWORD = 'password'

# Функция для перемещения камеры
def move(ptz, request, timeout):
ptz.ContinuousMove(request)
time.sleep(timeout)
ptz.Stop({'ProfileToken': request.ProfileToken})

# Функция для изменения масштаба (зум)
def zoom(ptz, request, value, timeout):
request.Velocity.Zoom.value = value
ptz.ContinuousMove(request)
time.sleep(timeout)
ptz.Stop({'ProfileToken': request.ProfileToken})

# Соединяемся с камерой
camera = ONVIFCamera(IP_ADDRESS, PORT, USERNAME, PASSWORD)
ptz = camera.create_ptz_service()

# Получаем текущий профиль
media = camera.create_media_service()
profiles = media.GetProfiles()
token = profiles[0].token

# Запрашиваем статус PTZ
request = ptz.create_type('GetStatus')
status = ptz.GetStatus(StatusToken=token)
position = status.Position

# Создаем начальный запрос для непрерывного движения
continuous_move = ptz.create_type('ContinuousMove')
continuous_move.ProfileToken = token

while True:
if keyboard.is_pressed("left"):
continuous_move.Velocity.PanTilt.x = -0.5 # Левый поворот
move(ptz, continuous_move, 0.25)
elif keyboard.is_pressed("right"):
continuous_move.Velocity.PanTilt.x = 0.5 # Правый поворот
move(ptz, continuous_move, 0.25)
elif keyboard.is_pressed("up"):
continuous_move.Velocity.PanTilt.y = -0.5 # Движение вверх
move(ptz, continuous_move, 0.25)
elif keyboard.is_pressed("down"):
continuous_move.Velocity.PanTilt.y = 0.5 # Движение вниз
move(ptz, continuous_move, 0.25)
elif keyboard.is_pressed("+") or keyboard.is_pressed("="):
zoom(ptz, continuous_move, 0.5, 0.25) # Увеличение (Zoom In)
elif keyboard.is_pressed("-"):
zoom(ptz, continuous_move, -0.5, 0.25) # Уменьшение (Zoom Out)

# Остановка программы по нажатию клавиши ESC
if keyboard.is_pressed("esc"):
break

# Завершаем соединение с камерой
camera.close()

Пояснение к коду:

  1. Подключение к камере: Мы создаем объект ONVIFCamera с указанием IP-адреса, порта, логина и пароля. Далее создается объект сервиса PTZ (create_ptz_service) для управления движением камеры.
  2. Получение профиля: Для корректной работы с камерой необходимо получить токен профиля. Это делается с помощью метода GetProfiles.
  3. Создание запросов: Мы создаем запросы для движения камеры (ContinuousMove), остановки (Stop) и изменения масштаба (zoom).
  4. Обработка событий клавиатуры: Модуль keyboard отслеживает нажатия клавиш и вызывает соответствующие функции для перемещения камеры или изменения масштаба.
  5. Остановка программы: Программа завершает свою работу при нажатии клавиши ESC.

Установка зависимостей:

Перед запуском программы убедитесь, что установлены все необходимые зависимости:

pip install onvif_zeep keyboard

Вложения