1. 程式人生 > 其它 >centos7 搭建onvif C++框架總結

centos7 搭建onvif C++框架總結

技術標籤:onvif學習總結onvifwsdlcentosc++

提示:文章寫完後,目錄可以自動生成,如何生成可參考右邊的幫助文件

@[TOC]centos7 搭建onvif C++框架總結


前言

本文記錄了centos7 搭建onvif C++框架的過程及遇到問題的解決方式。

一、準備資源

  1. 安裝Bison
yum -y install bison
  1. 安裝Flex
yum -y install flex
  1. 安裝OpenSSL
    我採用原始碼編譯安裝的方式:
    官網:https://www.openssl.org/
    版本:openssl-1.0.2h
    安裝詳見openssl-1.0.2h/INSTALL說明
    備註:
    1、 我採用預設安裝路徑/usr/local/ssl/,這個路徑等下編譯gSOAP原始碼時會用到;
    2、 Openssl 系統自帶有;查詢 openssl version;
    3、openssl的環境配置:
    將.so檔案路徑「/usr/local/ssl/lib」追加到/etc/ld.so.conf檔案末尾。
$ echo /usr/local/ssl/lib >> /etc/ld.so.conf
		使得修改立刻生效:
$ ldconfig
  1. 下載gSOAP(從gSOAP官網下載gSoap_2.8.106)
cd gsoap-2.8
$ ./configure
$ make
$ make install

若編譯失敗,可以修改gsoap-2.8/gsoap/wsdl下的Makefile,在278行加上-ldl

二、基於gSOAP生成C++框架

1.下載wsdl

https://www.onvif.org/profiles/specifications 滑鼠右鍵另存為即可下載。
修改wsdl檔案中的“schemaLocation”和“location”的值;wsdl可以看成xml檔案方便理解,其中“schemaLocation”和“location”的值都是相對地址,由於已經下載在本地所以需要耐心且細心的修改為,其值得絕對地址;
另外本不建議直接用其網址進行,編譯;試過,編譯不過,原因未知;
如下圖所示:

絕對地址的修改方式時,請注意前面的“namespace”對應的網址,按照前面的網址複製到後面來即可
特殊情況:
由於所有的wsdl都已經下載,在deviceio.wsdl中的 devicemgmt.wsdl 已經下載在本地,其修改方式後的結果如下:
在這裡插入圖片描述
修改後的資源如下:
在下載中搜索:onvif_wsdf

2.執行wsdl2h

操作步驟:

  1. 將gsoap目錄下的typemap.dat拷貝到新建目錄下,並修改gsoap目錄下typemap.dat:將這一行程式碼註釋取消 xsd__duration = #import “custom/duration.h” | xsd__duration
  2. 執行命令
wsdl2h -o /usr/local/onvif_linux_C/onvif.h -t ./typemap.dat /usr/local/gsoap_soft/onvif_wsdl/accesscontrol.wsdl /usr/local/gsoap_soft/onvif_wsdl/accessrules.wsdl /usr/local/gsoap_soft/onvif_wsdl/actionengine.wsdl /usr/local/gsoap_soft/onvif_wsdl/advancedsecurity.wsdl /usr/local/gsoap_soft/onvif_wsdl/analytics.wsdl /usr/local/gsoap_soft/onvif_wsdl/authenticationbehavior.wsdl /usr/local/gsoap_soft/onvif_wsdl/credential.wsdl /usr/local/gsoap_soft/onvif_wsdl/deviceio.wsdl /usr/local/gsoap_soft/onvif_wsdl/devicemgmt.wsdl /usr/local/gsoap_soft/onvif_wsdl/display.wsdl /usr/local/gsoap_soft/onvif_wsdl/doorcontrol.wsdl /usr/local/gsoap_soft/onvif_wsdl/event.wsdl /usr/local/gsoap_soft/onvif_wsdl/imaging.wsdl /usr/local/gsoap_soft/onvif_wsdl/media.wsdl /usr/local/gsoap_soft/onvif_wsdl/media_H265.wsdl /usr/local/gsoap_soft/onvif_wsdl/provisioning.wsdl /usr/local/gsoap_soft/onvif_wsdl/ptz.wsdl /usr/local/gsoap_soft/onvif_wsdl/receiver.wsdl /usr/local/gsoap_soft/onvif_wsdl/recording.wsdl /usr/local/gsoap_soft/onvif_wsdl/replay.wsdl /usr/local/gsoap_soft/onvif_wsdl/schedule.wsdl /usr/local/gsoap_soft/onvif_wsdl/search.wsdl /usr/local/gsoap_soft/onvif_wsdl/thermal.wsdl /usr/local/gsoap_soft/onvif_wsdl/uplink.wsdl

注意:
1、 *.wsdl對應的地址為,自己wsdl存放位置的地址,這個地方最好為絕對地址(避免出錯);
2、其中media_H265.wsdl為media2.wsdl(據說是h265,未測試,下載的時候其官網有2個media);
3、/usr/local/onvif_linux_C儲存生成的檔案;

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
  1. 修改生成的onvif.h
    因為攝像頭鑑權的需要,在onvif.h標頭檔案中加入#import “wsse.h”。
  2. 執行命令生成C++程式碼
 soapcpp2 -2 -L -c++ -x -I import:custom -d /usr/local/onvif_linux_C/ /usr/local/onvif_linux_C/onvif.h

3.整理框架程式碼

  1. 在/usr/local/onvif_linux_C資料夾中可以看到一堆檔案,onvif.h
    (檔案已經沒用了)和.cpp檔案以及xxx.nsmap檔案(ls
    -lptr,可以看見所有的nsmap的大小一致,保留一個重新命名為wsdd.nsmap,其他的可以刪)。

  2. 拷貝檔案
    在gsoap目錄下的終端執行:

cp dom.cpp stdsoap2.c stdsoap2.h plugin/mecevp.h plugin/mecevp.c plugin/smdevp.h plugin/smdevp.c plugin/threads.h plugin/threads.c plugin/wsaapi.h plugin/wsaapi.c plugin/wsseapi.h plugin/wsseapi.c custom/duration.c custom/duration.h custom/struct_timeval.h custom/struct_timeval.c /usr/local/onvif_linux_C/
  1. 將*.c 修改為 *.cpp。
  2. 使用時加上預處理巨集 WITH_OPENSSL

感謝

最後感謝這位博主的分享:https://blog.csdn.net/gj139612/article/details/108625429