Expose Device type for outer developer using & format code file

This commit is contained in:
Eamon
2018-05-16 14:12:18 +08:00
parent 494e918db8
commit 57dc05360e

View File

@@ -2,20 +2,22 @@ package goonvif
import ( import (
"encoding/xml" "encoding/xml"
"fmt"
"github.com/beevik/etree"
"github.com/yakovlevdmv/gosoap"
"strconv"
"net/http"
"io/ioutil"
"github.com/yakovlevdmv/WS-Discovery"
"strings"
"github.com/yakovlevdmv/goonvif/Device"
"errors" "errors"
"fmt"
"io/ioutil"
"net/http"
"reflect" "reflect"
"strconv"
"strings"
"github.com/beevik/etree"
"github.com/use-go/go-onvif/device"
"github.com/yakovlevdmv/WS-Discovery"
"github.com/yakovlevdmv/goonvif/networking" "github.com/yakovlevdmv/goonvif/networking"
"github.com/yakovlevdmv/gosoap"
) )
//Xlmns XML Scheam
var Xlmns = map[string]string{ var Xlmns = map[string]string{
"onvif": "http://www.onvif.org/ver10/schema", "onvif": "http://www.onvif.org/ver10/schema",
"tds": "http://www.onvif.org/ver10/device/wsdl", "tds": "http://www.onvif.org/ver10/device/wsdl",
@@ -34,8 +36,10 @@ var Xlmns = map[string]string {
"wsaw": "http://www.w3.org/2006/05/addressing/wsdl", "wsaw": "http://www.w3.org/2006/05/addressing/wsdl",
} }
//DeviceType alias for int
type DeviceType int type DeviceType int
// Onvif Device Tyoe
const ( const (
NVD DeviceType = iota NVD DeviceType = iota
NVS NVS
@@ -66,23 +70,21 @@ type deviceInfo struct {
FirmwareVersion string FirmwareVersion string
SerialNumber string SerialNumber string
HardwareId string HardwareId string
} }
//deviceInfo struct represents an abstract ONVIF device. //Device for a new device of onvif and deviceInfo
//struct represents an abstract ONVIF device.
//It contains methods, which helps to communicate with ONVIF device //It contains methods, which helps to communicate with ONVIF device
type device struct { type Device struct {
xaddr string xaddr string
login string login string
password string password string
endpoints map[string]string endpoints map[string]string
info deviceInfo info deviceInfo
} }
func (dev *device)GetServices() map[string]string { //GetServices return available endpoints
func (dev *Device) GetServices() map[string]string {
return dev.endpoints return dev.endpoints
} }
@@ -94,12 +96,13 @@ func readResponse(resp *http.Response) string {
return string(b) return string(b)
} }
func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []device { //GetAvailableDevicesAtSpecificEthernetInterface ...
func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []Device {
/* /*
Call an WS-Discovery Probe Message to Discover NVT type Devices Call an WS-Discovery Probe Message to Discover NVT type Devices
*/ */
devices := WS_Discovery.SendProbe(interfaceName, nil, []string{"dn:" + NVT.String()}, map[string]string{"dn": "http://www.onvif.org/ver10/network/wsdl"}) devices := WS_Discovery.SendProbe(interfaceName, nil, []string{"dn:" + NVT.String()}, map[string]string{"dn": "http://www.onvif.org/ver10/network/wsdl"})
nvtDevices := make([]device, 0) nvtDevices := make([]Device, 0)
////fmt.Println(devices) ////fmt.Println(devices)
for _, j := range devices { for _, j := range devices {
doc := etree.NewDocument() doc := etree.NewDocument()
@@ -140,7 +143,7 @@ func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []devi
return nvtDevices return nvtDevices
} }
func (dev *device) getSupportedServices(resp *http.Response) { func (dev *Device) getSupportedServices(resp *http.Response) {
//resp, err := dev.CallMethod(Device.GetCapabilities{Category:"All"}) //resp, err := dev.CallMethod(Device.GetCapabilities{Category:"All"})
//if err != nil { //if err != nil {
// log.Println(err.Error()) // log.Println(err.Error())
@@ -164,13 +167,13 @@ func (dev *device) getSupportedServices(resp *http.Response) {
} }
//NewDevice function construct a ONVIF Device entity //NewDevice function construct a ONVIF Device entity
func NewDevice(xaddr string) (*device, error) { 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")
getCapabilities := Device.GetCapabilities{Category: "All"} getCapabilities := device.GetCapabilities{Category: "All"}
resp, err := dev.CallMethod(getCapabilities) resp, err := dev.CallMethod(getCapabilities)
//fmt.Println(resp.Request.Host) //fmt.Println(resp.Request.Host)
@@ -184,7 +187,7 @@ func NewDevice(xaddr string) (*device, error) {
return dev, nil return dev, nil
} }
func (dev *device)addEndpoint(Key, Value string) { func (dev *Device) addEndpoint(Key, Value string) {
dev.endpoints[Key] = Value dev.endpoints[Key] = Value
} }
@@ -192,17 +195,16 @@ func (dev *device)addEndpoint(Key, Value string) {
//Function takes <username> and <password> params. //Function takes <username> and <password> params.
//You should use this function to allow authorized requests to the ONVIF Device //You should use this function to allow authorized requests to the ONVIF Device
//To change auth data call this function again. //To change auth data call this function again.
func (dev *device) Authenticate(username, password string) { func (dev *Device) Authenticate(username, password string) {
dev.login = username dev.login = username
dev.password = password dev.password = password
} }
//GetEndpoint returns specific ONVIF service endpoint address //GetEndpoint returns specific ONVIF service endpoint address
func (dev *device) GetEndpoint(name string) string { func (dev *Device) GetEndpoint(name string) string {
return dev.endpoints[name] return dev.endpoints[name]
} }
func buildMethodSOAP(msg string) (gosoap.SoapMessage, error) { 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 {
@@ -212,7 +214,6 @@ func buildMethodSOAP(msg string) (gosoap.SoapMessage, error) {
} }
element := doc.Root() element := doc.Root()
soap := gosoap.NewEmptySOAP() soap := gosoap.NewEmptySOAP()
soap.AddBodyContent(element) soap.AddBodyContent(element)
//soap.AddRootNamespace("onvif", "http://www.onvif.org/ver10/device/wsdl") //soap.AddRootNamespace("onvif", "http://www.onvif.org/ver10/device/wsdl")
@@ -220,21 +221,24 @@ func buildMethodSOAP(msg string) (gosoap.SoapMessage, error) {
return soap, nil return soap, nil
} }
//CallMethod functions call an method, defined <method> struct. //CallMethod functions call an method, defined <method> struct.
//You should use Authenticate method to call authorized requests. //You should use Authenticate method to call authorized requests.
func (dev device) CallMethod(method interface{}) (*http.Response, error) { func (dev Device) CallMethod(method interface{}) (*http.Response, error) {
pkgPath := strings.Split(reflect.TypeOf(method).PkgPath(), "/") pkgPath := strings.Split(reflect.TypeOf(method).PkgPath(), "/")
pkg := pkgPath[len(pkgPath)-1] pkg := pkgPath[len(pkgPath)-1]
var endpoint string var endpoint string
switch pkg { switch pkg {
case "Device": endpoint = dev.endpoints["Device"] case "Device":
case "Event": endpoint = dev.endpoints["Event"] endpoint = dev.endpoints["Device"]
case "Imaging": endpoint = dev.endpoints["Imaging"] case "Event":
case "Media": endpoint = dev.endpoints["Media"] endpoint = dev.endpoints["Event"]
case "PTZ": endpoint = dev.endpoints["PTZ"] case "Imaging":
endpoint = dev.endpoints["Imaging"]
case "Media":
endpoint = dev.endpoints["Media"]
case "PTZ":
endpoint = dev.endpoints["PTZ"]
} }
//TODO: Get endpoint automatically //TODO: Get endpoint automatically
@@ -246,7 +250,7 @@ func (dev device) CallMethod(method interface{}) (*http.Response, error) {
} }
//CallNonAuthorizedMethod functions call an method, defined <method> struct without authentication data //CallNonAuthorizedMethod functions call an method, defined <method> struct without authentication data
func (dev device) callNonAuthorizedMethod(endpoint string, method interface{}) (*http.Response, error) { func (dev Device) callNonAuthorizedMethod(endpoint string, method interface{}) (*http.Response, error) {
//TODO: Get endpoint automatically //TODO: Get endpoint automatically
/* /*
Converting <method> struct to xml string representation Converting <method> struct to xml string representation
@@ -278,7 +282,7 @@ func (dev device) callNonAuthorizedMethod(endpoint string, method interface{}) (
} }
//CallMethod functions call an method, defined <method> struct with authentication data //CallMethod functions call an method, defined <method> struct with authentication data
func (dev device) callAuthorizedMethod(endpoint string, method interface{}) (*http.Response, error) { func (dev Device) callAuthorizedMethod(endpoint string, method interface{}) (*http.Response, error) {
/* /*
Converting <method> struct to xml string representation Converting <method> struct to xml string representation
*/ */
@@ -303,7 +307,6 @@ func (dev device) callAuthorizedMethod(endpoint string, method interface{}) (*ht
soap.AddRootNamespaces(Xlmns) soap.AddRootNamespaces(Xlmns)
soap.AddWSSecurity(dev.login, dev.password) soap.AddWSSecurity(dev.login, dev.password)
/* /*
Sending request and returns the response Sending request and returns the response
*/ */