Go语言利用开源库实现onvif客户端实例

Go语言利用开源库实现onvif客户端实例



目前我们在做一个智慧灯杆的项目,灯杆上有灯、显示屏、一些传感器、IPC、紧急报警等装置,对于这些设备的配置我们打算使用onvif协议进行一键配置,而项目组使用Go语言进行应用开发,因此找了一下onvif的Go语言实现开源库,然后利用一些对应的example做了实验,总结如下,后续还需要对相应的接口做二次封装。

1、开源库介绍

其它语言的开源库还蛮多的,Go不是特别多,但是还是找到了一个我感觉比较合适的:https://github.com/use-go/onvif

然后在这里有连个例子:https://github.com/use-go/onvif/tree/master/examples

go get的时候需要配置代理,否则基本跑不起来。

2、示例代码及运行结果

我们结合这里的代码:https://blog.csdn.net/bbdxf/article/details/90753006和我们上面的开源库做了一些简单的demo进行了测试,这里是测试demo:

package main

import (
	"fmt"
	goonvif "github.com/use-go/onvif"
	"github.com/use-go/onvif/device"
	"github.com/use-go/onvif/gosoap"
	"github.com/use-go/onvif/media"
	"github.com/use-go/onvif/ptz"
	"github.com/use-go/onvif/xsd"
	"github.com/use-go/onvif/xsd/onvif"
	"io/ioutil"
	"log"
	"net/http"
)

func readResponse(resp *http.Response) string {
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}
	return string(b)
}

func main() {
	dev, err := goonvif.NewDevice("40.40.40.101:80")
	if err != nil {
		fmt.Println("init device error:", err)
		return
	}
	dev.Authenticate("admin", "xxxxxx")

	systemDateAndTyme := device.GetSystemDateAndTime{}
	getCapabilities := device.GetCapabilities{Category: "All"}
	createUser := device.CreateUsers{User: onvif.User{
		Username: "TestUser2",
		Password: "TestPassword",
		UserLevel: "User",
	},
	}

	systemDateAndTymeResponse, err := dev.CallMethod(systemDateAndTyme)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(readResponse(systemDateAndTymeResponse))
	}
	getCapabilitiesResponse, err := dev.CallMethod(getCapabilities)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(getCapabilitiesResponse)))
	}
	createUserResponse, err := dev.CallMethod(createUser)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(createUserResponse)).StringIndent())
	}

	fmt.Println("call GetProfiles")
	mediaProfilesReq := media.GetProfiles{}
	mediaProfileResp, err := dev.CallMethod(mediaProfilesReq)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(mediaProfileResp)).StringIndent())
	}

	fmt.Println("call GetStreamUri")
	mediaUrlReq := media.GetStreamUri{
		ProfileToken: "Profile_101",
	}
	mediaUrlResp, err := dev.CallMethod(mediaUrlReq)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(mediaUrlResp)).StringIndent())
	}

	fmt.Println("call RelativeMove")
	ptzRelReq := ptz.RelativeMove{
		ProfileToken: "Profile_1",
		Translation: onvif.PTZVector{
			PanTilt: onvif.Vector2D{
				X: -1.0,
				Y: -1.0,
				Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace"),
			},
			Zoom: onvif.Vector1D{
				X:	-1.0,
				Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace"),
			},
		},
		Speed: onvif.PTZSpeed{
			PanTilt: onvif.Vector2D{
				X:	0.0,
				Y:	0.0,
				Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace"),
			},
			Zoom: onvif.Vector1D{
				X:	0.0,
				Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace"),
			},
		},
	}
	ptzRelResp, err := dev.CallMethod(ptzRelReq)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(ptzRelResp)).StringIndent())
	}

	fmt.Println("call GetStatus")
	ptzStatReq := ptz.GetStatus{
		ProfileToken: "Profile_1",
	}
	ptzStatResp, err := dev.CallMethod(ptzStatReq)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(gosoap.SoapMessage(readResponse(ptzStatResp)).StringIndent())
	}
}

这里是运行结果,基本的创建用户、基本的PTZ控制可以,还需要细化,这里就不多展示了:

