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()
Пояснение к коду:
- Подключение к камере: Мы создаем объект
ONVIFCameraс указанием IP-адреса, порта, логина и пароля. Далее создается объект сервиса PTZ (create_ptz_service) для управления движением камеры. - Получение профиля: Для корректной работы с камерой необходимо получить токен профиля. Это делается с помощью метода
GetProfiles. - Создание запросов: Мы создаем запросы для движения камеры (
ContinuousMove), остановки (Stop) и изменения масштаба (zoom). - Обработка событий клавиатуры: Модуль
keyboardотслеживает нажатия клавиш и вызывает соответствующие функции для перемещения камеры или изменения масштаба. - Остановка программы: Программа завершает свою работу при нажатии клавиши
ESC.
Установка зависимостей:
Перед запуском программы убедитесь, что установлены все необходимые зависимости:
pip install onvif_zeep keyboard