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