用onvif协议来对设备的网络信息进行获取和设置,这个操作在众多的NVR产品中,用的很少,绝大部分用户都还是习惯直接通过摄像机的web页面进去配置,其实修改网络配置的功能在大部分的NVR中都是具备的,网络的参数主要包括IP地址、子网掩码、网关地址、DNS解析地址、NTP地址、网卡信息、网络协议等,这些都可以通过不同的onvif命令来获取和设置,一直没有搞懂为啥这些要分开不同的命令去处理,其实大可以合并成一个命令嘛,搞得设置个网络信息还要post好多次的数据才行。
通过抓包发现,这些网络参数的获取命令,基本上都类似,除了鉴权的头部数据,中间都是一个关键字,所以为了最大程度的复用代码,这里将通用的post数据和解析数据整合到一个函数中,传入不同的关键字进行处理即可。
onvif主要的功能:
onvif的处理流程:
QString OnvifOther::writeData(const QString &key, const QString &value, const QString &flag,
bool xmlns, bool value4, quint8 type)
{
if (device->deviceUrl.isEmpty()) {
return QString();
}
QString file = device->request->getSendData(key, true, xmlns);
QByteArray dataSend = file.toUtf8();
//最后参数表示超时时间 一般请求都是很快的 除非对方不在线则卡很久 需要设置下超时时间
QNetworkReply *reply = device->request->post(device->deviceUrl, dataSend, 1000);
emit sendData(dataSend, device->deviceUrl);
QStringList results;
QByteArray dataReceive;
bool ok = device->checkData(reply, dataReceive, flag);
if (ok) {
OnvifQuery query;
query.setData(dataReceive);
if (type == 0) {
if (!value.isEmpty()) {
//可能有多个关键字需要获取
QStringList list = value.split("|");
foreach (QString str, list) {
QString result = value4 ? query.getValue4(str) : query.getValue3(str);
if (result != "-1") {
results << QString("%1:%2").arg(str).arg(result);
}
}
}
} else if (type == 1) {
results = query.getVideoSource();
}
}
return results.join(ResultSplit);
}
QString OnvifOther::systemReboot()
{
return writeData("SystemReboot", "Message", "重启设备");
}
QString OnvifOther::getNtp()
{
return writeData("GetNTP", "DNSname|IPv4Address", "获取NTP");
}
bool OnvifOther::setNtp(const QString &ntp, bool isIp)
{
QString wsdl = "http://www.onvif.org/ver10/device/wsdl";
QString schema = "http://www.onvif.org/ver10/schema";
QStringList list;
list << QString(" <SetNTP xmlns=\"%1\">").arg(wsdl);
list << QString(" <FromDHCP>false</FromDHCP>");
list << QString(" <NTPManual>");
list << QString(" <Type xmlns=\"%1\">%2</Type>").arg(schema).arg(isIp ? "IPv4" : "DNS");
list << QString(" <%3 xmlns=\"%1\">%2</%3>").arg(schema).arg(ntp).arg(isIp ? "IPv4Address" : "DNSname");
list << QString(" </NTPManual>");
list << QString(" </SetNTP>");
QString result = writeData(list.join("\r\n"), "SetNTPResponse", "设置NTP", false);
return result.contains("SetNTPResponse");
}
QString OnvifOther::getHostName()
{
return writeData("GetHostname", "Name", "获取主机");
}
QString OnvifOther::getGateway()
{
return writeData("GetNetworkDefaultGateway", "IPv4Address", "获取网关");
}
QString OnvifOther::getDns()
{
return writeData("GetDNS", "IPv4Address|SearchDomain", "获取NDS");
}
QString OnvifOther::getInterface()
{
return writeData("GetNetworkInterfaces", "Name|Address", "获取接口");
}
QString OnvifOther::getProtocol()
{
return writeData("GetNetworkProtocols", "Name|Port", "获取协议");
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。