第六章 基于gsoap 生成onvif的C++源码
前言
gsoap是第三方工具,我们的重点是在onvif的源码基础上做二次开发。能够熟练使用gsoap工具,生成对应的C/C++框架代码,做好客户端或者服务端的前期准备。
一、openssl安装
centos7安装时一般带有openssl,建议卸载;onvif在使用过程中会用到onvif,在onvif封装库的时候,不是源码安装,使用过程会报错;
参考链接:https://blog.51cto.com/1012682/2380553?source=dra
openssl卸载:
yum autoremove openssl
上述命令会将openssl相关的好多依赖都删除了,但后续源码会用到,执行下面的命令补全openssl的安装环境:
yum groupinstall "Development Tools"
单独安装make
yum -y install gcc automake autoconf libtool make
openssl编译安装:
- 官网 https://www.openssl.org/source/ 找到“source/old”下载 openssl-1.1.1b.tar.gz
- 编译
./config --prefix=/usr/local/openssl_soft/openssl_install --openssldir=/usr/local/openssl_soft/ssl
make -j8
make install
说明:
-j8 表示编译时使用几个内核,安装虚拟机时,一般都是自己配置的,按照自己的配置进行选择;可以提高编译效率;
- 执行软件链接,重新连接opengssl库;
ln -s /usr/local/openssl_soft/openssl_install/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl_soft/openssl_install/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
- 检查openssl是否安装成功
openssl version
该命令可以查看openssl当前的版本,如有显示,则表示安装成功;
二、gsoap源码编译安装
centos7下的安装与win10下不同,win10 下可以直接解压使用,详见:https://blog.csdn.net/sxjkl10/article/details/113600392
centos7安装gsoap如下:
- 下载gsoap.2.8.106
下载地址: https://sourceforge.net/projects/gsoap2/files/
- root用户下解压: gsoap-2.8.106
tar zxvf gsoap-2.8.106
- 准备wsdl.下载地址:https://download.csdn.net/download/sxjkl10/15005068
已经将大部分网址修改成本地链接,可以加快编译速度。 - 进入gsoap文件夹
cd /gsoap_2_8_cpp/gsoap
- 修改typemap.dat文件
在将来预计会用到H265视频格式,在typemap.dat文件默认没有添加;
添加方式如下:
h265 = "http://www.onvif.org/ver20/media/wsdl"
h265:这个命名自定义,没有要求,为了方便区分,定义为:h265;
赋值:可以在onvif官网直接找到。里面对应的media有2个,默认对应的格式是h264; ver20对应的格式是h265;
注意:
其他部分的可以不修改,如要修改请参照官网说明;新手建议不修改;熟悉之后,想怎么操作都行;
- gsoap的编译
1)配置安装目录,链接openssl;onvif在取流的时候会用到openssl。
./configure --prefix=/usr/local/gsoap_soft/gsoap-2.8_cpp/gsoap_install --with-openssl=/usr/local/openssl_soft/openssl_install
make -j8
make install
2)在gsoap目录下建立:
mkdir onvif_linux_cpp
- 执行wsdl2命令:
wsdl2h -P -x -s -t ./typemap.dat -o onvif_linux_cpp/onvif.h /usr/local/gsoap_soft/onvif_wsdl/remotediscovery.wsdl /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
3) 打开onvif.h文件
gedit onvif_linux_cpp/onvif.h
添加“#import “wsse.h”” 该头文件用于鉴权;
4)打开wsa5.h
gedit import/wsa5.h
修改:‘SOAP_ENV__Fault’ 为’SOAP_ENV__Fault_alex’;
5)执行soapcpp2命令:
soapcpp2 -2 -C -L -x -I import:custom -d onvif_linux_cpp/ onvif_linux_cpp/onvif.h
6)保留wsdd.nsmap,删除其他的wsdd.nsmap
mv wsdd.nsmap wsdd.nsmap_bak
rm -rf *.nsmap
mv wsdd.nsmap_bak wsdd.nsmap
最终文件如下:
说明:
*.nsmap的文件大小内容一致,只保留一个就行;建议保留“wsdd.nsmap”;在其应用示例中使用的也是该文件;
7)其他文件
cp dom.cpp stdsoap2.* ./plugin/mecevp.* ./plugin/smdevp.* ./plugin/threads.* ./plugin/wsaapi.* ./plugin/wsseapi.* ./custom/duration.* onvif_linux_cpp/
建议:
第一次使用的时候,不要添加其他文件,直接拿生成的文件添加到工程中,编译报错后,依据错误逐步添加;
在C++工程中,注意将*.c该为*.cpp
- c源码方式一样;
感谢
[https://blog.51cto.com/1012682/2380553?source=dra]