mirror of
https://github.com/kerberos-io/onvif.git
synced 2025-09-27 12:12:14 +08:00
README editted, reutrn error if got 404 and return error in device constructor
This commit is contained in:
39
Device.go
39
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)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
21
README.md
21
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
|
||||
# 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
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user