package onvif import ( "fmt" "strings" ) var deviceXMLNs = []string{ `xmlns:tds="http://www.onvif.org/ver10/device/wsdl"`, `xmlns:tt="http://www.onvif.org/ver10/schema"`, } // GetDeviceInformation fetch information of ONVIF camera func (device Device) GetDeviceInformation() (DeviceInformation, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return DeviceInformation{}, err } // Parse response to interface deviceInfo, err := response.ValueForPath("Envelope.Body.GetDeviceInformationResponse") if err != nil { return DeviceInformation{}, err } // Parse interface to struct result := DeviceInformation{} if mapInfo, ok := deviceInfo.(map[string]interface{}); ok { result.Manufacturer = interfaceToString(mapInfo["Manufacturer"]) result.Model = interfaceToString(mapInfo["Model"]) result.FirmwareVersion = interfaceToString(mapInfo["FirmwareVersion"]) result.SerialNumber = interfaceToString(mapInfo["SerialNumber"]) result.HardwareID = interfaceToString(mapInfo["HardwareId"]) } return result, nil } // GetSystemDateAndTime fetch date and time from ONVIF camera func (device Device) GetSystemDateAndTime() (string, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return "", err } // Parse response dateTime, _ := response.ValueForPathString("Envelope.Body.GetSystemDateAndTimeResponse.SystemDateAndTime") return dateTime, nil } // GetCapabilities fetch info of ONVIF camera's capabilities func (device Device) GetCapabilities() (DeviceCapabilities, error) { // Create SOAP soap := SOAP{ XMLNs: deviceXMLNs, Body: ``, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return DeviceCapabilities{}, err } // Get network capabilities envelopeBodyPath := "Envelope.Body.GetCapabilitiesResponse.Capabilities" ifaceNetCap, err := response.ValueForPath(envelopeBodyPath + ".Device.Network") if err != nil { return DeviceCapabilities{}, err } netCap := NetworkCapabilities{} mapNetCap, ok := ifaceNetCap.(map[string]interface{}) if ok { netCap.DynDNS = interfaceToBool(mapNetCap["DynDNS"]) netCap.IPFilter = interfaceToBool(mapNetCap["IPFilter"]) netCap.IPVersion6 = interfaceToBool(mapNetCap["IPVersion6"]) netCap.ZeroConfig = interfaceToBool(mapNetCap["ZeroConfiguration"]) netCap.Extension = make(map[string]bool) if mapNetExtension, ok := mapNetCap["Extension"].(map[string]interface{}); ok { for key, value := range mapNetExtension { netCap.Extension[key] = interfaceToBool(value) } } } // Get events capabilities ifaceEventsCap, err := response.ValueForPath(envelopeBodyPath + ".Events") if err != nil { return DeviceCapabilities{}, err } eventsCap := make(map[string]bool) if mapEventsCap, ok := ifaceEventsCap.(map[string]interface{}); ok { for key, value := range mapEventsCap { if strings.ToLower(key) == "xaddr" { continue } key = strings.Replace(key, "WS", "", 1) eventsCap[key] = interfaceToBool(value) } } // Get events capabilities ifaceStreamingCap, err := response.ValueForPath(envelopeBodyPath + ".Media.StreamingCapabilities") if err != nil { return DeviceCapabilities{}, err } streamingCap := make(map[string]bool) if mapStreamingCap, ok := ifaceStreamingCap.(map[string]interface{}); ok { for key, value := range mapStreamingCap { key = strings.Replace(key, "_", " ", -1) streamingCap[key] = interfaceToBool(value) } } // Get PTZ capabilities ptzCap := true if _, err = response.ValueForPath(envelopeBodyPath + ".PTZ"); err != nil { ptzCap = false } // Create final result deviceCapabilities := DeviceCapabilities{ Network: netCap, Events: eventsCap, Streaming: streamingCap, PTZ: ptzCap, } return deviceCapabilities, nil } // GetDiscoveryMode fetch network discovery mode of an ONVIF camera func (device Device) GetDiscoveryMode() (string, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return "", err } // Parse response discoveryMode, _ := response.ValueForPathString("Envelope.Body.GetDiscoveryModeResponse.DiscoveryMode") return discoveryMode, nil } // GetScopes fetch scopes of an ONVIF camera func (device Device) GetScopes() ([]string, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return nil, err } // Parse response to interface ifaceScopes, err := response.ValuesForPath("Envelope.Body.GetScopesResponse.Scopes") if err != nil { return nil, err } // Convert interface to array of scope scopes := []string{} for _, ifaceScope := range ifaceScopes { if mapScope, ok := ifaceScope.(map[string]interface{}); ok { scope := interfaceToString(mapScope["ScopeItem"]) scopes = append(scopes, scope) } } return scopes, nil } // GetHostname fetch hostname of an ONVIF camera func (device Device) GetHostname() (HostnameInformation, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return HostnameInformation{}, err } // Parse response to interface ifaceHostInfo, err := response.ValueForPath("Envelope.Body.GetHostnameResponse.HostnameInformation") if err != nil { return HostnameInformation{}, err } // Parse interface to struct hostnameInfo := HostnameInformation{} if mapHostInfo, ok := ifaceHostInfo.(map[string]interface{}); ok { hostnameInfo.Name = interfaceToString(mapHostInfo["Name"]) hostnameInfo.FromDHCP = interfaceToBool(mapHostInfo["FromDHCP"]) hostnameInfo.Extension = interfaceToString(mapHostInfo["Extension"]) } return hostnameInfo, nil } // GetDNS fetch DNS of an ONVIF camera func (device Device) GetDNS() (string, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return "", err } bt, _ := response.JsonIndent("", " ") fmt.Println(string(bt)) // Parse response DNS, _ := response.ValueForPathString("Envelope.Body.GetDNSResponse.DNSInformation") return DNS, nil } // GetDNS fetch DNS of an ONVIF camera func (device Device) GetNetworkInterfaces() (string, error) { // Create SOAP soap := SOAP{ Body: "", XMLNs: deviceXMLNs, } // Send SOAP request response, err := soap.SendRequest(device.XAddr) if err != nil { return "", err } bt, _ := response.JsonIndent("", " ") fmt.Println(string(bt)) // Parse response DNS, _ := response.ValueForPathString("Envelope.Body.GetDNSResponse.DNSInformation") return DNS, nil } func interfaceToString(src interface{}) string { str, _ := src.(string) return str } func interfaceToBool(src interface{}) bool { strBool := interfaceToString(src) return strings.ToLower(strBool) == "true" }