gsoap学习笔记一

2023-10-30

本文章是对gsoap中生成的cpp类型的代码框架的应用。因为要实现一些ONVIF规范中的一些功能,所以选择了gsoap生成代码框架。但是发现好多博客上都是生成的C的代码框架,使用起来很麻烦。而且引用插件功能的时候,什么时候需要修改文件内容,哪些配置需要加入什么插件代码,这些东西没有说明,而且gsoap本身生成代码框架的方式也不唯一,因此一开始不知所措。之前没有进行过C++开发,使用gcc和makefile进行编译更是没有概念,再加上gsoap的英文文档内容那不是一般的多,所以我感觉一开始看的时候,看博客文档看的头昏脑胀的。后来总结了一下该如何生成框架代码,如何编译以及怎么加入插件。
(其实CPP框架代码和C框架代码的编译方式是一样的,源码包中提供的插件代码都是c文件,在CPP框架下也不用修改为cpp后缀的,直接使用即可,我一开始不知道如何生成是因为,生成CPP代码框架的时候,不知道加入哪些文件,怎么编译)
所有的内容都是参考自源码包中的文档

常用插件

gsoap/plugin包含常用的插件:
The WS-Addressing plugin
The WS-Security plugin
The WS-Discovery plugin
The WS-ReliableMessaging plugin

The WS-Addressing plugin使用

如果你需要用到ONVIF中的web 服务寻址功能,那么需要添加此插件。一般也被The WS-Discovery plugin 和The WS-ReliableMessaging plugin需要。

首先,ONVIF使用WS-Addressing 2005/08,所以为了支持WS-Addressing 2005/08并支持 WS-Addressing 8/2004 应该在wsdl2h生成的头文件中添加

#import "wsa5.h"

这会把WS-Addressing 2005/08所需要的SOAP头结构体的定义导入到头文件中,并由soapcpp2插入到代码框架中。

使用:

  1. 在服务对应的WSDL文件上运行 wsdl2h -t typemap.dat
  2. 检查生成的头文件中是否包含 wsa5.h的导入,如果没有加入 #import "wsa5.h"
  3. 在wsdl2h生成的头文件上运行 soapcpp2 -a
    (参数解释在后面)
  4. 重新编译并链接stdsoap2.c/cpp dom.c/cpp(当需要的时候) wsaapi.c 和其他由soapcpp2 产生的代码文件

wsdl2h为要使用WS-Addressing服务的WSDL文件自动生成带有#import wsa.h的头文件
wsdl2h产生的头文件中可能包含以下导入语句

#import "soap12.h"
#import "wsa.h" // or wsa3.h (2003/03), wsa4.h (2004/03), wsa5.h (2005/03)

这些wsa文件中定义了WS-Addressing信息中的头元素。

The WS-Security plugin使用

插件代码的实现位于wsseapi.h 和 wsseapi.c中,另外还需要smdevp.c smdevp.h mecevp.c mecevp.h threads.c threads.h struct_timeval.c struct_timeval.h ,其中各个文件的作用如下:

smdevp: streaming XML signature and message digest engine
mecevp: streaming XML encryption engine
threads: multi-threading and locking support

为支持ws-security功能,需要在wsdl2h生成的头文件中添加

#import "wsse.h"

这会把WS-Security所需要的SOAP头结构体的定义导入到头文件中

使用:

  1. 在需要WS-Security头的服务对应的WSDL文件上运行 wsdl2h -t typemap.dat
  2. 检查生成的头文件中是否存在wsse.h的导入语句,如果没有,在生成的头文件中加入导入语句
  3. 在wsdl2h生成的头文件上运行soapcpp2,产生代码
  4. 用编译标志-DWITH_DOM -DWITH_OPENSSL 编译 stdsoap2.c/pp, dom.c/pp, smdevp.c, mecevp.c, wsseapi.c, threads.c, struct_timeval.c和生成的源文件,最终链接文件的时候需要加上-lssl -lcrypto -lz,

wsse引擎是线程安全的,但是如果需要支持HTTPS的话,需要学习 WS-Security and HTTPS章节的内容,才能确保和HTTPS整合的WS-Security的线程安全。

wsse 的代码实现是在wsseapi.h和wsseapi.c(c和c++)中。

    gsoap/custom/struct_timeval.c compile and link this file (C and C++).
    gsoap/plugin/smdevp.c compile and link this file (C and C++).
    gsoap/plugin/mecevp.c compile and link this file (C and C++).
    compile all sources with -DWITH_OPENSSL -DWITH_DOM.
    if you have zlib installed, compile all sources also with -DWITH_GZIP.
    link with -lssl -lcrypto -lz -lgsoapssl++ (or -lgsoapssl for C, or compile stdsoap2.cpp for C++ and stdsoap2.c for C).

