第六章 基于gsoap 生成onvif的C++源码

第六章 基于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编译安装:

  1. 官网 https://www.openssl.org/source/ 找到“source/old”下载 openssl-1.1.1b.tar.gz
  2. 编译
./config --prefix=/usr/local/openssl_soft/openssl_install --openssldir=/usr/local/openssl_soft/ssl
make -j8
make install

说明:
-j8 表示编译时使用几个内核,安装虚拟机时,一般都是自己配置的,按照自己的配置进行选择;可以提高编译效率;

  1. 执行软件链接,重新连接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
  1. 检查openssl是否安装成功
openssl version

该命令可以查看openssl当前的版本,如有显示,则表示安装成功;

二、gsoap源码编译安装

centos7下的安装与win10下不同,win10 下可以直接解压使用,详见:https://blog.csdn.net/sxjkl10/article/details/113600392

centos7安装gsoap如下:

  1. 下载gsoap.2.8.106
    下载地址: https://sourceforge.net/projects/gsoap2/files/
    gsoap下载示意图
  2. root用户下解压: gsoap-2.8.106
tar zxvf gsoap-2.8.106
  1. 准备wsdl.下载地址:https://download.csdn.net/download/sxjkl10/15005068
    已经将大部分网址修改成本地链接,可以加快编译速度。
  2. 进入gsoap文件夹
cd /gsoap_2_8_cpp/gsoap
  1. 修改typemap.dat文件
    在将来预计会用到H265视频格式,在typemap.dat文件默认没有添加;
    添加方式如下:
h265	  = "http://www.onvif.org/ver20/media/wsdl"

h265:这个命名自定义,没有要求,为了方便区分,定义为:h265;
赋值:可以在onvif官网直接找到。里面对应的media有2个,默认对应的格式是h264; ver20对应的格式是h265;
typemap.dat修改示意图
注意:
其他部分的可以不修改,如要修改请参照官网说明;新手建议不修改;熟悉之后,想怎么操作都行;

  1. 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
  1. 执行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

最终文件如下:
onvif C++生成示意图
说明:
*.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

  1. c源码方式一样;

感谢

[https://blog.51cto.com/1012682/2380553?source=dra]

带gsoap-2.8源码,基于服务器客户端的实例,带自动生成服务客户端代码的批处理程序,及如何使用。带自己学习参考的教程; 0.解压附件,soapInterface.bat所在路径不得含中文 空格 1.新建头文件 取soapInterface.bat文件的同名:soapInterface.h 文件内编写接口,具体说明看附件参考的教程 //gsoap ns service name: gservice //gsoap ns service style: rpc int ns__add(int num1, int num2, int* result ); int ns__sub(int num1, int num2, int* result ); int ns__mult( int num1, int num2, int *result); int ns__divid( int num1, int num2, int *result); 2.从附件内gsoap-2.8包中搜索复制stdsoap2.h,stdsoap2.cpp,soapcpp2.exe, 存放于soapInterface.bat同级目录 3.双击soapInterface.bat运行。生成gClientSoap,gServerSoap两个文件夹,分别复制到服务器工程与客户端工程中使用 4.gClientSoap,gServerSoap两个文件夹内用到的文件功能说明,更多参考附件教程 1)soapC.cpp , soapH.h//soap的序列和反序列代码,它已经包含了soapStub.h 2)soapServer.c ppsoapServerLib.cpp //服务器端代码(纯C代码是soapServer.c soapServerLib.c ),soapServerLib.cpp文件则只是简单地包含soapServer.cpp和soapC.cpp 3)soapClient.cpp soapClientLib.cpp//客户端代码(纯C代码是soapClient.csoapClientLib.c ),soapClientLib.cpp文件则只是简单地包含soapClient.cpp和soapC.cpp 4) soapStub.h // soap的存根文件,定义了我们编写的头文件里对应的远程调用模型 5) add.nsmap //XML服务命名空间 6)服务器端要载入的文件有:soapServer.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h; 客户端要输入的文件有: soapClient.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h
使用gSOAP生成ONVIF框架代码需要遵循以下步骤: 1. 下载gSOAP工具包并安装到本地。 2. 下载ONVIF设备WSDL文件,例如https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl。 3. 使用gSOAP工具包中的wsdl2h工具将WSDL文件转换为头文件。 4. 使用soapcpp2工具生成ONVIF框架代码,例如: ```bash soapcpp2 -Iimport devicemgmt.h ``` 5. 在生成的代码中实现ONVIF设备的具体操作。 以下是在Linux系统中使用gSOAP生成ONVIF框架代码的示例: 1. 下载gSOAP工具包并安装到本地: ```bash wget https://sourceforge.net/projects/gsoap2/files/gSOAP/gsoap_2.8.112.zip unzip gsoap_2.8.112.zip cd gsoap-2.8 ./configure make sudo make install ``` 2. 下载ONVIF设备WSDL文件: ```bash wget https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl ``` 3. 使用wsdl2h工具将WSDL文件转换为头文件: ```bash wsdl2h -o onvif.h devicemgmt.wsdl ``` 4. 使用soapcpp2工具生成ONVIF框架代码: ```bash soapcpp2 -Iimport onvif.h ``` 5. 在生成的代码中实现ONVIF设备的具体操作。 在生成的代码中,每个ONVIF操作都有对应的函数,例如`SOAP_FMAC5 int SOAP_FMAC6 __tds__GetDeviceInformation(struct soap* soap, _tds__GetDeviceInformation* tds__GetDeviceInformation, _tds__GetDeviceInformationResponse &tds__GetDeviceInformationResponse)`就是获取设备信息的函数。您可以在这些函数中实现具体的操作。 另外,生成的代码中还有一些辅助函数和结构体,您也可以根据需要使用它们。 例如,以下代码片段演示了如何创建一个SOAP客户端并调用`__tds__GetDeviceInformation`函数: ```c++ #include "soapDeviceBindingProxy.h" const char* endpoint = "http://192.168.1.100/onvif/device_service"; DeviceBindingProxy proxy; proxy.soap_endpoint = endpoint; _tds__GetDeviceInformation tds__GetDeviceInformation; _tds__GetDeviceInformationResponse tds__GetDeviceInformationResponse; proxy.__tds__GetDeviceInformation(&tds__GetDeviceInformation, tds__GetDeviceInformationResponse); // 处理返回值 ``` 在使用时,需要将`endpoint`替换为实际的设备IP地址和ONVIF服务端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值