From 4966762ce017e95026e20deb3b51ce403680fe84 Mon Sep 17 00:00:00 2001 From: yakovlevdmv Date: Sat, 7 Apr 2018 18:22:03 +0300 Subject: [PATCH] README editted, reutrn error if got 404 and return error in device constructor --- Device.go | 39 +++++++++++++++++++++++++++++++-------- README.md | 23 +++++++++++++++++++++-- networking/networking.go | 7 +++++++ 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/Device.go b/Device.go index 284b582..ff8caea 100644 --- a/Device.go +++ b/Device.go @@ -2,16 +2,16 @@ package goonvif import ( "encoding/xml" - "log" "fmt" "github.com/beevik/etree" "github.com/yakovlevdmv/gosoap" "strconv" "github.com/yakovlevdmv/WS-Discovery" - "github.com/yakovlevdmv/goonvif/Networking" + "github.com/yakovlevdmv/goonvif/networking" "reflect" "strings" "github.com/yakovlevdmv/goonvif/Device" + "errors" ) var xlmns = map[string]string { @@ -96,31 +96,39 @@ func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []devi func (dev *device) getSupportedServices() { resp, err := dev.CallMethod(Device.GetCapabilities{}) if err != nil { - log.Println(err.Error()) + //log.Println(err.Error()) return } else { doc := etree.NewDocument() if err := doc.ReadFromString(resp); err != nil { - log.Println(err.Error()) + //log.Println(err.Error()) return } services := doc.FindElements("./Envelope/Body/GetCapabilitiesResponse/Capabilities/*/XAddr") for _, j := range services{ - fmt.Println(j.Text()) - fmt.Println(j.Parent().Tag) + //fmt.Println(j.Text()) + //fmt.Println(j.Parent().Tag) dev.addEndpoint(j.Parent().Tag, j.Text()) } } } //NewDevice function construct a ONVIF Device entity -func NewDevice(xaddr string) *device { +func NewDevice(xaddr string) (*device, error) { dev := new(device) dev.xaddr = xaddr dev.endpoints = make(map[string]string) dev.addEndpoint("Device", "http://"+xaddr+"/onvif/device_service") + + 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 + } + dev.getSupportedServices() - return dev + return dev, nil } func (dev *device)addEndpoint(Key, Value string) { @@ -144,6 +152,7 @@ func buildMethodSOAP(msg string) (gosoap.SoapMessage, error) { doc := etree.NewDocument() if err := doc.ReadFromString(msg); err != nil { //log.Println("Got error") + return "", err } element := doc.Root() @@ -175,9 +184,23 @@ func (dev device) CallMethod(method interface{}) (string, error) { //TODO: Get endpoint automatically if dev.login != "" && dev.password != "" { + /*resp, err := dev.сallAuthorizedMethod(endpoint, method) + if err != nil { + panic(err) + return resp, err + } + + return resp, err*/ return dev.сallAuthorizedMethod(endpoint, method) } else { + /*resp, err := dev.сallAuthorizedMethod(endpoint, method) + if err != nil { + panic(err) + return resp, err + } + return resp, err*/ return dev.сallNonAuthorizedMethod(endpoint, method) + } } diff --git a/README.md b/README.md index e8cba98..b2fed44 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,26 @@ # Goonvif -Библиотека Goonvif создана для упрощения взаимодействия с ONVIF устройствами. На данный момент в библиотеке реализована поддержка NVT(Network Video Transmitter) устройств, а именно следующих ONVIF сервисов: +Библиотека **Goonvif** создана для упрощения взаимодействия с ONVIF устройствами. На данный момент в библиотеке реализована поддержка NVT(Network Video Transmitter) устройств, а именно следующих ONVIF сервисов: - Core или DeviceManagement - Media - Imaging - PTZ -- Video Analytics \ No newline at end of file +- Video Analytics +# Dependencies + +# Установка +Для установки библиотеки необходимо воспользоваться утилитой go get: +`go get github.com/yakovlevdmv/goonvif` + +# Начало работы +Чтобы начать работать с камерой, необходимо создать объект `device`. +Для этого необходимо воспользоваться функцией `func NewDevice(xaddr string) (*device, error)`, +которая принимает адрес ONVIF устройства и возвращает указатель на созданный объект. +Если камера не доступна, указан неверный адрес для ONVIF сервиса камеры (возможно находся по другому порту) или же камера вообще не поддерживает ONVIF +функция вызовет ошибку. +### Пример подключения к камере +Пусть камера в сети находится по адресу 192.168.13.42, а ее ONVIF сервисы расположены на 1234 порту. Тогда, +`dev := 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 diff --git a/networking/networking.go b/networking/networking.go index bd1a69d..928a610 100644 --- a/networking/networking.go +++ b/networking/networking.go @@ -4,6 +4,8 @@ import ( "net/http" "bytes" "io/ioutil" + "github.com/pkg/errors" + "strconv" ) func SendSoap(endpoint, message string) (string, error) { @@ -13,10 +15,15 @@ func SendSoap(endpoint, message string) (string, error) { if err != nil { return "", err } + if resp.StatusCode != http.StatusOK { + return "", errors.New("error: got HTTP response status " + strconv.Itoa(resp.StatusCode)) + } b, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } + //log.Println(resp.StatusCode) + return string(b),nil }