<工具产生背景>
         由于SOAP是一种基于xml的文件,手动编写SOAP文件太机械耗时,在这种背景下产生了gSAOP 这个工具,用于生成各种类型的代码,目前支持C/C++,如果索引ONVIF框架代码就会发现,代码中最主要的工作是将程序中的数据生成xml文件,或者是将xml文件中的数据解析成程序中的数据。

<准备工作>
➤工具下载 
        到网站https://www.genivia.com/dev.html下载相应工具,目前最新的版本是gSOAP 2.8.53 但是该官网需要密匙才能下载,所以还是到csdn上面去找。
    或者到gsoap官网https://sourceforge.net/projects/gsoap2/下载最新版gsoap(本次版本为gsoap_2.8.17)并解压。

 ➤下载wsdl文件
       到ONVF官网https://www.onvif.org/profiles/specifications/下载最新的wsdl文件。

 
该官网上面没有具体的下载链接,所以有一个技巧,如果想要查看该wsdl文件中各个数据的含义,可以单击该文件链接。

 下载wsdl文件,根据业务需要,选择相应的wsdl文件,右击该文件链接——>选择另存为——>保存到本地的某个文件夹中就行了。

➤新建工作空间

新建一个文件夹叫wsdl2h.exe soapcpp2.exe,解压的gsoap_2.8.17文件夹,将

(1)goap_2.8.17\gsoap-2.8\gsoap 路径下的typemap.dat

(2)gsoap_2.8.17\gsoap-2.8\gsoap\bin\win32 路径下的wsdl2h.exe soapcpp2.exe

(3)将下载的wsdl文件放在和wsdl2h.exe soapcpp2.exe同一路径下(注意:其中包含文件 onvif.xsd ,types.xsd ,b-2.xsd ,bf-2.xsd,r-2.xsd,t-1.xsd ,ws-addr.xsd ,ws-discovery.xsd 。这些文件和wsdl文件一样从官网上下载)。

<生成框架代码>
➤生成onvif.h文件
        打开windows平台的cmd(win+r) ,通过cmd进入到新建的文件夹下面(wsdl2h.exe soapcpp2.exe),然后执行以下命令:
wsdl2h -o onvif.h -c -s -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl media.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl
 
注意:根据业务需求选择wsdl文件,如果对文件不熟悉,可以全部包含进去,防止出现函数找不到的情况,弊端是导致代码量过大,编译时间过长。
remotediscovery.wsdl :用于发现设备
devicemgmt.wsdl :用于获取设备参数
media.wsdl:用于获取视频流地址
ptz.wsdl:用于设备的PTZ控制
我这里只使用了以上4个文件,所以执行命令如下
wsdl2h -o onvif.h -c -s -t ./typemap.dat remotediscovery.wsdl devicemgmt.wsdl media.wsdl  ptz.wsdl
 
➣参数解析
-c : 生成c风格代码(注:后缀名还是.cpp ,但实际上是.c)
-c++:生成c++风格代码(注 : 默认是生成c++代码)
-x : 表示不生成xml 文件(注:生成的xml文件,有助于了解发送是SOAP是怎样的结构,建议不使用-x)
-l : 表示指定导入路径
-C : 表示生成客户端代码
-S : 表示生成服务端代码
-s : 不使用STL代码
-o: 生成.h文件叫什么名字
-t : 后面紧跟“typemap.dat”这个批处理文件
 
执行完该命令后,可以在当前目录变成如下,其中增加了onvif.h文件,该文件是接下来生成框架代码的前提:
➤正式生成框架代码
    在项目开发过程中,往往需要使用“鉴权”这项功能(访问或修改设备参数,需要用户名跟密码,在数据传输过程中,密码是进行了加密处理的),所以在正式生成代码之前在onvif.h文件中加上下面的代码:
#import "wsse.h"
 
    这样在接下生成的框架代码中才有相应的加密函数接口(注意:在Linux环境下,一定要安装openssl库)。
➣准备工作
    (1)将gsoap_2.8.14\gsoap-2.8\gsoap\import拷贝到同gsoapcpp2.exe文件夹下
    (2)将gsoap_2.8.14\gsoap-2.8\gsoap\custom拷贝到同gsoapcpp2.exe文件夹下
通过cmd进入到gsoapcpp2.exe所在文件夹,执行一下命令:
soapcpp2 -2 -c onvif.h -I .\custom -I .\import -I .\import
 
➣参数解析
-c : 生成c风格的代码,因为默认是c++风格的代码
-2:采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
-I : 指定路径
-x : 不产生xml 文件(不建议是用该选项,xml在开发中具有参考意义)
注意:可以是用以下命令查看各个参数的详细作用
gsoapcpp2  -help
 
执行完以上命令后,可以看见当前文件夹下出现了很多.h文件.c文件.nsmap文件.xml文件(因为.xml文件太多,剪切到xml文件夹下面了)
 
