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