嚴格意義上來說,Onvif處理這塊算不上音視訊開發的內容,為何重新整理放在音視訊開發這個類別,主要是為了方便統一管理,而且在視訊監控處理這塊,通過onvif來拿到音視訊流這是必經的階段,也算是搭邊的東西。上一篇文章寫的是onvif裝置搜尋,搜到這些裝置以後,第一件事情就是要對裝置資訊獲取一下,比如獲取視訊流地址,設定套件資訊、碼流資訊、解析度大小等,這些資訊的獲取根據具體的需要去獲取,也沒有必要全部獲取,畢竟很可能大部分的資訊用不到,按需編碼永遠都是第一原則,第二原則才是考慮拓展性和穩定性,如果基本的需求都實現不了,那就不是一個真正的軟體,考慮再多的拓展性和穩定性都是白搭,說的嚴重一點就是:所有程式語言都是垃圾,能解決實際需求並變現才是王道!
onvif裝置資訊的獲取需要注意的是,現在市場上絕大部分的攝像機都有密碼驗證的限定,先不管他預設是admin還是12345,起碼有使用者驗證的機制擺在那,這樣相對來說安全很多,不然誰也可以通過onvif協定拿到對應的資訊,就沒有安全性可言,記得幾年前海康爆出了漏洞,導致很多監控攝像頭被洩露,為此海康現在的攝像頭預設onvif是關閉的,開啟以後密碼要求各種組合,哎,想要更安全就必須犧牲便捷性,這個也不知道誰能想出一個完美兼顧的方法。
onvif主要的功能:
onvif的處理流程:
OnvifDevice::DeviceInfo *OnvifBase::getDeviceInfo()
{
if (device->deviceUrl.isEmpty()) {
return 0;
}
QString file = device->request->getSendData("GetDeviceInformation");
QByteArray dataSend = file.toUtf8();
QNetworkReply *reply = device->request->auth(device->deviceUrl, dataSend);
emit sendData(dataSend, device->deviceUrl);
OnvifDevice::DeviceInfo *deviceInfo = 0;
QByteArray dataReceive;
bool ok = device->checkData(reply, dataReceive, "獲取裝置資訊");
if (ok) {
OnvifQuery query;
query.setData(dataReceive);
QString wsdl = query.getDeviceWsdl();
QString name_path = QString("//%1:GetDeviceInformationResponse/%1:Manufacturer").arg(wsdl);
QString mod_path = QString("//%1:GetDeviceInformationResponse/%1:Model").arg(wsdl);
QString ver_path = QString("//%1:GetDeviceInformationResponse/%1:FirmwareVersion").arg(wsdl);
QString ser_path = QString("//%1:GetDeviceInformationResponse/%1:SerialNumber").arg(wsdl);
QString hard_path = QString("//%1:GetDeviceInformationResponse/%1:HardwareId").arg(wsdl);
//先將廣播搜尋到的裝置資訊一起打包
deviceInfo = new OnvifDevice::DeviceInfo;
deviceInfo->addr = device->deviceInfo.value("addr");
deviceInfo->ip = device->deviceInfo.value("ip");
deviceInfo->name = device->deviceInfo.value("name");
deviceInfo->location = device->deviceInfo.value("location");
deviceInfo->hardware = device->deviceInfo.value("hardware");
deviceInfo->manufacturer = query.getValue(name_path);
deviceInfo->model = query.getValue(mod_path);
deviceInfo->firmwareVersion = query.getValue(ver_path);
deviceInfo->serialNumber = query.getValue(ser_path);
deviceInfo->hardwareId = query.getValue(hard_path);
}
return deviceInfo;
}
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken>%1</wsse:UsernameToken>
</wsse:Security>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/>
</s:Body>
</s:Envelope>