GOROOT=C:\Users\admin\go\go1.16.2 #gosetup
GOPATH=D:\mynotes\go #gosetup
C:\Users\admin\go\go1.16.2\bin\go.exe build -o C:\Users\admin\AppData\Local\Temp\___go_build_gitee_com_yaoyecaizi_onvif_test.exe gitee.com/yaoyecaizi/onvif_test #gosetup
C:\Users\admin\AppData\Local\Temp\___go_build_gitee_com_yaoyecaizi_onvif_test.exe #gosetup
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics"><env:Body><tds:GetSystemDateAndTimeResponse><tds:SystemDateAndTime><tt:DateTimeType>Manual</tt:DateTimeType>
<tt:DaylightSavings>false</tt:DaylightSavings>
<tt:TimeZone><tt:TZ>CST-8:00:00</tt:TZ>
</tt:TimeZone>
<tt:UTCDateTime><tt:Time><tt:Hour>10</tt:Hour>
<tt:Minute>17</tt:Minute>
<tt:Second>4</tt:Second>
</tt:Time>
<tt:Date><tt:Year>2021</tt:Year>
<tt:Month>3</tt:Month>
<tt:Day>22</tt:Day>
</tt:Date>
</tt:UTCDateTime>
<tt:LocalDateTime><tt:Time><tt:Hour>18</tt:Hour>
<tt:Minute>17</tt:Minute>
<tt:Second>4</tt:Second>
</tt:Time>
<tt:Date><tt:Year>2021</tt:Year>
<tt:Month>3</tt:Month>
<tt:Day>22</tt:Day>
</tt:Date>
</tt:LocalDateTime>
</tds:SystemDateAndTime>
</tds:GetSystemDateAndTimeResponse>
</env:Body>
</env:Envelope>

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics"><env:Body><tds:GetCapabilitiesResponse><tds:Capabilities><tt:Analytics><tt:XAddr>http://40.40.40.101/onvif/Analytics</tt:XAddr>
<tt:RuleSupport>true</tt:RuleSupport>
<tt:AnalyticsModuleSupport>true</tt:AnalyticsModuleSupport>
</tt:Analytics>
<tt:Device><tt:XAddr>http://40.40.40.101/onvif/device_service</tt:XAddr>
<tt:Network><tt:IPFilter>true</tt:IPFilter>
<tt:ZeroConfiguration>true</tt:ZeroConfiguration>
<tt:IPVersion6>true</tt:IPVersion6>
<tt:DynDNS>true</tt:DynDNS>
<tt:Extension><tt:Dot11Configuration>false</tt:Dot11Configuration>
<tt:Extension><tt:DHCPv6>true</tt:DHCPv6>
<tt:Dot1XConfigurations>0</tt:Dot1XConfigurations>
</tt:Extension>
</tt:Extension>
</tt:Network>
<tt:System><tt:DiscoveryResolve>false</tt:DiscoveryResolve>
<tt:DiscoveryBye>true</tt:DiscoveryBye>
<tt:RemoteDiscovery>false</tt:RemoteDiscovery>
<tt:SystemBackup>false</tt:SystemBackup>
<tt:SystemLogging>true</tt:SystemLogging>
<tt:FirmwareUpgrade>true</tt:FirmwareUpgrade>
<tt:SupportedVersions><tt:Major>16</tt:Major>
<tt:Minor>12</tt:Minor>
</tt:SupportedVersions>
<tt:SupportedVersions><tt:Major>2</tt:Major>
<tt:Minor>60</tt:Minor>
</tt:SupportedVersions>
<tt:SupportedVersions><tt:Major>2</tt:Major>
<tt:Minor>40</tt:Minor>
</tt:SupportedVersions>
<tt:SupportedVersions><tt:Major>2</tt:Major>
<tt:Minor>20</tt:Minor>
</tt:SupportedVersions>
<tt:SupportedVersions><tt:Major>2</tt:Major>
<tt:Minor>10</tt:Minor>
</tt:SupportedVersions>
<tt:SupportedVersions><tt:Major>2</tt:Major>
<tt:Minor>0</tt:Minor>
</tt:SupportedVersions>
<tt:Extension><tt:HttpFirmwareUpgrade>true</tt:HttpFirmwareUpgrade>
<tt:HttpSystemBackup>false</tt:HttpSystemBackup>
<tt:HttpSystemLogging>false</tt:HttpSystemLogging>
<tt:HttpSupportInformation>false</tt:HttpSupportInformation>
</tt:Extension>
</tt:System>
<tt:IO><tt:InputConnectors>2</tt:InputConnectors>
<tt:RelayOutputs>1</tt:RelayOutputs>
<tt:Extension><tt:Auxiliary>false</tt:Auxiliary>
<tt:AuxiliaryCommands>nothing</tt:AuxiliaryCommands>
<tt:Extension/>
</tt:Extension>
</tt:IO>
<tt:Security><tt:TLS1.1>true</tt:TLS1.1>
<tt:TLS1.2>true</tt:TLS1.2>
<tt:OnboardKeyGeneration>false</tt:OnboardKeyGeneration>
<tt:AccessPolicyConfig>false</tt:AccessPolicyConfig>
<tt:X.509Token>false</tt:X.509Token>
<tt:SAMLToken>false</tt:SAMLToken>
<tt:KerberosToken>false</tt:KerberosToken>
<tt:RELToken>false</tt:RELToken>
<tt:Extension><tt:TLS1.0>false</tt:TLS1.0>
<tt:Extension><tt:Dot1X>false</tt:Dot1X>
<tt:SupportedEAPMethod>0</tt:SupportedEAPMethod>
<tt:RemoteUserHandling>false</tt:RemoteUserHandling>
</tt:Extension>
</tt:Extension>
</tt:Security>
</tt:Device>
<tt:Events><tt:XAddr>http://40.40.40.101/onvif/Events</tt:XAddr>
<tt:WSSubscriptionPolicySupport>true</tt:WSSubscriptionPolicySupport>
<tt:WSPullPointSupport>true</tt:WSPullPointSupport>
<tt:WSPausableSubscriptionManagerInterfaceSupport>false</tt:WSPausableSubscriptionManagerInterfaceSupport>
</tt:Events>
<tt:Imaging><tt:XAddr>http://40.40.40.101/onvif/Imaging</tt:XAddr>
</tt:Imaging>
<tt:Media><tt:XAddr>http://40.40.40.101/onvif/Media</tt:XAddr>
<tt:StreamingCapabilities><tt:RTPMulticast>true</tt:RTPMulticast>
<tt:RTP_TCP>true</tt:RTP_TCP>
<tt:RTP_RTSP_TCP>true</tt:RTP_RTSP_TCP>
</tt:StreamingCapabilities>
<tt:Extension><tt:ProfileCapabilities><tt:MaximumNumberOfProfiles>10</tt:MaximumNumberOfProfiles>
</tt:ProfileCapabilities>
</tt:Extension>
</tt:Media>
<tt:PTZ><tt:XAddr>http://40.40.40.101/onvif/PTZ</tt:XAddr>
</tt:PTZ>
<tt:Extension><hikxsd:hikCapabilities><hikxsd:XAddr>http://40.40.40.101/onvif/hik_ext</hikxsd:XAddr>
<hikxsd:IOInputSupport>true</hikxsd:IOInputSupport>
<hikxsd:PrivacyMaskSupport>true</hikxsd:PrivacyMaskSupport>
<hikxsd:PTZ3DZoomSupport>true</hikxsd:PTZ3DZoomSupport>
<hikxsd:PTZPatternSupport>true</hikxsd:PTZPatternSupport>
<hikxsd:Language>1</hikxsd:Language>
</hikxsd:hikCapabilities>
<tt:DeviceIO><tt:XAddr>http://40.40.40.101/onvif/DeviceIO</tt:XAddr>
<tt:VideoSources>1</tt:VideoSources>
<tt:VideoOutputs>0</tt:VideoOutputs>
<tt:AudioSources>1</tt:AudioSources>
<tt:AudioOutputs>1</tt:AudioOutputs>
<tt:RelayOutputs>1</tt:RelayOutputs>
</tt:DeviceIO>
<tt:Recording><tt:XAddr>http://40.40.40.101/onvif/Recording</tt:XAddr>
<tt:ReceiverSource>false</tt:ReceiverSource>
<tt:MediaProfileSource>true</tt:MediaProfileSource>
<tt:DynamicRecordings>false</tt:DynamicRecordings>
<tt:DynamicTracks>false</tt:DynamicTracks>
<tt:MaxStringLength>64</tt:MaxStringLength>
</tt:Recording>
<tt:Search><tt:XAddr>http://40.40.40.101/onvif/SearchRecording</tt:XAddr>
<tt:MetadataSearch>false</tt:MetadataSearch>
</tt:Search>
<tt:Replay><tt:XAddr>http://40.40.40.101/onvif/Replay</tt:XAddr>
</tt:Replay>
</tt:Extension>
</tds:Capabilities>
</tds:GetCapabilitiesResponse>
</env:Body>
</env:Envelope>

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics">
	<env:Body>
		<env:Fault>
			<env:Code>
				<env:Value>env:Sender</env:Value>
				<env:Subcode>
					<env:Value>ter:OperationProhibited</env:Value>
					<env:Subcode>
						<env:Value>ter:UsernameClash</env:Value>
					</env:Subcode>
				</env:Subcode>
			</env:Code>
			<env:Reason>
				<env:Text xml:lang="en">Username already exists.</env:Text>
			</env:Reason>
			<env:Node>http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver</env:Node>
			<env:Role>http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver</env:Role>
			<env:Detail>
				<env:Text>NULL</env:Text>
			</env:Detail>
		</env:Fault>
	</env:Body>
