天天看點

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回複資訊,确認網絡接口配置成功。