Files
onvif/cmd/camera-example/main.go
Cedric Verstraeten 8902e4e789 upgrade onvif library
2023-12-18 20:16:21 +01:00

133 lines
3.2 KiB
Go

package main
import (
"encoding/json"
"encoding/xml"
"fmt"
"io/ioutil"
"net/http"
"github.com/kerberos-io/onvif"
"github.com/kerberos-io/onvif/gosoap"
"github.com/kerberos-io/onvif/networking"
"github.com/gin-gonic/gin"
)
func main() {
RunApi()
}
func RunApi() {
router := gin.Default()
router.POST("/:service/:function", func(c *gin.Context) {
c.Header("Access-Control-Allow-Origin", "*")
//c.Header("Access-Control-Allow-Headers", "access-control-allow-origin, access-control-allow-headers")
serviceName := c.Param("service")
functionName := c.Param("function")
username := c.GetHeader("username")
pass := c.GetHeader("password")
xaddr := c.GetHeader("xaddr")
acceptedData, err := c.GetRawData()
if err != nil {
fmt.Println(err)
}
dev, err := onvif.NewDevice(onvif.DeviceParams{
Xaddr: xaddr,
Username: username,
Password: pass,
})
message, err := CallOnvifFunction(dev, serviceName, functionName, string(acceptedData))
if err != nil {
c.XML(http.StatusBadRequest, err.Error())
} else {
c.String(http.StatusOK, message)
}
})
router.Run()
}
func CallOnvifFunction(dev *onvif.Device, serviceName, functionName, acceptedData string) (string, error) {
function, err := functionByServiceAndFunctionName(serviceName, functionName)
if err != nil {
return "", err
}
request := function.Request()
if len(acceptedData) > 0 {
err = json.Unmarshal([]byte(acceptedData), request)
if err != nil {
return "", err
}
}
requestBody, err := xml.Marshal(request)
if err != nil {
return "", err
}
endpoint, err := dev.GetEndpointByRequestStruct(request)
if err != nil {
return "", err
}
soap := gosoap.NewEmptySOAP()
soap.AddStringBodyContent(string(requestBody))
soap.AddRootNamespaces(onvif.Xlmns)
soap.AddWSSecurity(dev.GetDeviceParams().Username, dev.GetDeviceParams().Password)
servResp, err := networking.SendSoap(new(http.Client), endpoint, soap.String())
if err != nil {
return "", err
}
rsp, err := ioutil.ReadAll(servResp.Body)
if err != nil {
return "", err
}
responseEnvelope := gosoap.NewSOAPEnvelope(function.Response())
err = xml.Unmarshal(rsp, responseEnvelope)
if err != nil {
return "", err
}
if responseEnvelope.Body.Fault != nil {
jsonData, err := json.Marshal(responseEnvelope.Body.Fault)
if err != nil {
return "", err
}
return string(jsonData), nil
} else {
jsonData, err := json.Marshal(responseEnvelope.Body.Content)
if err != nil {
return "", err
}
return string(jsonData), nil
}
}
func functionByServiceAndFunctionName(serviceName, functionName string) (onvif.Function, error) {
var function onvif.Function
var exist bool
switch serviceName {
case onvif.DeviceWebService:
function, exist = onvif.DeviceFunctionMap[functionName]
if !exist {
return nil, fmt.Errorf("the web service '%s'not support the function '%s'", serviceName, functionName)
}
case onvif.MediaWebService:
function, exist = onvif.MediaFunctionMap[functionName]
if !exist {
return nil, fmt.Errorf("the web service '%s' not support the function '%s'", serviceName, functionName)
}
default:
return nil, fmt.Errorf("not support the web service '%s'", serviceName)
}
return function, nil
}