【Onvif从零实践】03、gSoap 最新版本的介绍、编译,以及 使用 gSoap 生成 Onvif 框架代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍gSoap编译以及使用🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你------泰戈尔🍭
⏰发布时间⏰:

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • [🎄二、简单了解 gSoap](#🎄二、简单了解 gSoap)
  • [🎄三、编译 gSoap](#🎄三、编译 gSoap)
    • [✨3.1 编译 openssl、zlib](#✨3.1 编译 openssl、zlib)
    • [✨3.2 编译 gSoap](#✨3.2 编译 gSoap)
  • [🎄四、使用 gSOAP 生成 ONVIF 框架代码](#🎄四、使用 gSOAP 生成 ONVIF 框架代码)
    • [✨4.1 使用 wsdl2h 生成 .h 文件](#✨4.1 使用 wsdl2h 生成 .h 文件)
    • [✨4.2 使用 soapcpp2 生成 onvif 框架代码](#✨4.2 使用 soapcpp2 生成 onvif 框架代码)
  • 🎄五
  • 🎄六、

🎄一、概述

ONVIF基于Web Services架构,以WSDL定义服务接口,SOAP协议传输控制信令,媒体流则通过RTP/RTSP传输。

如果说,我们自己去解析WSDL,组装成SOAP消息,再通过HTTP+SOAP的方式跟服务器通信,那将是一个比较繁琐的工作。这篇文章介绍一个第三方开源库 gSoap ,它帮我们做了 Web Services 架构相关的很多工作,使Onvif相关的开发工作变得简单很多。下面先了解一下gSoap,然后介绍怎样使用这个库生成 Onvif 框架代码。


🎄二、简单了解 gSoap

gSOAP 工具套件(toolkit)是一套广泛的可移植C和C++软件,用于开发具有强大的类型安全XML数据绑定的XML Web服务。易于使用的代码生成器工具允许您在C和C++中直接集成XML数据。用XML序列化本机应用程序数据。包括WSDL/XSD模式绑定和自动编码工具、存根/框架编译器、与Apache模块和IIS扩展的Web服务器集成、带模式验证的高性能XML处理、快速MIME/MTOM流、SOAP和REST Web API开发、WS-*协议(WS-Security、WS-Policy、WS-ReliableMessaging等)、XML-RPC和JSON。GPLv2许可。

使用 gSoap 生成 Onvif 框架代码时,我们必须要用gSoap的两个工具:wsdl2hsoapcpp2

  • wsdl2h:将WSDL文件转换为 .h 文件;
  • soapcpp2:生成框架代码。

gSOAP开源版下载网址(最新版本):https://sourceforge.net/projects/gsoap2/

gSOAP开源版下载网址(历史版本):https://sourceforge.net/projects/gsoap2/files/

本文下载的是当前(2025-08-06)最新版本:gsoap_2.8.139.zip


🎄三、编译 gSoap

本文使用的编译环境:

  • 系统:Ubuntu 18.04
  • 编译器:gcc 7.5.0

✨3.1 编译 openssl、zlib

因为现在的 Onvif 的 WSDL 网址都是以https开头的,所以我们编译 gSoap 时也需要支持 https 的,这样的话,我们先需要编译 openssl 库。本文使用的是 openssl 版本是 openssl-1.1.1 的。

关于 openssl 的编译可以参考这篇文章:openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)

其次,是编译zlib库,可以参考这篇文章:zlib库最新版本(zlib-1.3.1)在Ubuntu(Linux)系统下的 编译 、交叉编译(移植)


✨3.2 编译 gSoap

将下载好的 gsoap_2.8.139.zip 放到系统的一个目录里,并且将openssl库、zlib库放到同一目录,执行下面步骤:

sh 复制代码
unzip gsoap_2.8.139.zip
cd gsoap-2.8/
./configure --prefix=`pwd`/../result_gcc --with-openssl=`pwd`/../openssl-1.1.1w_result_gcc --with-zlib=`pwd`/../zlib_result_gcc
make && make install

--prefix:指定 gSoap 的安装目录;
--with-openssl:openssl库的所在路径;
--with-zlib:zlib库的所在路径。

编译遇到如下问题:

  • 问题一:autoheader: 未找到命令

    复制代码
    (CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash '/home/samba/opensource/20_gsoap/gsoap-2.8/missing' autoheader)
    /home/samba/opensource/20_gsoap/gsoap-2.8/missing: 行 81: autoheader: 未找到命令
    WARNING: 'autoheader' is missing on your system.
             You should only need it if you modified 'acconfig.h' or
             'configure.ac' or m4 files included by 'configure.ac'.
             The 'autoheader' program is part of the GNU Autoconf package:
             <https://www.gnu.org/software/autoconf/>
             It also requires GNU m4 and Perl in order to run:
             <https://www.gnu.org/software/m4/>
             <https://www.perl.org/>
    Makefile:426: recipe for target 'config.h.in' failed
    make: *** [config.h.in] Error 127

    解决sudo apt install autoconf

  • 问题二:autoheader: 未找到命令

    复制代码
    make[4]: 进入目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap/src"
    /bin/bash ../../ylwrap soapcpp2_yacc.y y.tab.c soapcpp2_yacc.c y.tab.h `echo soapcpp2_yacc.c | sed -e s/cc$/hh/ -e s/cpp$/hpp/ -e s/cxx$/hxx/ -e s/c++$/h++/ -e s/c$/h/` y.output soapcpp2_yacc.output -- yacc -d -v 
    ../../ylwrap: 行 176: yacc: 未找到命令
    Makefile:540: recipe for target 'soapcpp2_yacc.c' failed
    make[4]: *** [soapcpp2_yacc.c] Error 127
    make[4]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap/src"
    Makefile:828: recipe for target 'all-recursive' failed
    make[3]: *** [all-recursive] Error 1
    make[3]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap"
    Makefile:456: recipe for target 'all' failed
    make[2]: *** [all] Error 2
    make[2]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap"
    Makefile:473: recipe for target 'all-recursive' failed
    make[1]: *** [all-recursive] Error 1
    make[1]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8"
    Makefile:381: recipe for target 'all' failed
    make: *** [all] Error 2

    解决:sudo apt install bison

    如果版本比较旧的Ubuntu,无法执行 install,可以参考这篇文章:Ubuntu12.04(32bit)下安装bison和flex

    或者到官网 http://www.gnu.org/software/bison/ 下载匹配的版本安装。

  • 问题三:flex: 未找到命令

    复制代码
    mv -f .deps/soapcpp2-soapcpp2_yacc.Tpo .deps/soapcpp2-soapcpp2_yacc.Po
    /bin/bash ../../ylwrap soapcpp2_lex.l .c soapcpp2_lex.c -- /bin/bash '/home/samba/opensource/20_gsoap/gsoap-2.8/missing' flex  
    /home/samba/opensource/20_gsoap/gsoap-2.8/missing: 行 81: flex: 未找到命令
    WARNING: 'flex' is missing on your system.
             You should only need it if you modified a '.l' file.
             You may want to install the Fast Lexical Analyzer package:
             <https://github.com/westes/flex>
    Makefile:537: recipe for target 'soapcpp2_lex.c' failed
    make[5]: *** [soapcpp2_lex.c] Error 127
    make[5]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap/src"
    Makefile:334: recipe for target 'all' failed
    make[4]: *** [all] Error 2
    make[4]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap/src"
    Makefile:828: recipe for target 'all-recursive' failed
    make[3]: *** [all-recursive] Error 1
    make[3]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap"
    Makefile:456: recipe for target 'all' failed
    make[2]: *** [all] Error 2
    make[2]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8/gsoap"
    Makefile:473: recipe for target 'all-recursive' failed
    make[1]: *** [all-recursive] Error 1
    make[1]: 离开目录"/home/samba/opensource/20_gsoap/gsoap-2.8"
    Makefile:381: recipe for target 'all' failed
    make: *** [all] Error 2

    解决:sudo apt install flex

    如果版本比较旧的Ubuntu,无法执行 install,可以参考这篇文章:Ubuntu12.04(32bit)下安装bison和flex

    或者到官网 http://www.gnu.org/software/bison/ 下载匹配的版本安装。

如果遇到上述三个遇到,按照步骤解决后,继续执行下面命令编译、安装 gsoap:

shell 复制代码
./configure --prefix=`pwd`/../result_gcc --with-openssl=`pwd`/../openssl-1.1.1w_result_gcc --with-zlib=`pwd`/../zlib_result_gcc
make && make install

编译完成后,在prefix指定的目录会有个bin目录,里面存放了 soapcpp2wsdl2h 两个可执行文件,我们就是需要这两个文件来生成Onvif框架代码的。

sh 复制代码
$ ls ../result_gcc/bin
soapcpp2  wsdl2h

🎄四、使用 gSOAP 生成 ONVIF 框架代码

使用 gSOAP 生成 ONVIF 框架代码主要分为两个步骤:

  • 1、使用 wsdl2h 将 wsdl 文件生成 .h 文件;
  • 2、使用 soapcpp2 根据上个步骤的 .h 文件生成 ONVIF 框架代码文件;

✨4.1 使用 wsdl2h 生成 .h 文件

  • 首先,看看是否需要修改 typemap.dat 文件,根据网址 https://www.genivia.com/resources.html 中的 【How do I use gSOAP with the ONVIF specifications?】决定是否修改,一般都不需要改

  • 在 gsoap2.8 源码目录,先进入gsoap,再创建用于存放生成的 .h 文件的目录gsoap/samples/onvif,再调用 wsdl2h 将 wsdl 文件转换成 onvif.h

    shell 复制代码
    cd gsoap
    mkdir -p samples/onvif
    ../../result_gcc/bin/wsdl2h  -P -x -c -s -t ./typemap.dat -o samples/onvif/onvif.h \
    https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl \
    https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl \
    https://www.onvif.org/ver10/media/wsdl/media.wsdl \
    https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl

    wsdl2h 工具的几个选项解释:

    shell 复制代码
    -P					不要创建从xsd__anyType继承的多态类型
    -x					不要生成_XML any/anyAttribute扩展性元素
    -c         	生成纯C风格的头文件,这将去除C++的一些特性
    -s         	不生成STL代码
    -t filename.dat		使用filename.dat代替默认的typemap.dat文件
    -o filename.h   	将wsdl转化为filename.h头文件。
    -n name      	使用name代替默认前缀ns
    -zX        	兼容之前的X版本

    查看生成的 .h 文件

    shell 复制代码
    $ ls samples/onvif/onvif.h -l
    -rw-r--r-- 1 lu lu 3483522 Jan 23 18:39 gsoap/samples/onvif/onvif.h
  • 修改生成的 onvif.h ,添加 #import "wsse.h" // 鉴权(认证),这是用于鉴权的。不加的话,使用soap_wsse_add_UsernameTokenDigest函数会导致编译出错。

至此,已经将需要的 wsdl 文件生成 .h 文件了。


✨4.2 使用 soapcpp2 生成 onvif 框架代码

接下来是生成 onvif 框架代码,还是在 gsoap2.8/gsoap 目录进入下面操作:

  • 使用 soapcpp2 生成代码

    shell 复制代码
    ../../result_gcc/bin/soapcpp2 -2 -C -L -c -x -I import:custom -d samples/onvif/ samples/onvif/onvif.h
  • 报错:wsa5.h(290): **ERROR**: service operation name clash: struct/class 'SOAP_ENV__Fault' already declared at wsa.h:278

    原因:onvif.h头文件中同时包含了wsdd10.hwsa5.hwsdd10.h中包含了wsa.h,wsa.h和wsa5.h两个文件重复定义了int SOAP_ENV__Fault。

    解决方法:修改import\wsa5.h文件,将int SOAP_ENV__Fault 修改为int SOAP_ENV__Fault_wkd

  • 修改后成功生成 onvif 框架代码

    shell 复制代码
    $ ../../result_gcc/bin/soapcpp2 -2 -C -L -c -x -I import:custom -d samples/onvif/ samples/onvif/onvif.h
    
    **  The gSOAP code generator for C and C++, soapcpp2 release 2.8.139
    **  Copyright (C) 2000-2025 Genivia Inc. All Rights Reserved.
    **  The soapcpp2 tool and its generated software are released under the GPL.
    **  ----------------------------------------------------------------------------
    **  A commercial use license is available from Genivia Inc., contact@genivia.com
    **  ----------------------------------------------------------------------------
    
    
    soap12.h(54): *WARNING*: option -1 or -2 overrides SOAP-ENV namespace
    
    
    soap12.h(55): *WARNING*: option -1 or -2 overrides SOAP-ENC namespace
    
    Using project directory path: samples/onvif/
    Saving samples/onvif/soapStub.h annotated copy of the source interface header file
    Saving samples/onvif/soapH.h serialization functions to #include in projects
    Using wsdd service name: wsdd
    Using wsdd service style: document
    Using wsdd service encoding: literal
    Using wsdd schema import namespace: http://schemas.xmlsoap.org/ws/2005/04/discovery
    Saving samples/onvif/wsdd.nsmap namespace mapping table
    Using tdn service name: RemoteDiscoveryBinding
    Using tdn service style: document
    Using tdn service encoding: literal
    Using tdn schema namespace: http://www.onvif.org/ver10/network/wsdl
    Saving samples/onvif/RemoteDiscoveryBinding.nsmap namespace mapping table
    Using tds service name: DeviceBinding
    Using tds service style: document
    Using tds service encoding: literal
    Using tds schema namespace: http://www.onvif.org/ver10/device/wsdl
    Saving samples/onvif/DeviceBinding.nsmap namespace mapping table
    Using tptz service name: PTZBinding
    Using tptz service style: document
    Using tptz service encoding: literal
    Using tptz schema namespace: http://www.onvif.org/ver20/ptz/wsdl
    Saving samples/onvif/PTZBinding.nsmap namespace mapping table
    Using trt service name: MediaBinding
    Using trt service style: document
    Using trt service encoding: literal
    Using trt schema namespace: http://www.onvif.org/ver10/media/wsdl
    Saving samples/onvif/MediaBinding.nsmap namespace mapping table
    Saving samples/onvif/soapClient.c client call stub functions
    Saving samples/onvif/soapC.c serialization functions
    
    Compilation successful (2 warnings)

🎄五

🎄六、

如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:

使用gSOAP生成ONVIF框架代码:https://blog.csdn.net/benkaoya/article/details/72466827

使用gSOAP创建SOAP调用实例:https://blog.csdn.net/zhizhengguan/article/details/109287574

ONVIF开发---ONVIF框架代码生成:https://blog.csdn.net/u011734326/article/details/100920064

gsoap使用方法,解析wsdl文档:https://blog.csdn.net/u013898698/article/details/55511148

相关推荐
飞火流星020271 年前
gsoap实现webservice服务
c语言·c++·webservice·gsoap·c编写soap服务端·webservices协议栈·服务端自动生成wsdl