折騰幾天,看了很多博客,終于弄出來了。 一:gSOAP搭建ONVIF (C++)客戶端開發(fā)框架 --windows 二:gSOAP搭建ONVIF (C++)客戶端開發(fā)框架 --linux
1. gSOAP工具下載
gSOAP里邊的soapcpp2.exe和wsdl2.exe的版本是對應(yīng)的 gSOAP下載
2.搜集需要的文件
- 創(chuàng)建目錄
F:\onvifFrameworkC - 將
F:\gsoap_2.8.112\gsoap-2.8\gsoap 下的plugin,import,custom 復(fù)制到F:\onvifFrameworkC - 換將
wsdl2h.exe和soapcpp2.exe 復(fù)制到F:\onvifFrameworkC 目錄下 - 將
F:\gsoap_2.8.112\gsoap-2.8\gsoap 下的stdsoap2.cpp,stdsoap2.h,dom.cpp 復(fù)制到F:\onvifFrameworkC - 將
F:\gsoap_2.8.112\gsoap-2.8\gsoap 下的typemap.dat 復(fù)制到F:\onvifFrameworkC
以后的所有操作都在目錄F:\onvifFrameworkC 進行
3.修改一些文件
- 防止出現(xiàn)LONG64的錯誤和'SOAP_TYPE_xsd__duration’ was not declared in this scope錯誤,需要在typemap.dat中
# xsd__duration = #import "custom/duration.h" | xsd__duration
改成
xsd__duration = #import "custom/duration.h" | xsd__duration
- 防止
SOAP_ENV__Fault 重復(fù)錯誤,修改F:\onvifFrameworkC\import 下邊的wsa5.h 。這里把SOAP_ENV__Fault 的名字改了
4.生成onvif.h
(1)需要的wsdl文件和xsd文件http,每個用空格隔開。 windows下邊的wsdl2h.exe不支持HTTPS下載,所以使用HTTP
wsdl2h -x -t typemap.dat -o onvif.h http://www./onvif/ver10/network/wsdl/remotediscovery.wsdl http://www./onvif/ver10/device/wsdl/devicemgmt.wsdl http://www./onvif/ver10/media/wsdl/media.wsdl http://www./onvif/ver20/ptz/wsdl/ptz.wsdl http://www./onvif/ver10/search.wsdl http://www./onvif/ver10/display.wsdl http://www./onvif/ver10/deviceio.wsdl http://www./onvif/ver10/event/wsdl/event.wsdl http://www./onvif/ver10/receiver.wsdl http://www./onvif/ver10/recording.wsdl
(2)打開CMD,輸入命令cd /d F:\onvifFrameworkC 再輸入上邊這個命令得到onvif.h。 此時會產(chǎn)生一個onvif.h文件,這個文件很大。 (3)因鑒權(quán)需要,修改onvif.h頭文件,在onvif.h中添加
#import "wsse.h"
此時F:\onvifFrameworkC 下有這些文件
5.使用gSOAP生成onvif開發(fā)框架代碼
soapcpp2 命令如下
soapcpp2 -2 -x -C onvif.h -L -Iimport
此時F:\onvifFrameworkC 下有這些文件
6.創(chuàng)建新的目錄F:\onvifApi放onvif開發(fā)框架的代碼
(1)gSOAP生成的文件中提取以下幾個放到F:\onvifApi
soapC.cpp
soapClient.cpp
soapH.h
soapStub.h
wsdd.nsmap
(2)再提取以下幾個放到F:\onvifApi
dom.c
dom.h
duration.cpp
duration.h
mecevp.c
mecevp.h
smdevp.c
smdevp.h
stdsoap2.c
stdsoap2.h
threads.c
threads.h
wsa5.h
wsaapi.c
wsaapi.h
wsseapi.c
wsseapi.h
struct_timeval.h
struct_timeval.c
(3)把里邊所有的c改為cpp。有的文件既有C也有CPP,在F:\onvifApi 中只保留cpp 修改stdsoap2.cpp 文件,添加#include "wsdd.nsmap" 在soapStub.h文件中,列出了WEB服務(wù)的所有接口(Client-Side Call Stub Functions),我們的應(yīng)用程序通過調(diào)用這些接口就成了,至于SOAP協(xié)議整個過程怎么實現(xiàn)的,都在soapC.c和soapClient.c中。
7.驗證
在VS2017中創(chuàng)建新工程,添加目錄,并把F:\onvifApi 所有文件加入到工程。
(1)因為文件太大,需要添加/bigobj (2)在預(yù)處理器中添加 _CRT_SECURE_NO_WARNINGS
(3)出現(xiàn)錯誤 C1083 無法打開包括文件: “openssl/evp.h”: No such file or directory 這是因為鑒權(quán)需要OPEN-SSL支持。 選擇Win32 這里安裝好以后把目錄和庫添加到項目設(shè)置,(平臺可以看到是win32所以開發(fā)的程序是Win32) 預(yù)處理器添加WITH_OPENSSL 鏈接器的輸入添加libcrypto.lib,libssl.lib (4) 這是因為沒有添加struct_timeval.cpp和struct_timeval.h ,把兩個文件添加到F:\onvifApi 目錄,并且加入到工程。 (5) 這是因為沒有添加duration.cpp和duration.h ,把兩個文件添加到F:\onvifApi 目錄,并且加入到工程。 完整的工程目錄如下:
此時編譯可以通過且可以F11進入soap_new() 單步調(diào)試。 到此,大工告成!
主要借鑒:https://blog.csdn.net/weixin_44517656/article/details/115120199 https://blog.csdn.net/benkaoya/article/details/72424335
一:編譯gSoapg
(1)安裝依賴庫
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install openssl
(2)gSoapg源碼下載https:///projects/gsoap2/
(3)編譯:支持鑒權(quán)。
cd gsoap-2.8/
sudo ./configure --with-openssl=/usr/local/OpenSSL
sudo make
sudo make install
2.搜集需要的文件
- 創(chuàng)建目錄
mkdir /home/usr/onvif - 將
gsoap_2.8.112/gsoap-2.8/gsoap 下的plugin,import,custom 復(fù)制到/home/usr/onvif - 換將
wsdl2h和soapcpp2 復(fù)制到/home/usr/onvif 目錄下 - 將
gsoap_2.8.112/gsoap-2.8/gsoap 下的stdsoap2.cpp,stdsoap2.h,dom.cpp 復(fù)制到/home/usr/onvif - 將
gsoap_2.8.112/gsoap-2.8/gsoap 下的typemap.dat 復(fù)制到/home/usr/onvif
以后的所有操作都在目錄/home/usr/onvif 進行
3.修改一些文件
- 防止出現(xiàn)LONG64的錯誤和'SOAP_TYPE_xsd__duration’ was not declared in this scope錯誤,需要在typemap.dat中
# xsd__duration = #import "custom/duration.h" | xsd__duration
改成
xsd__duration = #import "custom/duration.h" | xsd__duration
- 防止
SOAP_ENV__Fault 重復(fù)錯誤,修改F:\onvifFrameworkC\import 下邊的wsa5.h 。這里把SOAP_ENV__Fault 的名字改了
4.生成onvif.h
(1)wsdl下載命令。
./wsdl2h -x -t typemap.dat -o onvif.h http://www./onvif/ver10/network/wsdl/remotediscovery.wsdl http://www./onvif/ver10/device/wsdl/devicemgmt.wsdl http://www./onvif/ver10/media/wsdl/media.wsdl http://www./onvif/ver20/ptz/wsdl/ptz.wsdl http://www./onvif/ver10/search.wsdl http://www./onvif/ver10/display.wsdl http://www./onvif/ver10/deviceio.wsdl http://www./onvif/ver10/event/wsdl/event.wsdl http://www./onvif/ver10/receiver.wsdl http://www./onvif/ver10/recording.wsdl
(2)此時會產(chǎn)生一個onvif.h文件,這個文件很大。 因鑒權(quán)需要,修改onvif.h頭文件,在onvif.h中添加
#import "wsse.h"
5.使用gSOAP生成onvif開發(fā)框架代碼
./soapcpp2 -2 -x -C onvif.h -L -Iimport
6.創(chuàng)建新的目錄/home/usr/onvif_dev 放onvif開發(fā)框架的代碼
(1)gSOAP生成的文件中提取以下幾個放到/home/usr/onvif_dev ,其他的文件全部舍棄
soapC.cpp
soapClient.cpp
soapH.h
soapStub.h
wsdd.nsmap
(2)再提取以下幾個放到/home/usr/onvif_dev
dom.c
dom.h
duration.cpp
duration.h
mecevp.c
mecevp.h
smdevp.c
smdevp.h
stdsoap2.c
stdsoap2.h
threads.c
threads.h
wsa5.h
wsaapi.c
wsaapi.h
wsseapi.c
wsseapi.h
struct_timeval.h
struct_timeval.c
(3)把里邊所有的c改為cpp。有的文件既有C也有CPP,在/home/usr/onvif_dev 中只保留cpp (4)修改stdsoap2.cpp 文件,添加#include "wsdd.nsmap" 在soapStub.h文件中,列出了WEB服務(wù)的所有接口(Client-Side Call Stub Functions),我們的應(yīng)用程序通過調(diào)用這些接口就成了,至于SOAP協(xié)議整個過程怎么實現(xiàn)的,都在soapC.c和soapClient.c中。 到此, ubuntu環(huán)境下的onvif搭建成功,步驟基本和windows下一致!
|