使用gSoap规避和修改ONVIF标准类型结构的解析
ONVIF/gSoap依赖关系及问题
- ONVIF是一组服务规范,标准参考
- gSoap是一套基于实现SOAP通信接口的工具链
即是,当我们需要访问ONVIF的Web Service或实现对ONVIF部分的支持;基于C/C++开发,则需要借助gSoap生成这之间的交互接口调用的代码。
gSoap生成代码
wsdl2h
将服务接口描述转换为soapcpp2的转换规则,生成中间头文件。
通常我们前期会选择实现部分服务标准;因此这期间生成的后续多为修改这次生成中间产物.h,而不会一切重新生成。
soapcpp2
这次是将中间定义转换为实现代码,以供C/C++使用;基本上此过程生成的产物不作特殊处理。因为生成体积庞大,不利于维护修改;而尽量查问题是查找源头或开发逻辑。
ONVIF开发遇到问题
在ONVIF开发过程中最先最常会遇到的问题就是
- 调用失败,解析出错
- 遇到soap_dom_element类型
下面就着重看看这两类问题的有效处理方式。
规避服务实际扩展带来的解析报错
针对第一个问题,大部分这类问题都说明服务响应的结构不规范,导致解析失败。(比如我遇到的就是雄迈的IPC,在ODT测试GetCapabilities时失败)
通常服务提供商基本服务是能够保证的,问题主要会出现在其扩展结构中。这就是ONVIF标准定义的xsd__anyType
扩展结构当然一般都是可选字段,此时我们忽略不使用即可(只要不影响我们应用需求),观看gsoap生成代码以及最终修改实践我发现,可选字段我们可以选择忽略,这样恰好就规避掉了这情况带来的解析报错,往往一个调用引发的错误,是会导致应用逻辑的决策。
忽略操作,这时候我需要将soapcpp2中间规则的.h中找到相应结构描述的地方,仔细查看该字段如果是Optional,则注释忽略掉便是。重新用soapcpp2工具处理生成新的代码完成。
将 xsd__anyType修改成指定解析结构
对于这个,最常见的就是我们要处理ONVIF对于Event通知的时候,默认生成的都是soap_dom_element这类型结构,如果类型复杂,我们会很难为,需要好深层的遍历实属刁难。但好在对于Event这类实现也是依据规范来实现的,基本填充的内容都标准结构类型。因此我们只要解析出相应的结构信息就可以方便我程序开发使用。
此处参考ONVIF Event消息解析。
总之,这样一来我们将更方便更好的使用gsoap协助我们的开发工作,预计下一篇内容会往使用gsoap手动序列化,从而突破只用工具生成庞大量代码。因为生成代码都是规则化可视的,如果窥得其中要领,则非常有利于我们简化依赖和为生成代码瘦身。这对于程序发行使用是非常有利的。
使用gSoap规避和修改ONVIF标准类型结构的解析的更多相关文章
- 使用gSoap规避和改动ONVIF标准类型结构的解析
ONVIF/gSoap依赖关系及问题 ONVIF是一组服务规范,标准參考 gSoap是一套基于实现SOAP通信接口的工具链 即是,当我们须要訪问ONVIF的Web Service或实现对ONVIF部分 ...
- day2_python学习笔记_chapter4_标准类型和内建函数
1. 标准类型 Integer,Boolean, Long integer, Floating point real number, Complex number, String, List, Tup ...
- python基础----isinstance(obj,cls)和issubclass(sub,super)、反射、__setattr__,__delattr__,__getattr__、二次加工标准类型(包装)
一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否ob ...
- python基础之类的内置__setattr__,__delattr__,__getattr__和 二次加工标准类型(包装)
一.内置attr:__setattr__,__delattr__,__getattr__ __setattr__ #添加/修改属性会触发它的执行 __delattr__ #删除属性的时候会触发 __g ...
- 标准类型String(学习中)
1.读取string对象 #include<iostream> #include<cstring> using namespace std; int main() { stri ...
- 标准类型内建函数 cmp()介绍
内建函数cmp()用于比较两个对象obj1 和obj2, 如果obj1 小于obj2, 则返回一个负整数,如果obj1 大于obj2 则返回一个正整数, 如果obj1 等于obj2, 则返回0.它的行 ...
- 【风马一族_windom】 批量修改相同文件类型的后缀
难题:有时因为某种原因,修改一堆文件的类型,重复操作次数多,浪费时间也跟着多,收获也会相当少. 提问:对于软件而言,可量化的,有规律的操作,可以使用程序来进行替代. 特性:在微软操作系统上,不同后缀的 ...
- 一次修改mysql字段类型引发的技术探究
说来,mysql数据库是我们项目中用的比较多的库,ORM工具喜欢采用细粒度的MyBatis.这里面就这么引出了两者之间的故事! 首先,说改字段吧,将一个表中的varchar字段改为enum字段.如下: ...
- 修改Java标准库源码
以下是摘抄,实际操作没有测试 先前我曾提到,原本想借由“改动Java标准库源码”来测知Class object的生成,但由于其ctor原始设计为private,也就是说不可能透过这个管道生成Cla ...
随机推荐
- 【转】android4.1.1系统编译全过程
原文网址:http://blog.csdn.net/hudan2714/article/details/7926924 一.编译环境: 首先介绍编译中使用的工具: 虚拟机: vmare 9 下载 ...
- web页面布局思想
一.盒子模型 网页可以看成由一个个"盒子"组成,如图: 由上图可以看出,页面分为上(网站导航).中.下(版权声明)三个部分,中间部分又分为左(商品分类).中(主要部分).右,这些版 ...
- MySQL中的类Decode用法
SELECT DISTINCT ( CASE ' THEN '关羽' ' THEN ' 张飞' ' THEN ' 赵云' ' THEN ' 马超' ' THEN ' 黄忠' ' THEN ' 魏延' ...
- java IO复习(三)
package com.zyw.io; import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; ...
- 炮兵阵地 - POJ 1185(状态压缩)
分析:先枚举出来所有的合法状态(当N=10的时候合法状态最多也就60种),用当前状态匹配上一行和上上一行的状态去匹配,看是否可以.....复杂度100*60*60*60,也可以接受. 代码如下: == ...
- 【matlab】matalb生成dll给Cpp用
http://blog.csdn.net/scudz/article/details/13628917 这篇文章写得很好,我跟据这个,操作了一下,发现,好用,精简版总结如下 1. matlab打开一个 ...
- js判断是否为手机浏览器
JS判断手机浏览器 判断原理: JavaScript是前端开发的主要语言,我们可以通过 编写JavaScript程序来判断浏览器的类型及版本.JavaScript判断浏览器类型一般有两种办法,一种是根 ...
- HTML --- 盒模型
绝对对位 position:absolute; 当一个元素设定了绝对对位, 如果他的父元素有设置定位(不管是绝对还是相对定位),那么他的坐标就是相当于父元素的左上角 进行定位(即 left:1px;t ...
- 转:实现Java Web程序的自动登录
有很多Web程序中第一次登录后,在一定时间内(如2个小时)再次访问同一个Web程序时就无需再次登录,而是直接进入程序的主界面(仅限于本机).实现这个功能关键就是服务端要识别客户的身份.而用Cookie ...
- Ubuntu 命令行下快速打开各类文件 分类: ubuntu shell 2014-11-18 20:06 210人阅读 评论(0) 收藏
xdg-open 命令可以用来在Ubuntu下快速打开各类文件. 下面是从 manual 文档里截取的内容: 可以知道,该命令的功能是在图形界面下按照用户的平时习惯打开各类文件,甚至是链接. 这样,我 ...