README editted, reutrn error if got 404 and return error in device constructor

This commit is contained in:
yakovlevdmv
2018-04-07 18:22:03 +03:00
parent 1aee7f15e3
commit 4966762ce0
3 changed files with 59 additions and 10 deletions

View File

@@ -2,16 +2,16 @@ package goonvif
import ( import (
"encoding/xml" "encoding/xml"
"log"
"fmt" "fmt"
"github.com/beevik/etree" "github.com/beevik/etree"
"github.com/yakovlevdmv/gosoap" "github.com/yakovlevdmv/gosoap"
"strconv" "strconv"
"github.com/yakovlevdmv/WS-Discovery" "github.com/yakovlevdmv/WS-Discovery"
"github.com/yakovlevdmv/goonvif/Networking" "github.com/yakovlevdmv/goonvif/networking"
"reflect" "reflect"
"strings" "strings"
"github.com/yakovlevdmv/goonvif/Device" "github.com/yakovlevdmv/goonvif/Device"
"errors"
) )
var xlmns = map[string]string { var xlmns = map[string]string {
@@ -96,31 +96,39 @@ func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []devi
func (dev *device) getSupportedServices() { func (dev *device) getSupportedServices() {
resp, err := dev.CallMethod(Device.GetCapabilities{}) resp, err := dev.CallMethod(Device.GetCapabilities{})
if err != nil { if err != nil {
log.Println(err.Error()) //log.Println(err.Error())
return return
} else { } else {
doc := etree.NewDocument() doc := etree.NewDocument()
if err := doc.ReadFromString(resp); err != nil { if err := doc.ReadFromString(resp); err != nil {
log.Println(err.Error()) //log.Println(err.Error())
return return
} }
services := doc.FindElements("./Envelope/Body/GetCapabilitiesResponse/Capabilities/*/XAddr") services := doc.FindElements("./Envelope/Body/GetCapabilitiesResponse/Capabilities/*/XAddr")
for _, j := range services{ for _, j := range services{
fmt.Println(j.Text()) //fmt.Println(j.Text())
fmt.Println(j.Parent().Tag) //fmt.Println(j.Parent().Tag)
dev.addEndpoint(j.Parent().Tag, j.Text()) dev.addEndpoint(j.Parent().Tag, j.Text())
} }
} }
} }
//NewDevice function construct a ONVIF Device entity //NewDevice function construct a ONVIF Device entity
func NewDevice(xaddr string) *device { func NewDevice(xaddr string) (*device, error) {
dev := new(device) dev := new(device)
dev.xaddr = xaddr dev.xaddr = xaddr
dev.endpoints = make(map[string]string) dev.endpoints = make(map[string]string)
dev.addEndpoint("Device", "http://"+xaddr+"/onvif/device_service") 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() dev.getSupportedServices()
return dev return dev, nil
} }
func (dev *device)addEndpoint(Key, Value string) { func (dev *device)addEndpoint(Key, Value string) {
@@ -144,6 +152,7 @@ func buildMethodSOAP(msg string) (gosoap.SoapMessage, error) {
doc := etree.NewDocument() doc := etree.NewDocument()
if err := doc.ReadFromString(msg); err != nil { if err := doc.ReadFromString(msg); err != nil {
//log.Println("Got error") //log.Println("Got error")
return "", err return "", err
} }
element := doc.Root() element := doc.Root()
@@ -175,9 +184,23 @@ func (dev device) CallMethod(method interface{}) (string, error) {
//TODO: Get endpoint automatically //TODO: Get endpoint automatically
if dev.login != "" && dev.password != "" { 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) return dev.сallAuthorizedMethod(endpoint, method)
} else { } else {
/*resp, err := dev.сallAuthorizedMethod(endpoint, method)
if err != nil {
panic(err)
return resp, err
}
return resp, err*/
return dev.сallNonAuthorizedMethod(endpoint, method) return dev.сallNonAuthorizedMethod(endpoint, method)
} }
} }

View File

@@ -1,7 +1,26 @@
# Goonvif # Goonvif
Библиотека Goonvif создана для упрощения взаимодействия с ONVIF устройствами. На данный момент в библиотеке реализована поддержка NVT(Network Video Transmitter) устройств, а именно следующих ONVIF сервисов: Библиотека **Goonvif** создана для упрощения взаимодействия с ONVIF устройствами. На данный момент в библиотеке реализована поддержка NVT(Network Video Transmitter) устройств, а именно следующих ONVIF сервисов:
- Core или DeviceManagement - Core или DeviceManagement
- Media - Media
- Imaging - Imaging
- PTZ - PTZ
- Video Analytics - 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

View File

@@ -4,6 +4,8 @@ import (
"net/http" "net/http"
"bytes" "bytes"
"io/ioutil" "io/ioutil"
"github.com/pkg/errors"
"strconv"
) )
func SendSoap(endpoint, message string) (string, error) { func SendSoap(endpoint, message string) (string, error) {
@@ -13,10 +15,15 @@ func SendSoap(endpoint, message string) (string, error) {
if err != nil { if err != nil {
return "", err 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) b, err := ioutil.ReadAll(resp.Body)
if err != nil { if err != nil {
return "", err return "", err
} }
//log.Println(resp.StatusCode)
return string(b),nil return string(b),nil
} }