Qt/C++通用跨平臺Onvif工具/支援海康大華宇視華為天地偉業等/雲臺控制/預置位管理/工程除錯利器

飞扬青云發表於2024-03-23

一、前言

在安防影片監控行業,Onvif作為國際標準,幾乎主要的廠商都支援,不僅包含了國內的廠商,也包括主要的國際廠商,由於有了這個標準的存在,使得不同裝置不同安防平臺之間,能夠接入各個廠家的硬體裝置,互通有無,你中有我我中有你,實現良性競爭。ONVIF是一個全球性的開放式行業協議,其目標是促進開發和使用基於物理IP的安全產品介面的全球開放標準。ONVIF建立了一個影片監控和其他物理安全領域的IP產品如何進行相互通訊的標準。

這裡需要特別強調的是,onvif只是個文字協議,並不包括影片流的傳輸,onvif協議可以拿到影片流地址比如rtsp地址,至於rtsp如何傳輸這是其他的事情,你可以用ffmpeg或者live555去做解析。本人在接觸和使用了眾多的相關監控裝置後,總結的onvif的主要功能如下:

  1. 搜尋裝置,獲取裝置的資訊比如廠家、型號等。
  2. 獲取裝置的多個配置檔案資訊profile。
  3. 獲取對應配置檔案的影片流地址rtsp,以及解析度等引數。
  4. 雲臺控制,上下左右移動,焦距放大縮小,相對和絕對移動。
  5. 獲取預置位資訊,觸發預置位。
  6. 訂閱事件,接收裝置的各種訊息尤其是報警事件比如IO口的報警。
  7. 抓圖,獲取裝置當前的圖片。
  8. 獲取、建立、刪除使用者資訊。
  9. 獲取和裝置網路配置資訊比如IP地址等。
  10. 獲取和設定NTP時間同步以及設定裝置時間。
  11. 獲取和設定影片引數和圖片引數(亮度、色彩、飽和度)。
  12. 重啟裝置。
  13. 增加、刪除、修改、查詢OSD資訊。

主要處理流程:

  1. 繫結組播IP(239.255.255.250)和埠(3702),傳送固定的xml格式的資料搜尋裝置。
  2. 接收到的xml格式的資料解析,得到裝置的Onvif地址。
  3. 對Onvif地址傳送對應的資料,收到資料取出對應的節點資料。
  4. 請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的配置檔案,Ptz地址用來雲臺控制。
  5. ptz控制是對Ptz地址傳送對應的資料即可。
  6. 設定了使用者認證的需要組織使用者token資訊一塊傳送,每次都需要作鑑權處理。
  7. 接收到的資料不是標準的xml資料,帶有字首名稱空間,解析的時候要注意。
  8. 每個廠裝潢置返回的資料未必完全一致,基本上都不一致,需要進行模糊查詢節點值。
  9. 特意採用底層協議解析,因為soap太臃腫函式名稱太另類,特意做的輕量級的。
  10. 兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool。

本元件程式碼使用說明:

  1. 第一步:複製onvif元件原始碼到你的專案,放到同級目錄。
  2. 第二步:在專案pro檔案中引入元件 include ($$PWD/../core_onvif/core_onvif.pri)。
  3. 第三步:程式碼檔案引入標頭檔案 #include "onvifsearch.h" #include "onvifdevice.h",其中onvifsearch用於搜尋裝置,onvifdevice用於獲取裝置的詳細資訊比如rtsp影片流地址。
  4. 第四步:組播或者單播搜尋裝置,獲取到對應的onvif地址。每個裝置都有一個唯一的onvif地址。
//例項化搜尋物件並關聯訊號槽
OnvifSearch *search = new OnvifSearch(this);
connect(search, SIGNAL(receiveDevice(OnvifDeviceInfo)), this, SLOT(receiveDevice(OnvifDeviceInfo)));
//引數1是網路卡地址/引數2指定地址則表示單播
search->search("192.168.0.110", "");

void frmSimple::receiveDevice(const OnvifDeviceInfo &deviceInfo)
{
    QString msg = QString("收到裝置: %1").arg(deviceInfo.onvifAddr);
    ui->textEdit->append(msg);

    QListWidgetItem *item = new QListWidgetItem;
    item->setText(deviceInfo.deviceIp);
    item->setData(Qt::UserRole, deviceInfo.onvifAddr);
    ui->listWidget->addItem(item);
}
  1. 第五步:對指定的onvif地址傳送http請求,獲取詳細資訊。
