天天看点

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

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

文章目录

    • Go语言实现Onvif客户端:4、配置网络信息
      • 1、思路
      • 2、代码

上一节获取到网络接口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回复信息,确认网络接口配置成功。