提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
@[TOC]centos7 搭建onvif C++框架总结
前言
本文记录了centos7 搭建onvif C++框架的过程及遇到问题的解决方式。
为了封装onvif库,gsoap安装了删除,删除了安装,各种问题;
尤其重要的一点,在使用前,务必明确gsoap的版本以及需要onvif的c++源码,还是C源码;
一、准备资源
- 安装Bison
yum -y install bison
- 安装Flex
yum -y install flex
- 安装OpenSSL
我采用源码编译安装的方式:
官网:https://www.openssl.org/
版本:openssl-1.0.2h
安装详见openssl-1.0.2h/INSTALL说明
备注:
1、 我采用默认安装路径/usr/local/ssl/,这个路径等下编译gSOAP源码时会用到;
2、 Openssl 系统自带有;查询 openssl version;
强烈建议
openssl源码安装,后续基于oncvif的源码开发时需要openssl的的库,源码安装很清晰的知道openssl的库在什么地方(这个好坑,之前那一版openssl是系统自己按照的,在cmake编译的时候找不到libssl.a libcrypto.a 在哪)。
openssl的安装之前仔细阅读以下blog:
https://www.cnblogs.com/rxbook/p/9367725.html
https://cloud.tencent.com/developer/article/1632995?from=information.detail.linux%E5%8D%B8%E8%BD%BDopenssl
$ echo /usr/local/ssl/lib >> /etc/ld.so.conf
$ ldconfig
- 下载gSOAP(从gSOAP官网下载gSoap_2.8.106)
cd gsoap-2.8
$ ./configure --with-openssl=/usr/local/openssl --prefix=/usr/local/gsoap_soft/gsoap-2.8/install
$ make
$ make install
–with-openssl:后面的值是openssl的安装位置
–prefix:后面的值是 gsoap的安装位置,方便后面生成框架代码;
使用这种编译方式,很大概率上出现 openssl的库无法链接;解决办法:
可以修改gsoap-2.8/gsoap/wsdl下的Makefile,在278行加上-ldl;
详见blog:https://blog.csdn.net/azhangyi188/article/details/51063880/
二、基于gSOAP生成C++框架
1.下载wsdl
https://www.onvif.org/profiles/specifications 鼠标右键另存为即可下载。
修改wsdl文件中的“schemaLocation”和“location”的值;wsdl可以看成xml文件方便理解,其中“schemaLocation”和“location”的值都是相对地址,由于已经下载在本地所以需要耐心且细心的修改为,其值得绝对地址;
另外本不建议直接用其网址进行,编译;试过,编译不过,原因未知;
如下图所示:
特殊情况:
由于所有的wsdl都已经下载,在deviceio.wsdl中的 devicemgmt.wsdl 已经下载在本地,其修改方式后的结果如下:
修改后的资源如下:
WSDL:https://download.csdn.net/download/sxjkl10/14648527
2.执行wsdl2h
操作步骤:
- 修改gsoap目录下的typemap.dat : 将这一行代码注释取消 xsd__duration = #import “custom/duration.h” | xsd__duration
参考「How do I use gSOAP with the ONVIF specifications」(https://www.genivia.com/resources.html)说明,看是否需要修改typemap.dat - 然后拷贝到gsoap-2.8/install/bin
- 执行命令 (在前面的安装目录下install/bin)
wsdl2h -o 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)install 为安装目录,其路径:gsoap-2.8/install
- 修改生成的onvif.h
因为摄像头鉴权的需要,在onvif.h头文件中加入#import “wsse.h”。 - 执行命令生成C++代码
soapcpp2 -j onvif.h -I ../../gsoap/custom -I ../../gsoap/import -I ../../gsoap
注意:
1、生成的文件有*.xml ,*.h,*.cpp,*.nsmap;“*.xml”可以删除,也可以在执行命令时,添加指令 -X 不生成xml;详细请参照 “soapcpp2 -h”命令的提示信息。
2、*.nsmap的文件大小一致,修改其中一个为“wsdd.nsmap”;保留这个其他可以删除;
3、
3.整理框架代码
-
在gsoap-2.8/install/bin文件夹中可以看到一堆文件,onvif.h
(文件已经没用了)和.cpp文件以及xxx.nsmap文件(ls
-lptr,可以看见所有的nsmap的大小一致,保留一个重新命名为wsdd.nsmap,其他的可以删)。 -
拷贝文件
在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/
- 将*.c 修改为 *.cpp。
- 使用时加上预处理宏 WITH_OPENSSL
基于Qt和cmake的cmakelist.txt
如下:
cmake_minimum_required(VERSION 2.8)
project(onvifNVT)
#解决so过大
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
include_directories(
./header
./onvif
)
set(HEADERS
./header/searchIPC1.h
./header/searchIPC2.h
./header/searchIPC3.h
./onvif/soapH.h
./onvif/stdsoap2.h
./onvif/duration.h
./onvif/soapStub.h
# ./onvif/struct_timeval.h
./onvif/mecevp.h
./onvif/smdevp.h
./onvif/threads.h
./onvif/wsaapi.h
# ./onvif/wsseapi.h
./onvif/wsdd.nsmap
)
set(SOURCES
./onvif/soapC.cpp
./onvif/stdsoap2.cpp
./onvif/dom.cpp
./onvif/duration.cpp
# ./onvif/struct_timeval.cpp
./onvif/mecevp.cpp
./onvif/smdevp.cpp
./onvif/threads.cpp
./onvif/wsaapi.cpp
# ./onvif/wsseapi.cpp
)
find_library(ONVIFLIB ONVIF /usr/local/gsoap_soft/gsoap_2_8_106/install/lib)
find_library(SSL libssl.a /usr/local/openssl/lib)
find_library(CYP libcrypto.a /usr/local/openssl/lib)
add_definitions(-DWITH_PURE_VIRTUAL)
add_definitions(-DWITH_NONAMESPACES)
add_definitions(-DWITH_OPENSSL)
add_definitions(-DWITH_DOM)
add_executable(testONVIF "main.cpp" ${HEADERS} ${SOURCES})
target_link_libraries (testONVIF ${TESTFUNC_LIB} ${SSL} ${CYP} dl pthread)
编译ok,缺少摄像头未测试,后续测试后,上传demo。
感谢
菜鸟一枚,踩了无数坑,非常感谢,各位大佬的帮助;
基于cmake的CMakelist.txt如下:
最后感谢这位博主的分享:https://blog.csdn.net/gj139612/article/details/108625429