一、前言
嚴格意義上來說,Onvif處理這塊算不上音視頻開發的內容,為何重新整理放在音視頻開發這個類別,主要是為了方便統一管理,而且在視頻監控處理這塊,通過onvif來拿到音視頻流這是必經的階段,也算是搭邊的東西,上一篇文章寫的是onvif設備搜索,搜到這些設備以后,第一件事情就是要對設備資訊獲取一下,比如獲取視頻流地址,配置套件資訊、碼流資訊、解析度大小等,這些資訊的獲取根據具體的需要去獲取,也沒有必要全部獲取,畢竟很可能大部分的資訊用不到,按需編碼永遠都是第一原則,第二原則才是考慮拓展性和穩定性,如果基本的需求都實作不了,那就不是一個真正的軟體,考慮再多的拓展性和穩定性都是白搭,說的嚴重一點就是:所有編程語言都是垃圾,能解決實際需求并變現才是王道!
onvif設備資訊的獲取需要注意的是,現在市場上絕大部分的攝像機都有密碼驗證的限定,先不管他默認是admin還是12345,起碼有用戶驗證的機制擺在那,這樣相對來說安全很多,不然誰也可以通過onvif協議拿到對應的資訊,就沒有安全性可言,記得幾年前海康爆出了漏洞,導致很多監控攝像頭被泄露,為此海康現在的攝像頭默認onvif是關閉的,開啟以后密碼要求各種組合,哎,想要更安全就必須犧牲便捷性,這個也不知道誰能想出一個完美兼顧的方法,
onvif主要的功能:
- 搜索設備,獲取設備的資訊比如廠家、型號等,
- 獲取設備的多個組態檔資訊profile,
- 獲取對應組態檔的視頻流地址rtsp,以及解析度等引數,
- 云臺控制,上下左右移動,焦距放大縮小,相對和絕對移動,
- 獲取預置位資訊,觸發預置位,
- 訂閱事件,接收設備的各種訊息尤其是報警事件比如IO口的報警,
- 抓圖,獲取設備當前的圖片,
- 獲取、創建、洗掉用戶資訊,
- 獲取和設備網路配置資訊比如IP地址等,
- 獲取和設定NTP時間同步以及設定設備時間,
- 獲取和設定視頻引數和圖片引數(亮度、色彩、飽和度),
- 重啟設備,
onvif的處理流程:
- 系結組播IP(239.255.255.250)和埠(3702),發送固定的xml格式的資料搜索設備,
- 接收到的xml格式的資料決議,得到設備的Onvif地址,
- 對Onvif地址發送對應的資料,收到資料取出對應的節點資料,
- 請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的組態檔,Ptz地址用來云臺控制,
- ptz控制是對Ptz地址發送對應的資料即可,
- 設定了用戶認證的需要組織用戶token資訊一塊發送,每次都需要作鑒權處理,
- 接收到的資料不是標準的xml資料,沒法按照正常的節點決議來處理,只能用QXmlQuery來做,
- 每個廠家設備回傳的資料未必完全一致,基本上都不一致,需要進行模糊查找節點值,
- 特意采用底層協議決議,因為soap太臃腫函式名稱太另類,特意做的輕量級的,
- 兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool,
二、功能特點
- 廣播搜索設備,支持IPC和NVR,依次回傳,可選擇不同的網卡IP,
- 依次獲取Onvif地址、Media地址、Profile檔案、Rtsp地址,
- 可對指定的Profile獲取視頻流Rtsp地址,比如主碼流子碼流地址,
- 可對每個設備設定Onvif用戶資訊,用于認證獲取詳細資訊,
- 可實時預覽攝像機影像,
- 支持云臺控制,可上下左右調節云臺,支持絕對移動和相對移動,可放到和縮小影像遠近,
- 支持Qt4和Qt5任意Qt版本,親測Qt4.7.0到Qt5.14.2,
- 支持任意編譯器,親測mingw、msvc、gcc、clang,
- 支持任意作業系統,親測xp、win7、win10、android、linux、嵌入式linux、樹莓派全志H3等,
- 支持任意Onvif攝像機和NVR,親測海康、大華、宇視、華為、海思芯片內核等,可定制開發,
- 支持對指定IP地址及onvif地址進行單播搜索,比如跨網段情況下非常有用,
- 支持指定過濾條件過濾搜索設備,
- 支持搜索間隔設定,保證所有設備搜索回來,在大量設備現場很有用,
- 可對圖片引數(亮度、色彩度、飽和度)進行設定,
- 支持NTP校時和時間同步設定,
- 純Qt撰寫,超級小巧輕量,總共約2000行代碼,不依賴任何第三方的庫和組件,跨平臺,
- 封裝好了通用的資料發送和接收決議的函式,可以非常方便的自行拓展其他Onvif處理,
- 工具上提供了收發資料文本框,顯示收發的資料,方便查看和分析,
- 支持所有Onvif設備,代碼工整,介面友好,直接引入pri即可使用,
三、效果圖

四、相關站點
- 國內站點:https://gitee.com/feiyangqingyun/QWidgetDemo
- 國際站點:https://github.com/feiyangqingyun/QWidgetDemo
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
- 體驗地址:https://blog.csdn.net/feiyangqingyun/article/details/97565652
五、核心代碼
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>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/161907.html
標籤:其他
上一篇:[BUUCFT]PWN——pwn2_sctf_2016
下一篇:Thread類實作買電影案例
