diff --git a/Device.go b/Device.go index ff8caea..9333289 100644 --- a/Device.go +++ b/Device.go @@ -80,6 +80,10 @@ type device struct { } +func (dev *device)GetServices() map[string]string { + return dev.endpoints +} + func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []device { /* Call an WS-Discovery Probe Message to Discover NVT type Devices @@ -123,8 +127,8 @@ func NewDevice(xaddr string) (*device, error) { systemDateTime := Device.GetDeviceInformation{} _, err := dev.CallMethod(systemDateTime) if err != nil { - panic(errors.New("camera is not available at " + xaddr + " or it does not support ONVIF services")) - return nil, err + //panic(errors.New("camera is not available at " + xaddr + " or it does not support ONVIF services")) + return nil, errors.New("camera is not available at " + xaddr + " or it does not support ONVIF services") } dev.getSupportedServices() @@ -135,10 +139,6 @@ func (dev *device)addEndpoint(Key, Value string) { dev.endpoints[Key]=Value } -func newDeviceEntity() *device { - return &device{} -} - //Authenticate function authenticate client in the ONVIF Device. //Function takes and params. //You should use this function to allow authorized requests to the ONVIF Device @@ -191,7 +191,7 @@ func (dev device) CallMethod(method interface{}) (string, error) { } return resp, err*/ - return dev.сallAuthorizedMethod(endpoint, method) + return dev.callAuthorizedMethod(endpoint, method) } else { /*resp, err := dev.сallAuthorizedMethod(endpoint, method) if err != nil { @@ -199,13 +199,13 @@ func (dev device) CallMethod(method interface{}) (string, error) { return resp, err } return resp, err*/ - return dev.сallNonAuthorizedMethod(endpoint, method) + return dev.callNonAuthorizedMethod(endpoint, method) } } //CallNonAuthorizedMethod functions call an method, defined struct without authentication data -func (dev device) сallNonAuthorizedMethod(endpoint string, method interface{}) (string, error) { +func (dev device) callNonAuthorizedMethod(endpoint string, method interface{}) (string, error) { //TODO: Get endpoint automatically /* Converting struct to xml string representation @@ -234,7 +234,7 @@ func (dev device) сallNonAuthorizedMethod(endpoint string, method interface{}) } //CallMethod functions call an method, defined struct with authentication data -func (dev device) сallAuthorizedMethod(endpoint string, method interface{}) (string, error) { +func (dev device) callAuthorizedMethod(endpoint string, method interface{}) (string, error) { /* Converting struct to xml string representation */ diff --git a/README.md b/README.md index b2fed44..df51d4a 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,41 @@ - PTZ - Video Analytics # Dependencies - +[etree](https://github.com/beevik/etree) # Установка Для установки библиотеки необходимо воспользоваться утилитой go get: -`go get github.com/yakovlevdmv/goonvif` +``` +go get github.com/yakovlevdmv/goonvif +``` # Начало работы Чтобы начать работать с камерой, необходимо создать объект `device`. Для этого необходимо воспользоваться функцией `func NewDevice(xaddr string) (*device, error)`, -которая принимает адрес ONVIF устройства и возвращает указатель на созданный объект. +которая принимает адрес ONVIF устройства и возвращает указатель на созданный объект либо ошибку. Если камера не доступна, указан неверный адрес для ONVIF сервиса камеры (возможно находся по другому порту) или же камера вообще не поддерживает ONVIF -функция вызовет ошибку. +функция вернет не `nil` error, а в качестве указателя на объект вернет `nil`. ### Пример подключения к камере Пусть камера в сети находится по адресу 192.168.13.42, а ее ONVIF сервисы расположены на 1234 порту. Тогда, -`dev := goonvif.NewDevice("192.168.13.42:1234")` +```dev, err := goonvif.NewDevice("192.168.13.42:1234")``` сработает успешно, а -`dev := goonvif.NewDevice("192.168.13.42:80")` -вызовет ошибку: -> camera is not available or it does not support ONVIF services +```dev, err := goonvif.NewDevice("192.168.13.42:80")``` +вернет нулевой объект камеры и ошибку: +> camera is not available at 192.168.13.42:80 or it does not support ONVIF services +Модернизируем код, чтобы обрабатывать ошибку и получим: +``` + dev, err := goonvif.NewDevice("192.168.13.42:80") + if err != nil { + panic(err) + } + + ///Работа с камерой + +``` +### Поддерживаемые ONVIF сервисы +Теперь, когда камера доступна, можно приступать к работе с ней. Однако стандарт ONVIF имеет множество сервисов, точка доступа (endpoint) к которым не закреплена стандартом (кроме DeviceManagment: http://onvif_host/onvif/device_service). +Поэтому дальше встает вопрос о поддерживаемых камерой сервисах и определении их endpoint'ов. +Для получения поддерживаемых камерой сервисов необходимо вызвать метод GetCapabilities сервиса DeviceManagement. +Однако данная библиотека автоматизирует данный процесс, поэтому при создании объекта device при помощи `func NewDevice(xaddr string) (*device, error)` +библиотека одновременно обрабатывает поддерживаемые камерой сервисы. Таким образом чтобы получить поддерживаемые устройством сервисы, можно воспользоваться двумя путями: +1. Вызвать метод GetCapabilities сервиса DeviceManagement(как это сделать будет рассмотрено дальше) и обработать ответ. +2. Довериться библиотеке и вызвать функцию `func (dev *device)GetServices() map[string]string`, которая вернет map[string]string, ключом которой является название сервиса, а значением - endpoint данного сервиса \ No newline at end of file diff --git a/networking/networking.go b/networking/networking.go index 928a610..b4dfd84 100644 --- a/networking/networking.go +++ b/networking/networking.go @@ -4,8 +4,8 @@ import ( "net/http" "bytes" "io/ioutil" - "github.com/pkg/errors" "strconv" + "errors" ) func SendSoap(endpoint, message string) (string, error) {