</env:Envelope>

call GetProfiles
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics">
	<env:Body>
		<trt:GetProfilesResponse>
			<trt:Profiles token="Profile_1" fixed="true">
				<tt:Name>mainStream</tt:Name>
				<tt:VideoSourceConfiguration token="VideoSourceToken">
					<tt:Name>VideoSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>VideoSource_1</tt:SourceToken>
					<tt:Bounds x="0" y="0" width="1920" height="1080"/>
				</tt:VideoSourceConfiguration>
				<tt:AudioSourceConfiguration token="AudioSourceConfigToken">
					<tt:Name>AudioSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>AudioSourceChannel</tt:SourceToken>
				</tt:AudioSourceConfiguration>
				<tt:VideoEncoderConfiguration token="VideoEncoderToken_1">
					<tt:Name>VideoEncoder_1</tt:Name>
					<tt:UseCount>1</tt:UseCount>
					<tt:Encoding>H264</tt:Encoding>
					<tt:Resolution>
						<tt:Width>1920</tt:Width>
						<tt:Height>1080</tt:Height>
					</tt:Resolution>
					<tt:Quality>3.000000</tt:Quality>
					<tt:RateControl>
						<tt:FrameRateLimit>25</tt:FrameRateLimit>
						<tt:EncodingInterval>1</tt:EncodingInterval>
						<tt:BitrateLimit>4096</tt:BitrateLimit>
					</tt:RateControl>
					<tt:H264>
						<tt:GovLength>50</tt:GovLength>
						<tt:H264Profile>High</tt:H264Profile>
					</tt:H264>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8860</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:VideoEncoderConfiguration>
				<tt:AudioEncoderConfiguration token="MainAudioEncoderToken">
					<tt:Name>AudioEncoderConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:Encoding>G711</tt:Encoding>
					<tt:Bitrate>64</tt:Bitrate>
					<tt:SampleRate>8</tt:SampleRate>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8862</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:AudioEncoderConfiguration>
				<tt:VideoAnalyticsConfiguration token="VideoAnalyticsToken">
					<tt:Name>VideoAnalyticsName</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:AnalyticsEngineConfiguration>
						<tt:AnalyticsModule Name="MyCellMotionModule" Type="tt:CellMotionEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Layout">
									<tt:CellLayout Columns="22" Rows="18">
										<tt:Transformation>
											<tt:Translate x="-1.000000" y="-1.000000"/>
											<tt:Scale x="0.090909" y="0.111111"/>
										</tt:Transformation>
									</tt:CellLayout>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyLineDetectorModule" Type="tt:LineDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyFieldDetectorModule" Type="tt:FieldDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyTamperDetecModule" Type="hikxsd:TamperEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Transformation">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002841" y="0.003472"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="576"/>
											<tt:Point x="704" y="576"/>
											<tt:Point x="704" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
					</tt:AnalyticsEngineConfiguration>
					<tt:RuleEngineConfiguration>
						<tt:Rule Name="MyMotionDetectorRule" Type="tt:CellMotionDetector">
							<tt:Parameters>
								<tt:SimpleItem Name="MinCount" Value="5"/>
								<tt:SimpleItem Name="AlarmOnDelay" Value="1000"/>
								<tt:SimpleItem Name="AlarmOffDelay" Value="1000"/>
								<tt:SimpleItem Name="ActiveCells" Value="0P8A8A=="/>
							</tt:Parameters>
						</tt:Rule>
						<tt:Rule Name="MyTamperDetectorRule" Type="hikxsd:TamperDetector">
							<tt:Parameters>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:Rule>
					</tt:RuleEngineConfiguration>
				</tt:VideoAnalyticsConfiguration>
				<tt:PTZConfiguration token="PTZToken">
					<tt:Name>PTZ</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:NodeToken>PTZNODETOKEN</tt:NodeToken>
					<tt:DefaultAbsolutePantTiltPositionSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:DefaultAbsolutePantTiltPositionSpace>
					<tt:DefaultAbsoluteZoomPositionSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:DefaultAbsoluteZoomPositionSpace>
					<tt:DefaultRelativePanTiltTranslationSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace</tt:DefaultRelativePanTiltTranslationSpace>
					<tt:DefaultRelativeZoomTranslationSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace</tt:DefaultRelativeZoomTranslationSpace>
					<tt:DefaultContinuousPanTiltVelocitySpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace</tt:DefaultContinuousPanTiltVelocitySpace>
					<tt:DefaultContinuousZoomVelocitySpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace</tt:DefaultContinuousZoomVelocitySpace>
					<tt:DefaultPTZSpeed>
						<tt:PanTilt x="0.100000" y="0.100000" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace"/>
						<tt:Zoom x="1.000000" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace"/>
					</tt:DefaultPTZSpeed>
					<tt:DefaultPTZTimeout>PT300S</tt:DefaultPTZTimeout>
					<tt:PanTiltLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
							<tt:YRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:YRange>
						</tt:Range>
					</tt:PanTiltLimits>
					<tt:ZoomLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>0.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
						</tt:Range>
					</tt:ZoomLimits>
				</tt:PTZConfiguration>
				<tt:Extension>
					<tt:AudioOutputConfiguration token="AudioOutputConfigToken">
						<tt:Name>AudioOutputConfigName</tt:Name>
						<tt:UseCount>3</tt:UseCount>
						<tt:OutputToken>AudioOutputToken</tt:OutputToken>
						<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Auto</tt:SendPrimacy>
						<tt:OutputLevel>10</tt:OutputLevel>
					</tt:AudioOutputConfiguration>
					<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
						<tt:Name>AudioDecoderConfig</tt:Name>
						<tt:UseCount>3</tt:UseCount>
					</tt:AudioDecoderConfiguration>
				</tt:Extension>
			</trt:Profiles>
			<trt:Profiles token="Profile_2" fixed="true">
				<tt:Name>subStream</tt:Name>
				<tt:VideoSourceConfiguration token="VideoSourceToken">
					<tt:Name>VideoSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>VideoSource_1</tt:SourceToken>
					<tt:Bounds x="0" y="0" width="1920" height="1080"/>
				</tt:VideoSourceConfiguration>
				<tt:AudioSourceConfiguration token="AudioSourceConfigToken">
					<tt:Name>AudioSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>AudioSourceChannel</tt:SourceToken>
				</tt:AudioSourceConfiguration>
				<tt:VideoEncoderConfiguration token="VideoEncoderToken_2">
					<tt:Name>VideoEncoder_2</tt:Name>
					<tt:UseCount>1</tt:UseCount>
					<tt:Encoding>H264</tt:Encoding>
					<tt:Resolution>
						<tt:Width>704</tt:Width>
						<tt:Height>576</tt:Height>
					</tt:Resolution>
					<tt:Quality>3.000000</tt:Quality>
					<tt:RateControl>
						<tt:FrameRateLimit>25</tt:FrameRateLimit>
						<tt:EncodingInterval>1</tt:EncodingInterval>
						<tt:BitrateLimit>1024</tt:BitrateLimit>
					</tt:RateControl>
					<tt:H264>
						<tt:GovLength>50</tt:GovLength>
						<tt:H264Profile>Main</tt:H264Profile>
					</tt:H264>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8866</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:VideoEncoderConfiguration>
				<tt:AudioEncoderConfiguration token="MainAudioEncoderToken">
					<tt:Name>AudioEncoderConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:Encoding>G711</tt:Encoding>
					<tt:Bitrate>64</tt:Bitrate>
					<tt:SampleRate>8</tt:SampleRate>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8862</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:AudioEncoderConfiguration>
				<tt:VideoAnalyticsConfiguration token="VideoAnalyticsToken">
					<tt:Name>VideoAnalyticsName</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:AnalyticsEngineConfiguration>
						<tt:AnalyticsModule Name="MyCellMotionModule" Type="tt:CellMotionEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Layout">
									<tt:CellLayout Columns="22" Rows="18">
										<tt:Transformation>
											<tt:Translate x="-1.000000" y="-1.000000"/>
											<tt:Scale x="0.090909" y="0.111111"/>
										</tt:Transformation>
									</tt:CellLayout>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyLineDetectorModule" Type="tt:LineDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyFieldDetectorModule" Type="tt:FieldDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyTamperDetecModule" Type="hikxsd:TamperEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Transformation">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002841" y="0.003472"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="576"/>
											<tt:Point x="704" y="576"/>
											<tt:Point x="704" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
					</tt:AnalyticsEngineConfiguration>
					<tt:RuleEngineConfiguration>
						<tt:Rule Name="MyMotionDetectorRule" Type="tt:CellMotionDetector">
							<tt:Parameters>
								<tt:SimpleItem Name="MinCount" Value="5"/>
								<tt:SimpleItem Name="AlarmOnDelay" Value="1000"/>
								<tt:SimpleItem Name="AlarmOffDelay" Value="1000"/>
								<tt:SimpleItem Name="ActiveCells" Value="0P8A8A=="/>
							</tt:Parameters>
						</tt:Rule>
						<tt:Rule Name="MyTamperDetectorRule" Type="hikxsd:TamperDetector">
							<tt:Parameters>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:Rule>
					</tt:RuleEngineConfiguration>
				</tt:VideoAnalyticsConfiguration>
				<tt:PTZConfiguration token="PTZToken">
					<tt:Name>PTZ</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:NodeToken>PTZNODETOKEN</tt:NodeToken>
					<tt:DefaultAbsolutePantTiltPositionSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:DefaultAbsolutePantTiltPositionSpace>
					<tt:DefaultAbsoluteZoomPositionSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:DefaultAbsoluteZoomPositionSpace>
					<tt:DefaultRelativePanTiltTranslationSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace</tt:DefaultRelativePanTiltTranslationSpace>
					<tt:DefaultRelativeZoomTranslationSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace</tt:DefaultRelativeZoomTranslationSpace>
					<tt:DefaultContinuousPanTiltVelocitySpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace</tt:DefaultContinuousPanTiltVelocitySpace>
					<tt:DefaultContinuousZoomVelocitySpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace</tt:DefaultContinuousZoomVelocitySpace>
					<tt:DefaultPTZSpeed>
						<tt:PanTilt x="0.100000" y="0.100000" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace"/>
						<tt:Zoom x="1.000000" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace"/>
					</tt:DefaultPTZSpeed>
					<tt:DefaultPTZTimeout>PT300S</tt:DefaultPTZTimeout>
					<tt:PanTiltLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
							<tt:YRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:YRange>
						</tt:Range>
					</tt:PanTiltLimits>
					<tt:ZoomLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>0.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
						</tt:Range>
					</tt:ZoomLimits>
				</tt:PTZConfiguration>
				<tt:Extension>
					<tt:AudioOutputConfiguration token="AudioOutputConfigToken">
						<tt:Name>AudioOutputConfigName</tt:Name>
						<tt:UseCount>3</tt:UseCount>
						<tt:OutputToken>AudioOutputToken</tt:OutputToken>
						<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Auto</tt:SendPrimacy>
						<tt:OutputLevel>10</tt:OutputLevel>
					</tt:AudioOutputConfiguration>
					<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
						<tt:Name>AudioDecoderConfig</tt:Name>
						<tt:UseCount>3</tt:UseCount>
					</tt:AudioDecoderConfiguration>
				</tt:Extension>
			</trt:Profiles>
			<trt:Profiles token="Profile_3" fixed="true">
				<tt:Name>thirdStream</tt:Name>
				<tt:VideoSourceConfiguration token="VideoSourceToken">
					<tt:Name>VideoSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>VideoSource_1</tt:SourceToken>
					<tt:Bounds x="0" y="0" width="1920" height="1080"/>
				</tt:VideoSourceConfiguration>
				<tt:AudioSourceConfiguration token="AudioSourceConfigToken">
					<tt:Name>AudioSourceConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:SourceToken>AudioSourceChannel</tt:SourceToken>
				</tt:AudioSourceConfiguration>
				<tt:VideoEncoderConfiguration token="VideoEncoderToken_3">
					<tt:Name>VideoEncoder_3</tt:Name>
					<tt:UseCount>1</tt:UseCount>
					<tt:Encoding>H264</tt:Encoding>
					<tt:Resolution>
						<tt:Width>1280</tt:Width>
						<tt:Height>720</tt:Height>
					</tt:Resolution>
					<tt:Quality>3.000000</tt:Quality>
					<tt:RateControl>
						<tt:FrameRateLimit>25</tt:FrameRateLimit>
						<tt:EncodingInterval>1</tt:EncodingInterval>
						<tt:BitrateLimit>1024</tt:BitrateLimit>
					</tt:RateControl>
					<tt:H264>
						<tt:GovLength>50</tt:GovLength>
						<tt:H264Profile>Main</tt:H264Profile>
					</tt:H264>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8872</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:VideoEncoderConfiguration>
				<tt:AudioEncoderConfiguration token="MainAudioEncoderToken">
					<tt:Name>AudioEncoderConfig</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:Encoding>G711</tt:Encoding>
					<tt:Bitrate>64</tt:Bitrate>
					<tt:SampleRate>8</tt:SampleRate>
					<tt:Multicast>
						<tt:Address>
							<tt:Type>IPv4</tt:Type>
							<tt:IPv4Address>0.0.0.0</tt:IPv4Address>
						</tt:Address>
						<tt:Port>8862</tt:Port>
						<tt:TTL>128</tt:TTL>
						<tt:AutoStart>false</tt:AutoStart>
					</tt:Multicast>
					<tt:SessionTimeout>PT5S</tt:SessionTimeout>
				</tt:AudioEncoderConfiguration>
				<tt:VideoAnalyticsConfiguration token="VideoAnalyticsToken">
					<tt:Name>VideoAnalyticsName</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:AnalyticsEngineConfiguration>
						<tt:AnalyticsModule Name="MyCellMotionModule" Type="tt:CellMotionEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Layout">
									<tt:CellLayout Columns="22" Rows="18">
										<tt:Transformation>
											<tt:Translate x="-1.000000" y="-1.000000"/>
											<tt:Scale x="0.090909" y="0.111111"/>
										</tt:Transformation>
									</tt:CellLayout>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyLineDetectorModule" Type="tt:LineDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyFieldDetectorModule" Type="tt:FieldDetectorEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="50"/>
								<tt:ElementItem Name="Layout">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002000" y="0.002000"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="1000"/>
											<tt:Point x="1000" y="1000"/>
											<tt:Point x="1000" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
						<tt:AnalyticsModule Name="MyTamperDetecModule" Type="hikxsd:TamperEngine">
							<tt:Parameters>
								<tt:SimpleItem Name="Sensitivity" Value="0"/>
								<tt:ElementItem Name="Transformation">
									<tt:Transformation>
										<tt:Translate x="-1.000000" y="-1.000000"/>
										<tt:Scale x="0.002841" y="0.003472"/>
									</tt:Transformation>
								</tt:ElementItem>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="576"/>
											<tt:Point x="704" y="576"/>
											<tt:Point x="704" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:AnalyticsModule>
					</tt:AnalyticsEngineConfiguration>
					<tt:RuleEngineConfiguration>
						<tt:Rule Name="MyMotionDetectorRule" Type="tt:CellMotionDetector">
							<tt:Parameters>
								<tt:SimpleItem Name="MinCount" Value="5"/>
								<tt:SimpleItem Name="AlarmOnDelay" Value="1000"/>
								<tt:SimpleItem Name="AlarmOffDelay" Value="1000"/>
								<tt:SimpleItem Name="ActiveCells" Value="0P8A8A=="/>
							</tt:Parameters>
						</tt:Rule>
						<tt:Rule Name="MyTamperDetectorRule" Type="hikxsd:TamperDetector">
							<tt:Parameters>
								<tt:ElementItem Name="Field">
									<tt:PolygonConfiguration>
										<tt:Polygon>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
											<tt:Point x="0" y="0"/>
										</tt:Polygon>
									</tt:PolygonConfiguration>
								</tt:ElementItem>
							</tt:Parameters>
						</tt:Rule>
					</tt:RuleEngineConfiguration>
				</tt:VideoAnalyticsConfiguration>
				<tt:PTZConfiguration token="PTZToken">
					<tt:Name>PTZ</tt:Name>
					<tt:UseCount>3</tt:UseCount>
					<tt:NodeToken>PTZNODETOKEN</tt:NodeToken>
					<tt:DefaultAbsolutePantTiltPositionSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:DefaultAbsolutePantTiltPositionSpace>
					<tt:DefaultAbsoluteZoomPositionSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:DefaultAbsoluteZoomPositionSpace>
					<tt:DefaultRelativePanTiltTranslationSpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/TranslationGenericSpace</tt:DefaultRelativePanTiltTranslationSpace>
					<tt:DefaultRelativeZoomTranslationSpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/TranslationGenericSpace</tt:DefaultRelativeZoomTranslationSpace>
					<tt:DefaultContinuousPanTiltVelocitySpace>http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace</tt:DefaultContinuousPanTiltVelocitySpace>
					<tt:DefaultContinuousZoomVelocitySpace>http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace</tt:DefaultContinuousZoomVelocitySpace>
					<tt:DefaultPTZSpeed>
						<tt:PanTilt x="0.100000" y="0.100000" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/GenericSpeedSpace"/>
						<tt:Zoom x="1.000000" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/ZoomGenericSpeedSpace"/>
					</tt:DefaultPTZSpeed>
					<tt:DefaultPTZTimeout>PT300S</tt:DefaultPTZTimeout>
					<tt:PanTiltLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
							<tt:YRange>
								<tt:Min>-1.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:YRange>
						</tt:Range>
					</tt:PanTiltLimits>
					<tt:ZoomLimits>
						<tt:Range>
							<tt:URI>http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace</tt:URI>
							<tt:XRange>
								<tt:Min>0.000000</tt:Min>
								<tt:Max>1.000000</tt:Max>
							</tt:XRange>
						</tt:Range>
					</tt:ZoomLimits>
				</tt:PTZConfiguration>
				<tt:Extension>
					<tt:AudioOutputConfiguration token="AudioOutputConfigToken">
						<tt:Name>AudioOutputConfigName</tt:Name>
						<tt:UseCount>3</tt:UseCount>
						<tt:OutputToken>AudioOutputToken</tt:OutputToken>
						<tt:SendPrimacy>www.onvif.org/ver20/HalfDuplex/Auto</tt:SendPrimacy>
						<tt:OutputLevel>10</tt:OutputLevel>
					</tt:AudioOutputConfiguration>
					<tt:AudioDecoderConfiguration token="AudioDecoderConfigToken">
						<tt:Name>AudioDecoderConfig</tt:Name>
						<tt:UseCount>3</tt:UseCount>
					</tt:AudioDecoderConfiguration>
				</tt:Extension>
			</trt:Profiles>
		</trt:GetProfilesResponse>
	</env:Body>
