func (dev *device) Authenticate(username, password string) {
	dev.login = username
	dev.password = password
}
Authenticate function authenticate client in the ONVIF Device.
Function takes <username> and <password> params.
You should use this function to allow authorized requests to the ONVIF Device
To change auth data call this function again.
package goonvif
import (
	"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"
	"reflect"
	"github.com/yakovlevdmv/goonvif/networking"
)
var Xlmns = map[string]string {
	"onvif":"http://www.onvif.org/ver10/schema",
	"tds":"http://www.onvif.org/ver10/device/wsdl",
	"trt":"http://www.onvif.org/ver10/media/wsdl",
	"tev":"http://www.onvif.org/ver10/events/wsdl",
	"tptz":"http://www.onvif.org/ver20/ptz/wsdl",
	"timg":"http://www.onvif.org/ver20/imaging/wsdl",
	"tan":"http://www.onvif.org/ver20/analytics/wsdl",
	"xmime":"http://www.w3.org/2005/05/xmlmime",
	"wsnt":"http://docs.oasis-open.org/wsn/b-2",
	"xop":"http://www.w3.org/2004/08/xop/include",
	"wsa":"http://www.w3.org/2005/08/addressing",
	"wstop":"http://docs.oasis-open.org/wsn/t-1",
	"wsntw":"http://docs.oasis-open.org/wsn/bw-2",
	"wsrf-rw":"http://docs.oasis-open.org/wsrf/rw-2",
	"wsaw":"http://www.w3.org/2006/05/addressing/wsdl",
}
type DeviceType int
const (
	NVD DeviceType = iota
	NVS
	NVA
	NVT
)
func (devType DeviceType) String() string {
	stringRepresentation := []string {
		"NetworkVideoDisplay",
		"NetworkVideoStorage",
		"NetworkVideoAnalytics",
		"NetworkVideoTransmitter",
	}
	i := uint8(devType)
	switch {
	case i <= uint8(NVT):
		return stringRepresentation[i]
	default:
		return strconv.Itoa(int(i))
	}
}
type deviceInfo struct {
	Manufacturer string
	Model string
	FirmwareVersion string
	SerialNumber string
	HardwareId string
}
type device struct {
	xaddr string
	login string
	password string
	endpoints map[string]string
	info deviceInfo
}
func (dev *device)GetServices() map[string]string {
	return dev.endpoints
}
func readResponse(resp *http.Response) string {
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	return string(b)
}
func GetAvailableDevicesAtSpecificEthernetInterface(interfaceName string) []device {
	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)
	for _, j := range devices {
		doc := etree.NewDocument()
		if err := doc.ReadFromString(j); err != nil {
			fmt.Errorf("%s", err.Error())
			return nil
		}
		endpoints := doc.Root().FindElements("./Body/ProbeMatches/ProbeMatch/XAddrs")
		for _, xaddr := range endpoints {
			xaddr := strings.Split(strings.Split(xaddr.Text(), " ")[0], "/")[2]
			fmt.Println(xaddr)
			c := 0
			for c = 0; c < len(nvtDevices); c++ {
				if nvtDevices[c].xaddr == xaddr {
					fmt.Println(nvtDevices[c].xaddr, "==", xaddr)
					break
				}
			}
			if c < len(nvtDevices) {
				continue
			}
			dev, err := NewDevice(strings.Split(xaddr, " ")[0])
			if err != nil {
				fmt.Println("Error", xaddr)
				fmt.Println(err)
				continue
			} else {
				nvtDevices = append(nvtDevices, *dev)
			}
		}
	}
	return nvtDevices
}
func (dev *device) getSupportedServices(resp *http.Response) {
		doc := etree.NewDocument()
		data, _ := ioutil.ReadAll(resp.Body)
		if err := doc.ReadFromBytes(data); err != nil {
			return
		}
		services := doc.FindElements("./Envelope/Body/GetCapabilitiesResponse/Capabilities/*/XAddr")
		for _, j := range services{
			dev.addEndpoint(j.Parent().Tag, j.Text())
		}
}
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")
	getCapabilities := Device.GetCapabilities{Category: "All"}
	resp, err := dev.CallMethod(getCapabilities)
	if err != nil || resp.StatusCode != http.StatusOK {
		return nil, errors.New("camera is not available at " + xaddr + " or it does not support ONVIF services")
	}
	dev.getSupportedServices(resp)
	return dev, nil
}
func (dev *device)addEndpoint(Key, Value string) {
	dev.endpoints[Key]=Value
}