(上述配置没有说明要加上treads.c,因为没有HTTPS配置的wsee是线程安全的,但是最好加上,没有用也无所谓,另外WS-Discovery插件也可能需要threads.c文件)

wsdl2h生成的头文件中应该导入wsse.h#import "wsse.h",这个声明默认支持WS-Security1.0 ,并接受WS-Security1.1,ONVIF使用wsse.h就可以了。为了默认支持WS-Security1.1并接受WS-Security1.0, 可以使用#import "wsse11.h"

The WS-Discovery plugin使用

wsdd的服务端实现需要此插件。
WS-Discovery插件的实现在wsddapi.c中

使用:

  1. 在代码中定义WS-Discovery的事件处理句柄
  2. 使用wsdd API 的函数
  3. 编译并链接stdsoap2.c dom.c/cpp(当需要的时候),threads.c(当需要的时候) wsddapi.c wsaapi.c 和soapcpp2生成的源文件。(因此WS-Discovery插件是需要WS-Addressing插件的)

wsddapi.c 实现了WS-Discovery的ad-hoc模式和managed模式。

The WS-ReliableMessaging plugin使用

WS-ReliableMessaging 插件在 wsrmapi.h和wsrmapi.c

使用:

  1. 在需要WS-ReliableMessaging和WS-Addressing头的WSDL文件上运行 wsdl2h -b -t typemap.dat
  2. 检查生成的头文件中是否导入了wsrm.h和 wsa5.h,如果没有的话,加入相应的导入语句
#import "wsrm.h" 
#import "wsa5.h"
  1. 在生成的头文件上运行soapcpp2 -a
  2. 重新编译并链接 stdsoap2.c/cpp dom.c/cpp(当需要的时候) wsrmapi.c wsaapi.c duration.c 和 soapcpp2生成的源文件

wsrm插件使用wsa插件实现的WS-Addressing 2005,两个插件都需要注册,wsrm插件API是独立的。 除非必须将特定于WS-Addressing的标头添加到消息中,否则无需使用wsa插件API。

使用gsoap生成onvif的开发环境

一、wsdl2h利用wsdl文件生成头文件

这里我们采用在线下载的方式,因为一个wsdl文件还依赖许多xsd文件进行验证,如果手动将这些xsd文件下载下来的话很麻烦。而采用在线下载的方式,wsdl2h工具可以自动处理并下载xsd文档。

wsdl2h -O4 -P -x -o onvif.h \
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl \
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl 

-O4 优化生成的头文件,(去除多余或者无用的部分,有四个优化等级)
-P 该选项禁止从xsd__anyType继承得到的类型的生成,因为ONVIF协议不需要继承xsd__anyType
-x 此选项删除为xsd:any和xsd:anyAttribute组件生成的结构和类的_XML类型成员。
-o 输出文件名

这里先只使用两个wsdl文件测试一下,如果还需要另外的功能,添加wsdl文档就可以了

虽然给的wsdl文档的url是http协议的,但实际上这里wsdl2h下载wsdl文档采用的是https的方式,在下载包里有windows和mac的wsdl2h二进制文件,但是不支持https。如果是linux的话,需要手动编译安装,./configure make sudo make install

注意:

  1. ONVIF使用WS-Addressing 2005/08 ,但是wsdd10.h假定WS-Addressing是 WS-Addressing 2004/08,因此需要将wsdd10.h改为wsdd5.h
  2. 加入#import wsa5.h(wsdd需要wsa插件)
  3. 加入#import wsse.h(因为有些操作需要进行安全验证)

二、利用soapcpp2生成源代码文件

./soapcpp2 -2 -C -I./import:./custom -j -x onvif.h
参数解释:
-2 在生成的源代码中全局使用SOAP1.2绑定
-C 只产生客户端代码
-I 指定onvif.h中import文件的寻找路径,多个路径用":"分隔开
-x 不产生示例xml文档
-j 这个选项使soapcpp2产生客户端的代理类和服务端的服务类代码,

三、将gsoap下载包中的插件代码拷贝到工程中
wsa插件需要: dom.cpp wsaapi.c wsaapi.h
wsse插件需要:smdevp.c smdevp.h mecevp.c mecevp.h threads.c threads.h struct_timeval.c struct_timeval.h

四、实现自己的代码部分
这部分就是写一个自己想要实现的功能,比如使用wsdd中的设备探测功能发现当前网段下支持ONVIF的设备。这部分就属于自定义了。

