Простое управление IP-устройствами, включая камерами. Goonvif - это реализация протокола ONVIF для управления IP-устройствами. Целью создания данной библиотеки является удобное и легкое управление IP-камерами и другими устройствами, поддерживающими стандарт ONVIF.
Для установки библиотеки необходимо воспользоваться утилитой go get:
go get github.com/ferux/goonvif
Следующие сервисы полностью реализованы:
- Device
- Media
- PTZ
- Imaging
- Подключение к устройству
- Аутентификация (если необходима)
- Определение типов данных
- Выполнение необходимого метода
Если в сети находится устройство по адресу 192.168.13.42, а ее ONVIF сервисы используют порт 1234, тогда подключиться к устройству можно следующим способом:
dev, err := goonvif.NewDevice("192.168.13.42:1234")
ONVIF порт может отличаться в зависимости от устройства и, чтобы узнать, какой порт использовать, можно зайти в веб-интерфейс устройства. Обычно это 80 порт.
Если какая-либо функция одного из сервисов ONVIF требует аутентификацию, необходимо использовать метод Authenticate
.
device := onvif.NewDevice("192.168.13.42:1234")
device.Authenticate("username", "password")
Каждому сервису ONVIF в этой библиотеке соответствует свой пакет, в котором определены все типы данных этого сервиса, причем название пакета идентично названию сервиса и начинается с заглавной буквы.
В Goonvif определены структуры для каждой функции каждого поддерживаемого этой библиотекой сервиса ONVIF.
Определим тип данных функции GetCapabilities
сервиса Device
. Это делается следующим образом:
capabilities := Device.GetCapabilities{Category:"All"}
Почему у структуры GetCapabilities поле Category и почему значение этого поля All?
На рисунке ниже показана документация функции GetCapabilities. Видно, что функция принимает один пареметр Category и его значение должно быть одно из следующих: 'All', 'Analytics', 'Device', 'Events', 'Imaging', 'Media' или 'PTZ'
.
Пример определения типа данных функции GetServiceCapabilities сервиса PTZ:
ptzCapabilities := PTZ.GetServiceCapabilities{}
На рисунке ниже видно, что GetServiceCapabilities не принимает никаких аргументов.
Общие типы данных находятся в пакете xsd/onvif. Типы данных (структуры), которые могут быть общими для всех сервисов определены в пакете onvif.
Пример оределения типа данных функции CreateUsers сервиса Device:
createUsers := Device.CreateUsers{User: onvif.User{Username:"admin", Password:"qwerty", UserLevel:"User"}}
По рисунку ниже видно, что в данном примере полем структуры CreateUsers должен быть User, типом данных которого является структура User, содержащая поля Username, Password, UserLevel и необязательный Extension. Структура User находится в пакете onvif.
Для выполнения какой-либо функции одного из сервисов ONVIF, структура которой была определена, необходимо использовать CallMethod
объекта device.
createUsers := Device.CreateUsers{User: onvif.User{Username:"admin", Password:"qwerty", UserLevel:"User"}}
device := onvif.NewDevice("192.168.13.42:1234")
device.Authenticate("username", "password")
resp, err := dev.CallMethod(createUsers)