编译生成onvif C++框架,具体流程如下:
1、从gSoap官网下载gSoap(笔者用的是gSoap_2.8.106)。下载open source edition版本。请提前安装好openssl
$ cd gsoap-2.8
$ ./configure --with-openssl=/usr/local/ssl
$ make
$ make install
若编译失败,可以修改gsoap-2.8/gsoap/wsdl下的Makefile,在278-279行加上-ldl
2、从onvif官网下载wsdl文件以及相关配置文件:https://www.onvif.org/ch/profiles/specifications/
(1)建议下载所有的wsdl以及相关的xsd文件(右键链接另存为即可下载文件),然后修改其中的schemaLoaction以及部分location字段,将相对路径修改为http地址,否则生成onvif.h文件时会报错。
(2)将gsoap目录下的typemap.dat拷贝到新建目录下,并修改typemap.dat:将这一行代码注释取消 xsd__duration = #import “custom/duration.h” | xsd__duration
(3)然后执行以下命令:
wsdl2h -o onvif.h -t ./typemap.dat accesscontrol.wsdl accessrules.wsdl
actionengine.wsdl advancedsecurity.wsdl analytics.wsdl
authenticationbehavior.wsdl credential.wsdl deviceio.wsdl
devicemgmt.wsdl display.wsdl doorcontrol.wsdl event.wsdl imaging.wsdl
media.wsdl provisioning.wsdl ptz.wsdl receiver.wsdl recording.wsdl
replay.wsdl schedule.wsdl search.wsdl thermal.wsdl uplink.wsdl
3、修改生成的onvif.h
1.因为摄像头鉴权的需要,在onvif.h头文件中加入#import "wsse.h"。
4、执行命令生成C++代码
其中第一个-I为custom路径,第二个-I为import路径,第三个-I为gsoap路径(依赖之前安装的gSoap目录)
soapcpp2 -j onvif.h -I ../gsoap-2.8/gsoap/custom -I ../gsoap-2.8/gsoap/import -I ../gsoap-2.8/gsoap
5、整理框架代码(新建一个目录FrameSrc)
(1)将生成的.h(onvif.h 除外,该文件已经没用了)和.cpp文件以及xxx.nsmap文件(会生成好多个.nsmap文件,文件内容一模一样,拷贝一个即可)拷贝到FrameSrc中(此处我将nsmap文件改名为wsdd.nsmap)
(2)拷贝gsoap-2.8\gsoap路径下的dom.cpp、stdsoap2.h和stdsoap2.cpp到FrameSrc(在stdsoap2.cpp文件开头加入#include "wsdd.nsmap",以便后续顺利通过编译)
(3)拷贝gsoap-2.8\gsoap\custom路径下的duration.h、duration.c、struct_timeval.h、struct_timeval.c(将其后缀名改为.cpp,以便后续顺利通过编译)到FrameSrc
(4)拷贝gsoap-2.8\gsoap\plugin下的mecevp.h、mecevp.c、smdevp.h、smdevp.c、threads.h、threads.c、wsaapi.h、wsaapi.c、wsseapi.h、wsseapi.c到FrameSrc(记得将.c后缀改为.cpp)
(5)将xxxService.h和xxxService.cpp文件拷贝到server目录下(如果只使用Client功能,不需要编译这些文件,否则需要实现里面的虚函数)
6、最后在使用时加上预处理宏 WITH_OPENSSL
最后,感谢这位博主的分享:https://blog.csdn.net/liuliu0322/article/details/93308723