golang进行onvif请求,包含PTZ、preset等

本文介绍如何使用Golang实现ONVIF协议,对网络摄像头进行PTZ控制、获取快照、设置预置点等操作。代码示例展示了如何初始化设备、认证、调用ONVIF方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Golang Onvif

使用golang进行onvif请求,主要完成 PTZ, Media, Snap, preset操作。
录像在目前项目用不上,暂时不做

package main

import (
	"fmt"
	"github.com/yakovlevdmv/goonvif"
	"github.com/yakovlevdmv/goonvif/PTZ"
	"github.com/yakovlevdmv/goonvif/xsd"
	"github.com/yakovlevdmv/goonvif/xsd/onvif"
	"io/ioutil"
	"net/http"
)

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

func main() {
	fmt.Println("Onvif test")
	dev, err := goonvif.NewDevice("192.168.50.182:80")
	if err != nil {
		fmt.Println("init device error:", err)
		return
	}
	dev.Authenticate("admin", "xxxxx")
	var tmp string

	//fmt.Println("call GetSystemDateAndTime")
	//m_tm_req := Device.GetSystemDateAndTime{}
	//m_tm_resp, err := dev.CallMethod(m_tm_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_tm_resp)
	//fmt.Println(tmp)

	//fmt.Println("call GetProfiles")
	//m_media_profiles_req := Media.GetProfiles{}
	//m_media_profiles_resp, err := dev.CallMethod(m_media_profiles_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_media_profiles_resp)
	//fmt.Println(tmp)

	//fmt.Println("call GetStreamUri")
	//m_media_url_req := Media.GetStreamUri{
	//	ProfileToken: "Profile_101",
	//}
	//m_media_url_resp, err := dev.CallMethod(m_media_url_req)
	//if err == nil {
	//	fmt.Println("resp:", readResponse(m_media_url_resp))
	//}

	//fmt.Println("call RelativeMove")
	//m_ptz_rel_req := PTZ.RelativeMove{
	//	ProfileToken: "Profile_101",
	//	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,  // -1.0 -> 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"),
	//		},
	//	},
	//}
	//m_ptz_rel_resp, err := dev.CallMethod(m_ptz_rel_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_ptz_rel_resp)
	//fmt.Println(tmp)

	//fmt.Println("call GetStatus")
	//m_ptz_stat_req := PTZ.GetStatus{
	//	ProfileToken: "Profile_101",
	//}
	//m_ptz_stat_resp, err := dev.CallMethod(m_ptz_stat_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_ptz_stat_resp)
	//fmt.Println(tmp) // x,y,zoom

	//fmt.Println("call AbsoluteMove")
	//m_ptz_abs_req := PTZ.AbsoluteMove{
	//	ProfileToken: "Profile_101",
	//	Position: onvif.PTZVector{
	//		PanTilt: onvif.Vector2D{
	//			X:     -1.0,
	//			Y:     -1.0,
	//			Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/PanTiltSpaces/PositionGenericSpace"),
	//		},
	//		Zoom: onvif.Vector1D{
	//			X:     0.0,  // 0.0 -> 1.0
	//			Space: xsd.AnyURI("http://www.onvif.org/ver10/tptz/ZoomSpaces/PositionGenericSpace"),
	//		},
	//	},
	//	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"),
	//		},
	//	},
	//}
	//m_ptz_abs_resp, err := dev.CallMethod(m_ptz_abs_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_ptz_abs_resp)
	//fmt.Println(tmp)

	//fmt.Println("call GetSnapshotUri")
	//m_ptz_snap_req := Media.GetSnapshotUri{
	//	ProfileToken: "Profile_101",
	//}
	//m_ptz_snap_resp, err := dev.CallMethod(m_ptz_snap_req)
	//if err != nil {
	//	fmt.Println("resp error!", err)
	//	return
	//}
	//tmp = readResponse(m_ptz_snap_resp)
	//fmt.Println(tmp)

	fmt.Println("call GotoPreset")
	m_ptz_preset_req := PTZ.GotoPreset{
		ProfileToken: "Profile_101",
		PresetToken:  "2",
		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"),
			},
		},
	}
	m_ptz_preset_resp, err := dev.CallMethod(m_ptz_preset_req)
	if err != nil {
		fmt.Println("resp error!", err)
		return
	}
	tmp = readResponse(m_ptz_preset_resp)
	fmt.Println(tmp)

	// 就差录视频,onvif不提供
	fmt.Println("over")
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值