四、编译
对每个文件的编译选项
-W -Wall -g -fPIC -DWITH_OPENSSL -DWITH_DOM -DWITH_GZIP -lssl -lcrypto -lz

编译选项解释:
-W 只显示编译器认为会出现错误的警告
-Wall 显示所有警告
(补充 -w是关闭所有警告)
-g 在编译阶段产生调试信息
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。
-DWITH_NONAMESPACES 如果在编译时定义了此宏(默认情况下未定义),则消除了对全局名称空间表的依赖,而是用户必须通过调用soap_set_namespaces显式设置XML名称空间。对于soapcpp2 -i或者-j参数产生的代理对象,在创建时会自动分配一个命名空间,仍可以不使用soap_set_namespaces
-DWITH_OPENSSL 当这个宏在编译的时候被定义,为HTTPS或者WS-Security启用与Openssl的链接
-DWITH_DOM 如果在编译时定义了此宏(默认情况下未定义),则启用WS-Security签名验证和XML重新规范化,即,在将gSOAP WSSE插件用于WS-Security时必须定义此宏。
-DWITH_GZIP 如果在编译时定义了此宏(默认情况下未定义),则在运行时启用SOAP_ENC_ZLIB模式标志时,启用与zlib库的链接以进行HTTP消息压缩(使用compress和gzip方法)。

将每个文件用g++ 加上上述的编译选项编译成对象文件,然后再链接到一起就ok啦。

wsdl2h参数

-b 选项可确保为需要客户端回调服务的双工通信添加单向响应消息操作。

soapcpp2 参数

-a
-A

POST /WebServices/WeatherWebService.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3603)
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://WebXml.com.cn/getSupportCity"
Host: www.webxml.com.cn
Content-Length: 348
Expect: 100-continue
Connection: Keep-Alive

上面是一个webservice请求的http请求头,添加-a 参数生成的服务端代码在处理请求时,如果http的请求头中包含SOAPAction字段,根据该字段调用服务端代码,如果该字段不存在,按照请求体中的请求消息名称调用服务端代码。添加-A参数生成的服务端代码在处理请求时,要求使用http请求头中的SOAPAction调用服务端代码。

XML DOM API:

