zaLinux.ru

ONVIF клиент с интерфейсом командной строки


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 за дополнительными примерами.

Также смотрите:


Рекомендуемые статьи:

3 Комментарии

  1. Тим

    Привет. Получить видео потоковое мы можем благодаря этой либе? 

    1. Alexey (Автор записи)

      Приветствую! С её помощью по протоколу ONVIF можно запросить URI медиапотока. С самим медиапотоком нужно работать другими инструментами (например, Как записать видео с IP камеры (RTSP поток)).

  2. Vasiliy

    Можно ли с её помощью выключить видеорегистратор?

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *