ONVIF — это открытый отраслевой форум, который предоставляет и продвигает стандартизированные интерфейсы для эффективного взаимодействия продуктов физической безопасности на основе IP.
ONVIF протокол можно встретить на камерах безопасности. С помощью ONVIF протокола можно получать информацию с IP камер и управлять ими (устанавливать настройки, поворачивать и прочее).
Данная статья расскажет о python-onvif — клиенте ONVIF реализованным на Python. Эту программу можно считать наследницей foscam-python-lib — библиотеки Foscam Python для H.264 IP камер (FI9821W/P/HD816W/P).
В этой инструкции будут показаны рабочие примеры использования ONVIF в командной строке.
Для установки python-onvif выполните:
sudo pip3 install --upgrade onvif_zeep
Если вы получите сообщение об ошибке, что команда pip3 не найдена, то вам нужно установить пакет python3-pip (для дистрибутивов на основе Debian) или python-pip (для дистрибутивов на основе Arch Linux).
Разнообразные примеры использования python-onvif (в коде Python, в скриптах, в интерактивном режиме и пр.) вы можете найти на домашней странице программы: https://github.com/quatanium/python-onvif. Документация неинформативна, и из-за того, что требуется указать директорию wsdl, путь до которой по умолчанию отличается от используемого в примерах, а также различается от дистрибутива к дистрибутиву, все примеры оказываются нерабочими.
Поэтому использование python-onvif предлагаю рассмотреть на примере рабочего кода.
Создайте файл extractor.py со следующим содержимым:
import sys from onvif import ONVIFCamera # проверяем, был ли указан пользователь для подключения. Если нет - используем пустую строку в качестве имени пользователя if len(sys.argv) < 4: user = '' else: user = sys.argv[3] # проверяем, был ли указан пароль для подключения. Если нет - используем пустую строку в качестве пароля if len(sys.argv) < 5: password = '' else: password = sys.argv[4] # Создаём объект с указанием хоста, порта, пользователя, пароля и пути до wsdl mycam = ONVIFCamera(sys.argv[1], sys.argv[2], user, password, '/usr/lib/python3.9/site-packages/wsdl/') # запрашиваем и выводим информацию об устройстве resp = mycam.devicemgmt.GetDeviceInformation() print (str(resp)) # запрашиваем и выводим информацию о сетевых интерфейсах resp = mycam.devicemgmt.GetNetworkInterfaces() print (str(resp)) # запрашиваем адрес медиа потока media_service = mycam.create_media_service() profiles = media_service.GetProfiles() token = profiles[0].token mycam = media_service.create_type('GetStreamUri') mycam.ProfileToken = token mycam.StreamSetup = {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}} print(media_service.GetStreamUri(mycam))
Обратите внимание на строку
/usr/local/lib/python3.9/site-packages/wsdl/
Вам нужно заменить её на ваше собственное значение. Эта строка подойдёт для Kali Linux. А в BlackArch/Arch Linux нужно использовать следующую строку:
/usr/lib/python3.9/site-packages/wsdl/
При изменении версии Python, строка также может измениться.
Путь до неё можно узнать по следующему алгоритму:
sudo updatedb # Обновляем информацию о файлах locate accesscontrol.wsdl # Ищем файл, который находится в нужной директории
К примеру найдено:
/usr/local/lib/python3.9/site-packages/wsdl/accesscontrol.wsdl
Берём всю строку, кроме имени файла, то есть /usr/local/lib/python3.9/site-packages/wsdl/.
Запускать так:
python3 extractor.py ХОСТ ПОРТ [ИМЯ_ПОЛЬЗОВАТЕЛЯ] [ПАРОЛЬ]
Скрипт делает три отдельных запроса и выводит три группы данных: информацию об устройстве, о сетевых интерфейсах и о медиа потоке.
ИМЯ_ПОЛЬЗОВАТЕЛЯ и ПАРОЛЬ указывать необязательно — в случае их отсутствия будет сделана попытка подключиться с пустыми учётными данными.
Пример запуска:
python3 extractor.py 118.39.210.69 80
Пример вывода:
{ 'Manufacturer': 'BOSCH', 'Model': 'AUTODOME IP starlight 7000 HD', 'FirmwareVersion': '25500593', 'SerialNumber': '044123455', 'HardwareId': 'F0004D43' } [{ 'Enabled': True, 'Info': { 'Name': 'Network Interface 1', 'HwAddress': '00-07-5f-8b-5d-2b', 'MTU': 1514 }, 'Link': { 'AdminSettings': { 'AutoNegotiation': True, 'Speed': 100, 'Duplex': 'Full' }, 'OperSettings': { 'AutoNegotiation': True, 'Speed': 100, 'Duplex': 'Full' }, 'InterfaceType': 6 }, 'IPv4': { 'Enabled': True, 'Config': { 'Manual': [], 'LinkLocal': None, 'FromDHCP': { 'Address': '118.39.210.69', 'PrefixLength': 24 }, 'DHCP': True, '_value_1': None, '_attr_1': None } }, 'IPv6': None, 'Extension': None, 'token': '1', '_attr_1': { } }] { 'Uri': 'rtsp://118.39.210.69/rtsp_tunnel?h26x=4&line=1&inst=1', 'InvalidAfterConnect': False, 'InvalidAfterReboot': True, 'Timeout': datetime.timedelta(0), '_value_1': None, '_attr_1': None } Производитель, MAC-адрес, URI видео: 'Manufacturer': 'BOSCH', 'HwAddress': '00-07-5f-8b-5d-2b', 'Uri': 'rtsp://118.39.210.69/rtsp_tunnel?h26x=4&line=1&inst=1',
Теперь, когда мы умеем создавать объект ONVIFCamera и выполнять с ним элементарные действия, можно вернуться на страницу https://github.com/quatanium/python-onvif за дополнительными примерами.
Также смотрите:
Связанные статьи:
- Решение проблемы со сломавшимся после обновления пакетов Pip (50%)
- Решение проблемы с ошибкой fatal error: libxml/xmlversion.h: Нет такого файла или каталога (50%)
- Решение проблемы с ошибкой ImportError: No module named requests (50%)
- Решение проблемы с ошибкой No module named pkg_resources (50%)
- Решение проблемы ModuleNotFoundError: No module named 'distutils.core' (50%)
- Как преобразовать строку в верхний регистр в Bash (RANDOM - 50%)
Привет. Получить видео потоковое мы можем благодаря этой либе?
Приветствую! С её помощью по протоколу ONVIF можно запросить URI медиапотока. С самим медиапотоком нужно работать другими инструментами (например, Как записать видео с IP камеры (RTSP поток)).
Можно ли с её помощью выключить видеорегистратор?