Go语言实现Onvif客户端:4、配置网络信息

2023-11-18

Go语言实现Onvif客户端:4、配置网络信息



上一节获取到网络接口token后,就可进行一些网络配置了,这里我们暂时只实现进行ip地址的配置接口和封装。

1、思路

  • 确认我们配置网络时需要传递的参数,对这些参数的传递进行封装
  • 对参数判断提供外部接口,内部接口调用相关接口进行请求发送和回复解析

2、代码

网络信息配置结构体:

type NetWorkConfigInfo struct {
	//是否进行IPV4网络配置
	EnableIPV4NetworkConfig bool
	//要配置的IPV4地址,不包括端口
	IPV4Address string
	//要配置的IPV4地址前缀长度,默认可设置为24
	IPV4PrefixLen int
	//是否进行IPV6网络配置
	EnableIPV6NetworkConfig bool
	//要配置的IPV6地址,例如:0:0:0:0:0:0:0:0
	IPV6Address string
	//要配置的IPV6地址前缀长度,默认可设置为120
	IPV6PrefixLen int
}

外部接口:

**
 * @Description: 配置网络
 * @time: 2021-03-30 12:34:32
 * @receiver client:onvif客户端
 * @param netWorkInfo:配置的网络信息,包括ipv4和ipv6两类,一般不配置ipv6的话可设置为“”
 * @return returnInfo:结果Code码和Info信息,Code码为0则成功,否则失败,通过获取Info查看失败原因
 */
func (client *GoOnvifClient) ConfigNetWork(netWorkInfo *NetWorkConfigInfo) returnInfo {
	if client.networkInterfaceToken == "" {
		return returnInfo{ConfigNetWorkInfoErr, "network interface token is nil."}
	}

	if netWorkInfo.IPV6PrefixLen < 0 || netWorkInfo.IPV6PrefixLen > 200 {
		return returnInfo{ConfigNetWorkInfoErr, "ipv6 prefix len err."}
	} else {
		client.netWorkConfigInfo.IPV6PrefixLen = netWorkInfo.IPV6PrefixLen
	}
	if netWorkInfo.IPV6Address == "" {
		client.netWorkConfigInfo.IPV6Address = "0:0:0:0:0:0:0:0"
		client.netWorkConfigInfo.EnableIPV6NetworkConfig = false
	} else {
		client.netWorkConfigInfo.IPV6Address = netWorkInfo.IPV6Address
		client.netWorkConfigInfo.EnableIPV6NetworkConfig = netWorkInfo.EnableIPV6NetworkConfig
	}

	if netWorkInfo.IPV4PrefixLen < 0 || netWorkInfo.IPV4PrefixLen > 25 {
		return returnInfo{ConfigNetWorkInfoErr, "ipv4 address prefix len err."}
	}
	if netWorkInfo.IPV4Address == "" {
		return returnInfo{ConfigNetWorkInfoErr, "ipv4 address is nil."}
	} else {
		client.netWorkConfigInfo.IPV4Address = netWorkInfo.IPV4Address
		client.netWorkConfigInfo.IPV4PrefixLen = netWorkInfo.IPV4PrefixLen
		client.netWorkConfigInfo.EnableIPV4NetworkConfig = netWorkInfo.EnableIPV4NetworkConfig
	}

	return client.setNetWork()
}

内部调用:

/**
 * @Description: 设置网络接口,一般用于配置IP,包括IPV4和IPV6
 * @time: 2021-03-25 17:42:22
 * @receiver client
 * @return returnInfo
 */
func (client *GoOnvifClient) setNetWork() returnInfo {
	setNetWorkReq := device.SetNetworkInterfaces{
		InterfaceToken: onvif.ReferenceToken(client.networkInterfaceToken),
		NetworkInterface: onvif.NetworkInterfaceSetConfiguration{
			Enabled: true,
			Link: onvif.NetworkInterfaceConnectionSetting{
				AutoNegotiation: true,
			},
			IPv4: onvif.IPv4NetworkInterfaceSetConfiguration{
				Enabled: xsd.Boolean(client.netWorkConfigInfo.EnableIPV4NetworkConfig),
				Manual: onvif.PrefixedIPv4Address{
					Address:      onvif.IPv4Address(client.netWorkConfigInfo.IPV4Address),
					PrefixLength: xsd.Int(client.netWorkConfigInfo.IPV4PrefixLen),
				},
			},
			IPv6: onvif.IPv6NetworkInterfaceSetConfiguration{
				Enabled: xsd.Boolean(client.netWorkConfigInfo.EnableIPV6NetworkConfig),
				Manual: onvif.PrefixedIPv6Address{
					Address:      onvif.IPv6Address(client.netWorkConfigInfo.IPV6Address),
					PrefixLength: xsd.Int(client.netWorkConfigInfo.IPV6PrefixLen),
				},
			},
		},
	}

	res := client.sendReqGetResp(ConfigNetWorkInfoErr, setNetWorkReq)
	fmt.Println(res)

	return res
}