使用c++ API时,需要以下文件。
stdsoap2.h: gsoap engine
stdsoap2.cpp: gsoap engine
dom.cpp: DOM 解释器和DOM C/C++ API实现
dom.h: 头文件,不要在代码中#include该文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gsoap学习笔记一 的相关文章

  • maven创建自定义web工程模板

    一 先搭建好一个项目模板 这里推荐两种方式 更推荐第一种 第一种 maven创建web工程 使用模板方式 二 第二种 maven创建web工程不用模板 手动创建 一 注意每个文件夹下都放一个文件占位 否则创建模板时会认为是空目录不进行创建
  • xml模式文档(xml:Schema)详解

    XML Schema 是基于 XML 的 DTD 替代者 XML Schema 描述 XML 文档的结构 XML Schema 语言也称作 XML Schema 定义 XML Schema Definition XSD 下面的例子是一个XM
  • 使用teamviewer搭建内网服务器。

    目录 起因 下载并安装teamviewer 服务器安装ccproxy 客户端使用SwitchyOmega 起因 学习的时候 学习视频必须使用校内的网络才能连接观看 校外无法观看 所以使用teamviewer和proxy搭建一个方便访问的服务
  • 如何提高for循环的效率--兆易创新一面

    1 实例化变量放在循环外 include
  • 该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定

    1 关注微信公众号 公众平台安全助手 2 关闭该公众号的消息免打扰 如下 1 点击3个点 2 点击设置 3 关闭消息免打扰 如图所示 置灰
  • Windows 下Maven安装配置(本地仓库配置)

    一 下载maven maven官网 http maven apache org 下载下来也就是一个压缩文件 解压 我下载的是3 5 2版本 解压之后如下 路径为 D Program Files apache maven 3 5 2 二 配置
  • 批处理文件常用命令

    批处理有许多命令 1 Echo 命令 打开回显或关闭请求回显功能 或显示消息 如果没有任何参数 echo 命令将显示当前回显设置 语法 echo on off message Sample echo off echo hello world
  • Onvif协议学习:14、球机云台控制PTZ

    Onvif协议学习 14 球机云台控制PTZ 文章目录 Onvif协议学习 14 球机云台控制PTZ 一 介绍 二 代码实现 八个方向 放下及缩小控制 聚焦控制 原文链接 https blog csdn net u013566528 art
  • Unity在development模式下的一个坑

    最近发现unity生成的包在Nexus上如果打开带Input控件的界面时 关闭屏幕再打开 则永远无法显示输入法界面了 一开始还以为是unity自己本身的bug 后来发现release版本并无这个问题 于是弄了个最简单的测试版本分别打了 两个
  • (转)C++模板函数和重载

    C 模板函数和重载 先来看一个例子 include
  • 如何高逼格的写java代码

    记录一些了解的高逼格 好用的java代码 欢迎大家补充 共同学习 1 函数式接口 FunctionalInterface 好处 高逼格 代码收拢 解藕 统一处理 适用范围 具有共性的接口调用代码 举个栗子 在我们平时的微服务开发中 调用其他
  • cgo+gSoap+onvif学习总结:1、方案初衷、资料收集及cgo实现helloworld

    cgo gSoap onvif学习总结 1 方案初衷 资料收集及cgo实现helloworld 文章目录 cgo gSoap onvif学习总结 1 方案初衷 资料收集及cgo实现helloworld 1 前言 2 资料收集 3 cgo h
  • 零信任架构

    零信任架构 参考文章 基于SDP技术构建零信任安全 怎样实现零信任安全架构 什么是零信任 物理边界曾经是可信网络和不可信网络之间的有效分割 防火墙通常位于网络的边缘 基于静态策略来控制网络流量 位于防火墙内部的用户会被授予高信任等级来访问企
  • RESTful API介绍

    1 什么是RESTful API 一种流行的API设计风格 2 为什么使用RESTful架构 REST 是 Representational State Transfer 的缩写 如果一个架构符合 REST 原则 就称它为 RESTful
  • c++基于gSoap开发编译异常

    在程序中存在多个gSoap客户端代理类的话 比如我项目中用到的两个NMMAILGgzwSerSoapProxy h和ZJFaxMangerHttpBindingProxy h 其中第一个NMMAILGgzwSerSoapProxy h类是后
  • 编译 gSOAP 客户端时未定义的引用

    我正在尝试使用 C 语言为 Web 服务创建客户端 我使用 wsdl2h 和soapcpp2 生成了 C 文件 在 netbeans 中 我将生成的文件和 gSOAP 包含目录添加到项目的包含目录中 我的主文件如下所示 include
  • gSOAP 中的动态数组以 C++ 方式使用 STL 向量而不是 __ptr/__size?

    我正在使用 gSOAP 2 8 8 开发 Web 服务 我想发送自定义数据类型的无界序列 我可以通过以下方式实现这个gSOAP 用户指南第 11 11 节 http www cs fsu edu engelen soapdoc2 html
  • 创建共享对象时,不能使用针对未定义符号的重定位 R_X86_64_PC32;使用 -fPIC 重新编译

    我最近将 gSOAP 从 2 8 7 升级到 2 8 76 我必须对升级进行一些小的代码调整 但升级后代码将无法像以前那样链接到计算机上 我正在尝试使用 gSOAP 在使用 g 4 9 2 的计算机上创建共享库 我压缩了代码以创建一个测试用
  • 如何将多个 gsoap 客户端 Web 服务编译为一个可执行文件?

    I using gSOAP对于网络服务 但我有一个问题必须 将 2 个 Web 服务编译成一个可执行文件 还有一些 函数具有相同的名称 而不是使用参数 函数名称的其他前缀 编译错误 X o In function soap get stri
  • 如何使用适用于 C 和 C++ 的 GSOAP 访问 Amazon AWS S3?

    我到处搜索这个 但找不到一个合适的代码 我怎样才能访问亚马逊 AWS S3 http aws amazon com s3 服务使用GSOAP http gsoap2 sourceforge net 下面的代码来自OP 最初 该帖子包含问题和