</env:Envelope>

call GetStreamUri
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics">
	<env:Body>
		<env:Fault>
			<env:Code>
				<env:Value>env:Sender</env:Value>
				<env:Subcode>
					<env:Value>ter:InvalidArgVal</env:Value>
					<env:Subcode>
						<env:Value>ter:NoProfile</env:Value>
					</env:Subcode>
				</env:Subcode>
			</env:Code>
			<env:Reason>
				<env:Text xml:lang="en">The requested profile token ProfileToken does not exist.</env:Text>
			</env:Reason>
			<env:Node>http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver</env:Node>
			<env:Role>http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver</env:Role>
			<env:Detail>
				<env:Text>No Such ProfileToken</env:Text>
			</env:Detail>
		</env:Fault>
	</env:Body>
</env:Envelope>

call RelativeMove
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics">
	<env:Body>
		<tptz:RelativeMoveResponse/>
	</env:Body>
</env:Envelope>

call GetStatus
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl" xmlns:tev="http://www.onvif.org/ver10/events/wsdl" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:tst="http://www.onvif.org/ver10/storage/wsdl" xmlns:ter="http://www.onvif.org/ver10/error" xmlns:dn="http://www.onvif.org/ver10/network/wsdl" xmlns:tns1="http://www.onvif.org/ver10/topics" xmlns:tmd="http://www.onvif.org/ver10/deviceIO/wsdl" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl" xmlns:wsoap12="http://schemas.xmlsoap.org/wsdl/soap12" xmlns:http="http://schemas.xmlsoap.org/wsdl/http" xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsadis="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrf-bf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wsntw="http://docs.oasis-open.org/wsn/bw-2" xmlns:wsrf-rw="http://docs.oasis-open.org/wsrf/rw-2" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:wsrf-r="http://docs.oasis-open.org/wsrf/r-2" xmlns:trc="http://www.onvif.org/ver10/recording/wsdl" xmlns:tse="http://www.onvif.org/ver10/search/wsdl" xmlns:trp="http://www.onvif.org/ver10/replay/wsdl" xmlns:tnshik="http://www.hikvision.com/2011/event/topics" xmlns:hikwsd="http://www.onvifext.com/onvif/ext/ver10/wsdl" xmlns:hikxsd="http://www.onvifext.com/onvif/ext/ver10/schema" xmlns:tas="http://www.onvif.org/ver10/advancedsecurity/wsdl" xmlns:tr2="http://www.onvif.org/ver20/media/wsdl" xmlns:axt="http://www.onvif.org/ver20/analytics">
	<env:Body>
		<tptz:GetStatusResponse>
			<tptz:PTZStatus>
				<tt:Position>
					<tt:PanTilt x="-0.813500" y="-1.000000" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace"/>
					<tt:Zoom x="0.000000" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace"/>
				</tt:Position>
				<tt:MoveStatus>
					<tt:PanTilt>IDLE</tt:PanTilt>
					<tt:Zoom>IDLE</tt:Zoom>
				</tt:MoveStatus>
				<tt:Error>NO error</tt:Error>
				<tt:UtcTime>2021-03-22T10:17:04Z</tt:UtcTime>
			</tptz:PTZStatus>
		</tptz:GetStatusResponse>
	</env:Body>