调用示例:

//设置网络信息
networkInfo := &onvifClient.NetWorkConfigInfo{
    EnableIPV4NetworkConfig: true,
    IPV4Address:             "40.40.40.101",
    IPV4PrefixLen:           24,
    EnableIPV6NetworkConfig: false,
    IPV6Address:             "",
    IPV6PrefixLen:           120,
}
res = client.ConfigNetWork(networkInfo)
if res.Code != 0 {
    fmt.Println("set netork failed!")
    fmt.Println(res.Info)
} else {
    fmt.Println(networkInfo.IPV4Address)
}

结果:

{0 <?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:SetNetworkInterfacesResponse>
			<tds:RebootNeeded>false</tds:RebootNeeded>
		</tds:SetNetworkInterfacesResponse>
	</env:Body>
</env:Envelope>
}

如果要进一步判断网络是否设置成功,则需要读取xml回复信息,确认网络接口配置成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言实现Onvif客户端:4、配置网络信息 的相关文章

  • 具有多个等待组的管道中通道范围内的死锁

    我正在练习通过同时将计算分为 100 组来计算阶乘的挑战 我解决了 WaitGroups 上的很多问题 但仍然处于calculateFactorial函数我在通道部分的范围上陷入了僵局 希望有人能指出这个问题 谢谢 package main
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • Go 中数组的嵌套结构

    我已经开始使用https mholt github io json to go https mholt github io json to go 将 API JSON 转换为 go 结构 我真的很喜欢它 但是我对如何初始化如下所示的报告定义
  • 在 Go 中执行字节数组

    我正在尝试在 Go 程序中执行 shellcode 类似于使用其他语言执行此操作的方式 示例 1 C 程序中的 Shellcode https stackoverflow com questions 16626857 shellcode i
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 如何顺序运行 golang 测试?

    当我跑步时go test 我的输出 FAIL TestGETSearchSuccess 0 00s Location drivers api test go 283 Error Not equal 200 expected 204 actu
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux
  • 从 []byte 到 char*

    我想包装一个 C 函数 它需要一个char 指向非空字节缓冲区 的第一个元素 我正在尝试使用 CGo 将其包装在 Go 函数中 以便我可以将其传递给 byte 但我不知道如何进行转换 C 函数签名的简化版本是 void foo char c
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang 正则表达式在字符串之间替换

    我有一些可能采用以下形式的字符串 MYSTRING MYSTRING n MYSTRING n MYSTRING randomstringwithvariablelength n 我希望能够将其正则表达式为MYSTRING foo 基本上替
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan
  • 如何同时使用 LoadHTMLGlob 和 LoadHTMLFiles

    我想要来自不同子目录的分隔符逻辑模板templates文件夹 下面是我的templates文件夹 templates authentication login gohtml logout gohtml index gohtml profil
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • 2、为什么选择URP

    为什么选择URP 现在所在项目为SLG类项目 有同屏200 英雄的需求 Unity传统渲染管线的动态批处理有个限制是Skined Mesh Renderer不能进行动态批处理 英雄如果不采用Skined Mesh Renderer又不能满足
  • C++实现简单的固定大小内存分配器

    背景介绍 最近在了解性能优化相关的知识 了解到内存分配是一个可优化性能的方向 在相关书籍中看到一个固定大小的内存分配器实现 觉得挺有意思的 这里跟大家分享 据说比通用的内存分配malloc 性能有不少提升 源码实现 这里的代码是根据 c性能
  • Java会话技术

    会话技术 会话指的是客户端浏览器和服务端之间的度偶次请求和响应 当打开浏览器 访问网站地址后 会话开始 当关闭浏览器 或者到了过期时间 会话结束 就像打电话只要不挂电话就是一次会话 会话过程中产生的数据可以通过会话技术Cookie Sess
  • 抖音Scheme全网最全,startActivity地址

    例子 部分参数可省略 跳转主页并关注 snssdk1128 user profile 72673737181 refer web gd label click wap profile bottom type need follow need
  • oracle值相等时排序规则,Oracle中排序列中值相同引发的问题

    有个表 表名是Policy 有三个字段 a b c 这个表有两行 c列中的数据始终为0 我运行一下的sql语句 这个问题在Oracle的新闻中心被提出了一段时间 有个表 表名是Policy 有三个字段 a b c 这个表有两行 c列中的数据
  • vue element ui table 过滤功能实现

    Element UI代码
  • python中的list如何深度拷贝

    在 Python 中 可以使用 copy 模块中的 deepcopy 函数来进行深度拷贝 示例 import copy original list 1 2 3 4 5 6 7 8 9 copied list copy deepcopy or
  • c++全局变量的使用方式

    c 全局变量的使用方式 在cpp文件中定义 在头文件中定义 在cpp文件中定义 主函数中的使用 extern int aa extern int bb 在头文件中定义 在主函数中 在 h文件中声明 需要加extern关键字 在 cpp文件中
  • Linux环境下gcc编译链接库-lz -lrt -lm -lc都是什么库?

    编译链接库 lz lrt lm lc都是什么库 lz 压缩库 Z lrt 实时库 real time shm open系列 lm 数学库 math lc 标准C库 C lib dl 是显式加载动态库的动态函数库
  • Linux下ImageNet2012数据集下载及其配置

    简明扼要 一 训练集下载 137G http www image net org challenges LSVRC 2012 nnoupb ILSVRC2012 img train tar 验证集下载 http www image net
  • FCN模型训练中遇到的困难

    FCN模型训练中遇到的困难 标签 深度学习FCN神经网络caffe 2017 02 24 10 54 2675人阅读 评论 6 收藏 举报 分类 深度学习 18 版权声明 本文为博主原创文章 未经博主允许不得转载 前前后后大概忙了3个月了
  • 嵌入式数据库sqlite3【进阶篇】-子句和函数的使用,小白一文入门

    更多信息请关注公众号 一口Linux 在 嵌入式数据库sqlite3 基础篇 基本命令操作 小白一看就懂 一文中讲解了如何实现sqlite3的基本操作增删改查 本文介绍一些其他复杂一点的操作 比如where order by having
  • 基于内容的视频信息检索系统

    基于内容的视频信息检索系统 汪志强 江西财经大学信息管理学院 09信息管理与信息系统2班 摘 要 本文从基于内容的视频信息检索技术的发展历史出发 对基于内容的视频检索系统的技术要点及主要的功能模块进行了讨论和分析 并说明了当今技术存在的缺陷
  • MFC Windows 程序设计(一)-程序员的解放

    MFC Windows 程序设计 一 程序员的解放 程序之美 很久很久以前 程序员是一个很辛苦的工作 因为那时候大多数的软件都是用C语言编写的 Microsoft Visual Basic还没有出现 更不要说现在的Java Android
  • Tomcat修改默认端口号

    1 背景 在默认情况下 tomcat的端口是8080 使用了两个tomcat 那么就需要修改其中的一个的端口号才能使得两个同时工作 2 方法 2 1改动一 那么 如何修改tomcat的端口号呢 首先到安装目录 或者解压目录 下找到conf文
  • VUE之Echarts图表x轴y轴提示文字过长处理为省略号

    只需对显示文字格式修改即可 yAxis type category axisLine show false 轴线 axisTick show false 去除刻度 axisLabel formatter function params co
  • silk lobe资源公众号_资源合集

    11 月 十一月 iOS内置韩文字体 Apple SD Gothic Neo 锤子 黑 Smartisan 与方正合作定制的UI黑体 Emoji 鸽了好久的可爱 Emoji 字体 移植到安卓手机 沙扬娜拉 岩田仿宋 复古聚珍仿宋风格 返璞归
  • chatgpt赋能python:Python如何优化中文SEO

    Python如何优化中文SEO Python 作为一种流行的编程语言 可以用来开发各种不同的应用程序 当涉及到网络营销和搜索引擎优化 SEO 时 Python的功能也非常有用 在本篇文章中 我们将介绍如何使用Python来优化中文SEO 以
  • opencv显示对比

    在opencv中我们一般都要展示处理前后图像的对比 有时候我们会imshow两次来展示两张图片 那为什么我们不放在一个图片里呢 这样显然是更加优雅的模式 上代码 Mat combineImage Mat before Mat after a
  • Go语言实现Onvif客户端:4、配置网络信息

    Go语言实现Onvif客户端 4 配置网络信息 文章目录 Go语言实现Onvif客户端 4 配置网络信息 1 思路 2 代码 上一节获取到网络接口token后 就可进行一些网络配置了 这里我们暂时只实现进行ip地址的配置接口和封装 1 思路