//例項化onvif物件例項
OnvifDevice *device = new OnvifDevice(this);
//設定使用者資訊用於請求的時候認證用
device->setUserInfo("admin", "123456");
//設定請求地址
device->setOnvifAddr("http://192.168.0.64/onvif/device_service");

//先獲取服務檔案
device->getServices();
//可能為空需要按照另一種方式獲取
if (device->getMediaUrl().isEmpty()) {
    device->getCapabilities();
}

//獲取配置檔案
QList<OnvifProfileInfo> profiles = device->getProfiles();
foreach (OnvifProfileInfo profile, profiles) {
    ui->cboxProfiles->addItem(profile.token);
}

//對指定的配置檔案獲取影片地址
QString token = ui->cboxProfiles->currentText();
QString url = device->getStreamUri(token);
ui->txtStreamUri->setText(url);
  1. 特別提示:可以在main.cpp中註釋//frmMain w;開啟frmSimple w;用來開啟直接執行簡單示例。

二、效果圖




三、體驗地址

  1. 國內站點:https://gitee.com/feiyangqingyun
  2. 國際站點:https://github.com/feiyangqingyun
  3. 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 體驗地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 檔名:bin_video_onvif。
  5. 影片主頁:https://space.bilibili.com/687803542

四、功能特點

  1. 廣播搜尋裝置,支援IPC和NVR,依次返回。
  2. 可選擇不同的網路卡IP進行對應網段裝置的搜尋。
  3. 依次獲取Onvif地址、Media地址、Profile檔案、Rtsp地址。
  4. 可對指定的Profile獲取影片流Rtsp地址,比如主碼流地址、子碼流地址。
  5. 可對每個裝置設定Onvif使用者資訊,用於認證獲取詳細資訊。
  6. 可實時預覽攝像機影像。
  7. 支援雲臺控制,可上下左右調節雲臺,支援絕對移動、相對移動、連續移動三種方式,可對影像拉近拉遠。
  8. 支援獲取預置位集合、呼叫預置位、新增預置位、刪除預置位等。
  9. 支援圖片引數設定,包括亮度、對比度、飽和度、銳度等。
  10. 支援Qt4和Qt6任意Qt版本以及後續Qt版本。
  11. 支援任意編譯器,親測mingw、msvc、gcc、clang。
  12. 支援任意作業系統,親測xp、win7、win10、android、linux、嵌入式linux、樹莓派全志H3等。
  13. 支援任意Onvif攝像機和NVR,親測海康、大華、宇視、天地偉業、華為、海思晶片核心等,可定製開發。
  14. 支援對指定IP地址及onvif地址進行單播搜尋,比如跨網段情況下非常有用。
  15. 支援指定過濾條件過濾搜尋裝置,比如只搜尋某個網段的裝置或者針對某個地址的裝置。
  16. 支援搜尋間隔和搜尋策略設定,保證所有裝置搜尋回來,在大量裝置現場很有用(親測上千個攝像機現場,搜尋回來的裝置數量比攝像機廠家自帶搜尋工具還要準確)。
  17. 可對裝置進行重啟、網路引數獲取等。
  18. 支援各種事件訂閱(入侵報警、越界報警、遮擋報警等)、Onvif抓圖等操作。
  19. 支援NTP校時和時間同步設定。
  20. 支援OSD相關操作,可以增刪改查OSD資訊。
  21. 內建了執行緒實時執行Onvif指令佇列,排隊最大速度的執行對應的指令,執行結果訊號發出。
  22. 採用的最底層的TCP+UDP通訊機制,原創最底層協議解析,純QtWidget編寫。
  23. 超級小巧輕量,總共約3000行程式碼,不依賴任何第三方的庫和元件,跨平臺。
  24. 封裝好了通用的資料傳送和接收解析的函式,可以非常方便的自行擴充其他Onvif處理。
  25. 工具上提供了收發資料文字框,顯示收發的資料,方便檢視和分析。
  26. 支援所有Onvif裝置,程式碼工整,介面友好,直接引入pri即可使用。

相關文章