1、前言
环境:Win10主机+VMware15.5+Centos7.9
登录用户:root
目标:采用从ONVIF官网下载的最新版本WSDL(Ver.21.12)文件,在Centos上用gsoap_2.8.119编译生成ONVIF框架代码(C++版)。
2、准备工作
2.1 准备编译环境
yum -y install bison flex
2.2 编译安装openssl
1、代码下载
2、解压缩
tar -xzf openssl-1.0.2h.tar.gz
cd openssl-1.0.2h
3、配置安装目录
./config --prefix=/usr/local/ssl
4、执行命令
./config -t
5、编译安装
make
make install
6、配置环境变量
echo /usr/local/ssl/lib >> /etc/ld.so.conf
ldconfig
2.3 编译安装gsoap
1、代码下载
2、解压缩
unzip gsoap_2.8.119.zip
cd gsoap-2.8
3、配置编译安装
./configure --with-openssl=/usr/local/ssl --prefix=/usr/local/gsoap-2.8
make
make install
4、编译过程中,出现链接openssl库失败的问题。修改gsoap-2.8/gsoap/wsdl下的Makefile,在277行加上-ldl,然后重新编译即可通过。
3、基于gsoap生成onvif C++框架代码
3.1 获取wsdl
可以从ONVIF官网下载最新版本的wsdl及xsd文件。按照自己的需求下载相应文件。因文件依赖关系不确定,一般是全部下载,完整文件是33个。
从官网下载的wsdl文件,可以在线和离线2种模式生成框架。因网络等问题,建议离线编译。但直接下载的wsdl和xsd文件,不能直接编译,需要修改各个文件中的schemaLocation和location标签的路径值,改法见下截图
或者可以从这里获取所有的wsdl和xsd文件,里边所有路径均已修改过,可直接离线编译。
3.2 配置编译生成框架
1、修改/gsoap-2.8/gsoap/目录下typemap.dat文件
由于后续编译源代码需要用到 duration.c 文件,会遇到类型LONG64报错的问题,需要在typemap.dat 文件中取消以下行的注释:
xsd__duration = #import “custom/duration.h” | xsd__duration
2、拷贝到/usr/local/gsoap-2.8/bin
cp typemap.dat /usr/local/gsoap-2.8/bin/
3、将wsdl和xsd文件拷贝放到/usr/local/gsoap-2.8/ onvif_wsdl目录下
4、
cd /usr/local/ gsoap-2.8/ bin/
5、使用wsdl2h编译生成onvif.h文件
./wsdl2h -P -x -c++ -s -t ./typemap.dat -o onvif.h /usr/local/gsoap-2.8/onvif_wsdl/accesscontrol.wsdl /usr/local/gsoap-2.8/onvif_wsdl/accessrules.wsdl /usr/local/gsoap-2.8/onvif_wsdl/actionengine.wsdl /usr/local/gsoap-2.8/onvif_wsdl/advancedsecurity.wsdl /usr/local/gsoap-2.8/onvif_wsdl/analytics.wsdl /usr/local/gsoap-2.8/onvif_wsdl/authenticationbehavior.wsdl /usr/local/gsoap-2.8/onvif_wsdl/credential.wsdl /usr/local/gsoap-2.8/onvif_wsdl/deviceio.wsdl /usr/local/gsoap-2.8/onvif_wsdl/devicemgmt.wsdl /usr/local/gsoap-2.8/onvif_wsdl/display.wsdl /usr/local/gsoap-2.8/onvif_wsdl/doorcontrol.wsdl /usr/local/gsoap-2.8/onvif_wsdl/event.wsdl /usr/local/gsoap-2.8/onvif_wsdl/imaging.wsdl /usr/local/gsoap-2.8/onvif_wsdl/media.wsdl /usr/local/gsoap-2.8/onvif_wsdl/media_h265.wsdl /usr/local/gsoap-2.8/onvif_wsdl/provisioning.wsdl /usr/local/gsoap-2.8/onvif_wsdl/ptz.wsdl /usr/local/gsoap-2.8/onvif_wsdl/receiver.wsdl /usr/local/gsoap-2.8/onvif_wsdl/recording.wsdl /usr/local/gsoap-2.8/onvif_wsdl/replay.wsdl /usr/local/gsoap-2.8/onvif_wsdl/schedule.wsdl /usr/local/gsoap-2.8/onvif_wsdl/search.wsdl /usr/local/gsoap-2.8/onvif_wsdl/thermal.wsdl /usr/local/gsoap-2.8/onvif_wsdl/uplink.wsdl
6、修改生成的onvif.h及wsa5.h
因为鉴权的需要,在onvif.h头文件中加入#import "wsse.h"。
避免接下来产生框架发生错误,修改/usr/local /gsoap-2.8/ share/gsoap /import路径下的wsa5.h,将SOAP_ENV__Fault结构体名字修改为SOAP_ENV__Fault_alex。
7、使用soapcpp2生成C++代码
cd /usr/local/ gsoap-2.8 /share/gsoap
../../bin/soapcpp2 -2 -x -j -I ./import ./custom -d samples/onvif/ ../../bin/onvif.h
生成的框架代码在./samples/onvif/ 目录下
3.3 整理框架代码
1、所有的. nsmap文件都一样,任选一个,将文件名字改为wsdd.h,其它的可以删除。
2、拷贝插件文件
cp 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/plugin
cp dom.cpp /usr/local/onvif/plugin
将以上所有.c文件改成.cpp
3、拷贝框架代码
如果是开发onvif客户端程序,则拷贝相关的soapXXXBindingProxy.h,soapXXXBindingProxy.cpp到/usr/local/onvif/linux_api_proxy
如果是开发onvif服务端程序,则拷贝相关的soapXXXBindingService.h,soapXXXBindingService.cpp到/usr/local/onvif/linux_api_service
4、引用框架代码时,添加预处理宏WITH_OPENSSL
4、参考
编译过程中,参考了下边网友的文章,在此感谢。