➣提取需要的文件
    将soapC.c , soapH.h , soapClient.c , soapClientLib.c , soapServer.c(用于服务端/设备端的开发) , soapServerLib.c(用于服务端/设备段的开发) soapStub.h , onvif.h(该文件基本已经没有用处了)拷贝到一个单独的文件夹"ONVIF"下面。
    将文件gsoap-2.8\gsoap\dom.c拷贝到ONVIF中(该文件好像没什么作用)
    将文件gsoap-2.8\gsoap\custom\duration.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\custom\duration.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\mecevp.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\mecevp.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\smdevp.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\smdevp.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\stdsoap2.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\stdsoap2.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\threads.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\threads.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\wsaapi.c拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\wsaapi.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\wsseapi.h拷贝到ONVIF中
    将文件gsoap-2.8\gsoap\plugin\wsseapi.c拷贝到ONVIF中
    将生成的.nsmap文件中的任意一个(因为生成的.nsmap文件中的内容都是一样的)拷贝到ONVIF中
ONVIF文件中所有文件如下所示:

利用以上框架代码,新建main.c就可以开始项目开发了。

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

使用gSOAP工具生成onvif框架代码的更多相关文章

  1. gsoap工具生成wsdl接口 注意事项

    wsdl是通过wsdl文件作为不同应用的通信接口,所以如何生成wsdl语言很重要,但是很多时候我们发现自己编写的头文件通过gsoap工具soapcpp2.exe从头文件中无法正常生成对应的wsdl语言 ...

  2. 用MyEclipse自带工具生成WebService客户端代码

    本文章主要是介绍如何利用已经发布了的Webservice的wsdl来自动生成java的客户端代码.注意:本方法需要你采用的java版本是1.5或者以上的版本,采用MyEclipse来自动生成代码. w ...

  3. 基于数据库的自动化生成工具,自动生成JavaBean、数据库文档、框架代码等(v5.8.8版)

    TableGo v5.8.8版震撼发布,此次版本更新如下:          1.新增两个扩展字段,用于生成自定义模板时使用.          2.自定义模板新增模板目录,可以选择不同分类目录下的模 ...

  4. android studio 插件开发(自动生成框架代码插件)

    android studio 插件开发 起因 去年公司开始上新项目,正好android在架构这方面的讨论也开始多了起来,于是mvp架构模型就进入我们技术选择方案里面,mvp有很多好处,但是有一个非常麻 ...

  5. 利用代码生成工具生成基于ABP框架的代码

    在前面随笔,我介绍了整个ABP优化过框架的分层模型,包括尽量简化整个ABP框架的各个层的关系,以及纳入一些基类的辅助处理,使得我们对应业务分层类或者接口尽可能减少代码,并具有生产环境所需要的基类接口, ...

  6. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.0.0版)

    TableGo v6.0.0 版震撼发布,此次版本更新如下: 1.UI界面大改版,组件大调整,提升界面功能的可扩展性. 2.新增BeautyEye主题,界面更加清新美观,也可以通过配置切换到原生Jav ...

  7. [Java 开源项目]一款无需写任何代码,即可一键生成前后端代码的工具

    作者:HelloGitHub-小鱼干 JeecgBoot 是一款基于代码生成器的低代码开发平台,零代码开发.JeecgBoot 采用开发模式:Online Coding 模式-> 代码生成器模式 ...

  8. JSON生成c#类代码小工具

    JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...

  9. mybatis代码生成(generator工具生成代码)

    generator工具生成代码 下载地址     http://pan.baidu.com/s/1bY8C0I

随机推荐

  1. 【leetcode 简单】 第七十一题 二叉树的所有路径

    给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2->5", ...

  2. STL-map and multimap

    定义 map<int,int> a; map<int,string> a; map<double,int> a; …… 首先要知道的一些 Map是STL的一个关联容 ...

  3. dubbox ExceptionMapper Filter request response 数据获取 数据传递

    dubbx虽然是基于jboss的resteasy实现restfull,但是对resteasy原生的配置却不支持(可能是考虑到dubbo本事的设计模式及实现难度,但是和大部分framework的设计风格 ...

  4. translate 与 相对、绝对定位

    垂直水平居中是日常前端开发当中一个常见的需求,在支持 CSS3 属性的现代浏览器当中,有一个利用 CSS3 属性的垂直水平居中方法: position absolute; :; :; :transla ...

  5. qt中int与string的相互转换

    我经常搞错这个问题,一直以为整形int b可以直接使用函数toString呢! 但是在qtCreator中在整形后面不管怎么按点(可以自动提示)他就是不给我提示,我就纳闷了这样居然不行 百度了之后才知 ...

  6. imperva 默认策略添加例外

    创建违规访问 检查违规的告警类型 假如客户的这个目录下真的有这个文件,而且客户非常明确这是一个正常且安全的东西怎么办?我该如何的将它添加到例外? 添加例外的步骤: 再次构造违规的请求: 默认策略添加例 ...

  7. MySQL服务器修改主机名后问题解决

    1.单机MySQL主机名修改 今天无事看到自己的主机名不对,于是改了一下,以便区分服务器,那只重启MySQL时出现下面错误: MySQL manager or server PID file coul ...

  8. mysql insert锁机制【转】

    最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...

  9. 【日记】NOIP2018

    day-2: 最后一次走出机房,刚下过几天的雨,感受到的是彻骨的寒意.下午离开教室,跟班主任请了接下来几天的假,班主任斜视了我一眼,哼了一声,确认了一下,不再理会我了.班里的同学或是忙着自己的作业,或 ...

  10. leetcode刷刷刷

    1.链表节点的插入排序(写了个插入排序,但是报段错误,自己编译器里能运行) #include <iostream> #include <stdlib.h> #include & ...