随机推荐

  • 高防cdn和高防服务器有什么不一样?

    高防cdn 相信很多看过我们文章的小伙伴对cdn已经很了解了 cdn的原理很简单 就是构建在网络上的很多个节点 为网站作内容 分发 使用户就近获取所需资源 且分配的cdn节点都是高防节点 每个节点都有防御功能 还可以帮助用户隐藏真实ip 高
  • t-SNE数据降维(2维3维)及可视化

    最近看了一个叫光谱特征在后门攻击中的用法 读完之后发现是用了一个SVD也就是奇异值分解做了降维 然后用残差网络的representation层残差与残差的奇异值分解后的右奇异值矩阵的第一行做乘法得到correlation 疑惑得很什么时候相
  • 【CSS】如何设置行距、段落间距、缩进格式

    在使用MarkDownHere的时候 需要利用CSS编辑各个段落的格式 本文记录了CSS中编辑格式的各个属性及其设置 行距 行距一般使用line height value 来表示 比如要设置行距为2则可利用下面的属性 line height
  • M1(arm) Mac安装open3d

    问题 说在前面 open3d对arm架构的机器支持相对比较晚 所以目前还在完善当中 我试了官方给出的两种方法安装都出现了错误 首先给出官方的安装说明 Open3D ARM support 第一种 conda环境直接使用pip安装 即如下命令
  • python的概念及特点

    1 python语言 1 1 python语言的基本概念 python是一种极少数能兼具简单与功能强大的编程语言 官方介绍 python是一款易于学习且功能强大的编程语言 它具有高效率的数据结构 能够简单又有效地实现面象对象编程 pytho
  • 利用labelimg制作目标检测数据集

    labelimg介绍 Labelimg是一款开源的数据标注工具 可以标注三种格式 1 VOC标签格式 保存为xml文件 2 yolo标签格式 保存为txt文件 3 createML标签格式 保存为json格式 labelimg的安装 lab
  • Sublime Text 3 配置python 智能提示

    Sublime Text 3 配置python 智能提示 一 安装使用插件管理包 Package Control 安装教程参考地址 使用方法 安装成功后会显示出package control 点击package control 搜索 ins
  • mysql serial 类型_Mysql自增类型serial

    最近看前辈们的代码 发现了一个没有接触过的类型 serial 下面是关于serial的官方介绍 SERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO INCREMENT UNIQUE SE
  • 使用扩展的ping和扩展的traceroute命令

    ping命令ping 信息包互联网探索程序 命令是排除设备的可及性的一个非常普通的方法故障 它使用二个互联网控制信息协议 ICMP 查询消息 ICMP响应请求和ICMP回音应答确定一台远端主机是否是活跃的 ping命令也测量用收到ECHO回
  • node.js+uni计算机毕设项目基于微信小程序的健康管理系统(程序+小程序+LW)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • [转]Ubuntu自带的FTP服务器vsftpd技巧

    实现了Apache多用户的虚拟主机设置 那么一般这些用户都会选择用ftp上传的方式来管理自己的web内容 这就需要我们再为他们开设FTP服务 Ubuntu自带的FTP服务器是vsftpd 1 安装vsftpd Ubuntu安装软件倒不是件困
  • ag-gride-vue滚动条调整

    v deep ag layout normal overflow y overlay v deep ag theme alpine dark hover ag body horizontal scroll viewport margin r
  • Matlab中使用latex风格

    Matlab绘图时使用latex风格的符号和字体 往往能够使你的图形增色不少 在Matlab中 title text xlabel ylabel和legend均可使用latex风格的符号和字体 多说无益 直接上例子 title E 2 t
  • php参考文献外文文献,web of science怎么导出参考文献

    web of science导出参考文献的方法 首先登录web of Science网站 选择文献 然后选中所需要的文献 点击页面上方中间 保存至Endnote online 旁边的下拉箭头 选择保存位置即可 本文操作环境 Windows7
  • 通过apply进行数据预处理

    数据准备 这里我事先下载了一个csv文件 其中包含两列 时间戳和字符串 大小为近8000行 使用apply进行预处理 apply可以批量的改变dataframe中的数据 经过上边的处理 在df中添加了一列 全部都是a 将A列改的值为大写 a
  • 写给Android开发者的性能优化指南(Android 性能优化的方面方面都在这儿)

    众所周知 一个好的产品 除了功能强大 好的性能也必不可少 有调查显示 近90 的受访者会因为APP性能差而卸载 性能也是造成APP用户沮丧的头号原因 而且随着产品的更新迭代 功能的越发复杂 UI页面的越发丰富 性能问题变得更加严重 说实话要
  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么
  • 毕业设计-基于机器学习的软件漏洞挖掘方法

    目录 前言 课题背景和意义 实现技术思路 一 基于机器学习的软件漏洞挖掘流程 二 代码的表征形式 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近
  • getopts 可选参数_linux shell命令行选项与参数用法详解--getopt

    本文介绍了linux shell中使用命令行选项与命令行参数的方法 在bash中 可以用以下三种方式来处理命令 行参数 每种方式都有自己的应用场景 问题描述 在linux shell中如何处理tail n 10 access log这样的命
  • gsoap学习笔记一

    本文章是对gsoap中生成的cpp类型的代码框架的应用 因为要实现一些ONVIF规范中的一些功能 所以选择了gsoap生成代码框架 但是发现好多博客上都是生成的C的代码框架 使用起来很麻烦 而且引用插件功能的时候 什么时候需要修改文件内容