</env:Envelope>


进程完成,并显示退出代码 0

至于onvif协议我们后面再细细了解并总结一下。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
实现一个 C# 的 Onvif 客户端,你需要遵循以下步骤: 1. 引用 Onvif 标准的 WSDL 文件 Onvif 标准定义了一组 Web Services Description Language (WSDL) 文件,你需要将这些文件添加到你的 C# 项目中。这些文件包含了 Onvif 标准所定义的服务接口和数据类型。 2. 生成客户端代理类 使用 Visual Studio 或者命令行工具,基于 WSDL 文件生成客户端代理类,这样你就可以使用 C# 代码调用 Onvif 标准定义的服务接口。 3. 创建客户端对象 使用生成的客户端代理类创建客户端对象,你需要提供 Onvif 设备的 IP 地址、端口号、用户名和密码等信息。 4. 调用服务接口 使用客户端对象调用 Onvif 标准定义的服务接口,例如获取设备信息、控制云台、获取视频流等操作。 下面是一个简单的示例代码,演示了如何使用 C# 实现 Onvif 客户端: ```csharp using System; using System.ServiceModel; using onvif.services; namespace onvif_client { class Program { static void Main(string[] args) { // Onvif 设备的 IP 地址、端口号、用户名和密码 string address = "http://192.168.1.100/onvif/device_service"; string username = "admin"; string password = "admin"; // 创建服务绑定和客户端对象 var binding = new BasicHttpBinding(); var endpoint = new EndpointAddress(address); var client = new DeviceClient(binding, endpoint); // 设置验证凭据 client.ClientCredentials.UserName.UserName = username; client.ClientCredentials.UserName.Password = password; try { // 调用服务接口 var response = client.GetDeviceInformation(new GetDeviceInformationRequest()); // 打印设备信息 Console.WriteLine("Manufacturer: {0}", response.Manufacturer); Console.WriteLine("Model: {0}", response.Model); Console.WriteLine("Serial Number: {0}", response.SerialNumber); } catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); } finally { // 关闭客户端 client.Close(); } } } } ``` 以上示例代码演示了如何使用 Onvif 标准定义的 GetDeviceInformation 接口获取设备信息。你可以根据需要调用其他的服务接口,实现更加复杂的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值