使用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部分 ...
- 标准类型String(学习中)
1.读取string对象 #include<iostream> #include<cstring> using namespace std; int main() { stri ...
- 标准类型内建函数 cmp()介绍
内建函数cmp()用于比较两个对象obj1 和obj2, 如果obj1 小于obj2, 则返回一个负整数,如果obj1 大于obj2 则返回一个正整数, 如果obj1 等于obj2, 则返回0.它的行 ...
- 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 ...
- Effective JavaScript Item 40 避免继承标准类型
本系列作为Effective JavaScript的读书笔记. ECMAScript标准库不大.可是提供了一些重要的类型如Array,Function和Date.在一些场合下.你或许会考虑继承当中的某 ...
- Python学习15之python内置六大标准类型
1.六大标准类型:数值型,str,list,set,tuple,dic 2.数值型:int,float,bool,complex 3.区别: 1)数值型和str,tuple都是不可变类型 而list, ...
- 解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译)
解剖SQLSERVER 第四篇 OrcaMDF里对dates类型数据的解析(译) http://improve.dk/parsing-dates-in-orcamdf/ 在SQLSERVER里面有几 ...
随机推荐
- [eclipse] 三个操作技巧
[eclipse] 三个操作技巧 1.快捷键Ctrl+Shift+i:Debug调试中直接获取方法的返回值 在下图代码中,想知道getHost(),则在调试时运行完该句代码后,选中"urlU ...
- Delphi自写组件:可设置颜色的按钮(改成BS_OWNERDRAW风格,然后CN_DRAWITEM)
unit ColorButton; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, StdCtrls; ...
- WPF入门介绍
Windows Vista已经于2007年1月30正式发行零售版本,安装Vista的计算机将会大量出现.在Vista时代,身为编程员,就一定要具备Vista桌面应用开发的能力.而开发Vista桌面应用 ...
- MySQL 更新走全表和索引的评估记录数
#!/usr/bin/perl use DBI; $db_name='scan'; $ip='127.0.0.1'; $user="root"; $passwd="123 ...
- 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)
写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...
- LINUX编程学习笔记(十四) 创建进程与 父子进程内存空间
1什么是进程:进程是一个执行中的程序 执行的程序: 代码->资源->CPU 进程有很多数据维护:进程状态/进程属性 所有进程属性采用的一个树形结构体维护 ps -a//所有进程 ps - ...
- vdsm的SSL证书验证过程
1. Copy the VDSM certificate of the RHEV-H(Red Hat Enterprise Virtualization Hypervisor ) host to th ...
- ZooKeeper的安装、配置、启动和使用(一)——单机模式
ZooKeeper的安装.配置.启动和使用(一)——单机模式 ZooKeeper的安装非常简单,它的工作模式分为单机模式.集群模式和伪集群模式,本博客旨在总结ZooKeeper单机模式下如何安装.配置 ...
- 模拟spring框架注入实现原理
这个我是参见了别人的一些东西,不是原创! 定义一些抽象的方法: package com.huxin.springinject.dao; public interface Person { public ...
- OC 获取城市首字母
解析依据文件中面的内容,读入一个城市,输出所在首字母 比方读入 长春 输出 c 读入 北京 输出 b 不知道文本中的字体是什么格式 读取文件时 程序不能正确执行 运用oc中的字典 initWithOb ...