Onvif开发之代码框架生成篇
生成Onvif相关源代码(我现在使用的gsoap版本是gsoap2.8.14,下面有下载地址):
在下载的gsoap文件下,在/gsoap-2.8/gsoap的目录下有有个typemap.dat文件,后面就是通过此文件来生成onvif.h文件的。在这里说明下
利用gsoap-2.8.8的版本的话,需要稍微修改下typemap.dat文件,在其后面添加如下内容:
- tds = "http://www.onvif.org/ver10/device/wsdl"
- tev = "http://www.onvif.org/ver10/events/wsdl"
- tls = "http://www.onvif.org/ver10/display/wsdl"
- tmd = "http://www.onvif.org/ver10/deviceIO/wsdl"
- timg = "http://www.onvif.org/ver20/imaging/wsdl"
- trt = "http://www.onvif.org/ver10/media/wsdl"
- tptz = "http://www.onvif.org/ver20/ptz/wsdl"
- trv = "http://www.onvif.org/ver10/receiver/wsdl"
- trc = "http://www.onvif.org/ver10/recording/wsdl"
- tse = "http://www.onvif.org/ver10/search/wsdl"
- trp = "http://www.onvif.org/ver10/replay/wsdl"
- tan = "http://www.onvif.org/ver20/analytics/wsdl"
- tad = "http://www.onvif.org/ver10/analyticsdevice/wsdl"
- tdn = "http://www.onvif.org/ver10/network/wsdl"
- tt = "http://www.onvif.org/ver10/schema"
- # OASIS recommended prefixes
- wsnt = "http://docs.oasis-open.org/wsn/b-2"
- wsntw = "http://docs.oasis-open.org/wsn/bw-2"
- wsrfbf = "http://docs.oasis-open.org/wsrf/bf-2"
- wsrfr = "http://docs.oasis-open.org/wsrf/r-2"
- wsrfrw = "http://docs.oasis-open.org/wsrf/rw-2"
- wstop = "http://docs.oasis-open.org/wsn/t-1"
- # WS-Discovery 1.0 remapping
- wsdd10__HelloType = | wsdd__HelloType
- wsdd10__ByeType = | wsdd__ByeType
- wsdd10__ProbeType = | wsdd__ProbeType
- wsdd10__ProbeMatchesType = | wsdd__ProbeMatchesType
- wsdd10__ProbeMatchType = | wsdd__ProbeMatchType
- wsdd10__ResolveType = | wsdd__ResolveType
- wsdd10__ResolveMatchesType = | wsdd__ResolveMatchesType
- wsdd10__ResolveMatchType = | wsdd__ResolveMatchType
- # SOAP-ENV mapping
- SOAP_ENV__Envelope = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope
- SOAP_ENV__Header = | struct SOAP_ENV__Header
- SOAP_ENV__Fault = | struct SOAP_ENV__Fault
- SOAP_ENV__Detail = | struct SOAP_ENV__Detail
- SOAP_ENV__Code = | struct SOAP_ENV__Code
- SOAP_ENV__Subcode = | struct SOAP_ENV__Subcode
- SOAP_ENV__Reason = | struct SOAP_ENV__Reason
注意:gsoap-2.8.14版本则不需要更改
现在就开始对typemap.dat操作来生生头文件了,一般情况都有有两种方法:链接网络生成和本地生成
在下载gsoap文件中,在gsoap-2.8/gsoap/bin/linux386/目录下,有一个wsdl2h命令,可以将此命令和typemap.dat文件放在同一个测试文件夹中
wsdl2h命令的相关参数包括,可以根据实际开发需要来生成代码:
- -c 产生c语言的代码,否则产生C++(默认)
- -s 不使用STL代码
- -t 指定typemap.dat文件
- -o 指定生成的头文件名
链接网络生成的基本命令如下(各个URL用空格隔开):
- wsdl2h -c -s -t typemap.dat -o onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
- http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
- http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl
- http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
- http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
- http://www.onvif.org/onvif/ver10/deviceio.wsdl
- http://www.onvif.org/onvif/ver10/display.wsdl
- http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
- http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl
- http://www.onvif.org/onvif/ver10/recording.wsdl
- http://www.onvif.org/onvif/ver10/replay.wsdl
- http://www.onvif.org/onvif/ver10/search.wsdl
- http://www.onvif.org/onvif/ver10/receiver.wsdl
- http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
此方法因为和网络环境有很大的关系,所以中间很容易因为网络问题断掉重新开始,所以不建议使用此方法.
本地生成的基本命令(先在官网下载好wsdl文件,然后和前面wsdl2h命令放在同一个文件下,执行命令时各个wsdl文件之间用空格分开):
- wsdl2h -c -s -t typemap.dat -o onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl
- edia.wsdl deviceio.wsdl display.wsdl event.wsdl imaging.wsdl recording.wsdl replay.wsdl search.wsdl receiver.wsdl ptz.wsdl
wsdl的下载地址: wsdl文件
通过onvif.h生成需要的源代码框架
在使用命令通过onvif.h生成代码之前,得先确认下是否需要做安全验证,也就是所谓的鉴权(楼主就在开始就是不知道了),如果不需要的话,那就可以直接使用命令了,
如果需要做鉴权的话,则需要修改onvif.h ,在onvif.h中需要加上 (98行的样子)
- import "wsse.h" // 安全验证
修改好onvif.h后,在gsoap-2.8.14/gsoap-2.8/gsoap/bin/linux386下把soapcpp2也拷贝到当前生成onvif.h的目录下,
行如下命令:
- soapcpp2 -2 –c onvif.h -x -I ./gsoap-2.8.14/gsoap-2.8/gsoap/import -I ./gsoap-2.8.14/gsoap-2.8/gsoap/
- //soapcpp2命令的相关命令参数如下:(可以根据自己的实际需要添加不同参数)
- -2 //采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
- -x //不产生xml文件(可用可不用,xml有一定帮助,但是太多)
- -I //为引入路径
- -C //只产生客户端代码(注意:C是大写,不推荐有次命令)
生成的文件如下:
- -rw-r--r-- 1 3634 2013-12-25 10:14 AnalyticsDeviceBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 AnalyticsEngineBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 CreatePullPointBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 DeviceBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 DeviceIOBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 DiscoveryLookupBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 DisplayBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 EventBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 ImagingBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 MediaBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 NotificationConsumerBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 NotificationProducerBinding.nsmap
- -rw-r--r-- 1 2410694 2013-12-25 10:07 onvif.h
- -rw-r--r-- 1 3634 2013-12-25 10:14 PausableSubscriptionManagerBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 PTZBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 PullPointBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 PullPointSubscriptionBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 ReceiverBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 RecordingBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 RemoteDiscoveryBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 RuleEngineBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 SearchBinding.nsmap
- -rw-r--r-- 1 11308204 2013-12-25 10:14 soapC.c
- -rw-r--r-- 1 713192 2013-12-25 10:14 soapClient.c
- -rw-r--r-- 1 741 2013-12-25 10:14 soapClientLib.c
- -rw-r--r-- 1 4882158 2013-12-25 10:14 soapH.h
- -rw-r--r-- 1 636427 2013-12-25 10:14 soapServer.c
- -rw-r--r-- 1 741 2013-12-25 10:14 soapServerLib.c
- -rw-r--r-- 1 855676 2013-12-25 10:14 soapStub.h
- -rw-r--r-- 1 3634 2013-12-25 10:14 SubscriptionManagerBinding.nsmap
- -rw-r--r-- 1 3634 2013-12-25 10:14 wsdd.nsmap
整理生成的文件
通过上面的两个步骤的话,onvif的基本代码框架就已经有了,里面可能有就开发而已不需要的文件,可以直接删除掉,还有一些文件需要从gsoap里面拷贝过来
1.修改wsdd.nsmap文件名为wsdd.h,删掉其他所有的nsmap文件(rm *.nsmap),命令空间文件文件都差不多,保留一个即可,需要的时候包含此文件就好
2.直接删除soapClientLib.c和soapServerLib.c文件,在开发过程中没有实际用处
3.将gsoap-2.8.14/gsoap-2.8/gsoap下的stdsoap2.h和stdsoap2.c文件和gsoap-2.8.14/gsoap-2.8/gsoap/custom下的duration.cw文件都拷贝到当前目录下
4.如果是作客户端的开发的话,则删掉soapServer.c文件,不然的话,里面调用的很多接口只是写了申明了函数原型,而没有实现,需要服务端开发来实现的,剩余客户端开发代码如下(服务端的话,多一个soapServer.c文件)
剩下有效的源码文件如下:
- -rwxr-xr-x 1 6560 2013-12-25 10:44 duration.c*
- -rw-r--r-- 1 2410694 2013-12-25 10:07 onvif.h
- -rw-r--r-- 1 11308204 2013-12-25 10:14 soapC.c
- -rw-r--r-- 1 713192 2013-12-25 10:14 soapClient.c
- -rw-r--r-- 1 4882158 2013-12-25 10:14 soapH.h
- -rw-r--r-- 1 855676 2013-12-25 10:14 soapStub.h
- -rwxr-xr-x 1 477042 2013-12-25 10:31 stdsoap2.c*
- -rwxr-xr-x 1 91109 2013-12-25 10:31 stdsoap2.h*
- -rw-r--r-- 1 3634 2013-12-25 10:14 wsdd.h
这样基本的ONVIF代码框架就已经生成完成了,如果想看一个简单的代码例子的话,可以参考这个例程
onvif代码简单例程
后面的系列文章将简单下自己开发预览,参数这些基本模块的一些问题。
gsoap 2.8.14版本下载:gsoap2.8.14版本
Onvif开发之代码框架生成篇相关推荐
- 简化开发: mybatis-plus 代码自动生成 以及 常见问题
目录 1. MP自动代码生成和解析 1.1 getProperty()方法中的key到底是什么 1.2 源码中 System 中 左边是key 调用上面方法能获取到后面内 1.3 测试用例: u ...
- Onvif之框架生成-基于gsoap2.8.27
Onvif之框架生成-基于gsoap2.8.27 Onvif的框架生成可以说是实现onvif协议的第一步了,当然也可以不用工具生成框架,完全按照协议来自己实现,但是有现成的工具不用白不用. 整个框架搭 ...
- 篇一、Flask打造 Python Web 开发的灵活框架,实现简易登录。要求有 Python、HTML 和 CSS 基础。
⭐ 简介:大家好,我是zy阿二,我是一名对知识充满渴望的自由职业者. ☘️ 最近我沉溺于Python的学习中.你所看到的是我的学习笔记. ❤️ 如果对你有帮助,请关注.点赞,让我们共同进步.有不足之处 ...
- Python自动生成代码 - 通过tkinter图形化操作生成代码框架
Python自动生成代码 - 通过tkinter图形化操作生成代码框架 背景 脚本代码 Demo_CodeGenerator.py display.py FileHandler.py: 脚本运行结果: ...
- Linux驱动(驱动程序开发、驱动框架代码编译和测试)
目录 什么是驱动: 设备分类: 驱动认知: 字符设备驱动工作原理 字符设备.字符设备驱动与用户空间访问该设备的程序三者之间的关系 驱动程序开发步骤 基于驱动框架的代码开发 驱动模块代码编译和测试 加载 ...
- unity现代人物含代码动画_深入了解 Unity DOTS Sample (一): 代码框架 amp; 工具 amp; 开发模式
<< 返回目录 代码框架 & 工具 相比于 FPSSample, DOTS Sample 进行了更加 package 化的更动, 无关乎游戏本体的代码放在了 Unity.Sampl ...
- 【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)
返回目录 1.为什么我们需要外部输入模块? 在游戏中我们常常用到类似这样的操作:鼠标点击某位置,玩家对象移动到该位置,或者按鼠标方向键,玩家向不同方向移动,等等.这些操作无一不用与外部输入设备打交道. ...
- 代码编程教学_少儿编程教学环境开发之代码实战篇
少儿编程教学环境开发之代码实战篇mp.weixin.qq.com 之前架构选型篇许诺要上自己原型demo的界面图,先把这个许诺给实现了,首先声明,这只是技术原型demo,比起http://code. ...
- 【移动开发】Android应用程序中实用的代码框架(一)
好久没有更新博客了,这段时间里和我的小伙伴们("乌索普"."丁二爷"."小娜".'小雯'')参加了一个大学生Android应用软件比赛,利用 ...
最新文章
- 【JetPack】数据绑定 DataBinding 简介 ( 使用要求 | Gradle 版本 | 定义数据类 | 定义数据绑定布局 | Activity 数据绑定 | 绑定类生成规则 )
- Asp.Net 将HTML中通过dom-to-image.js标签div内的内容转化为图片保存到本地
- php sql 字段名称,PHPSQL Server – 字段名称被截断
- /dev/null 2>1 详解
- SpringCloudBus(了解)
- 内容库-管理介质和模板的最佳办法(转)
- slice()和splice()、split(),number()、parseInt()和parseFloat()
- 谈谈Pod在微服务中的运用
- java的path含义_java中path和CLASSPATH的配置和意义解析
- 自制简易浏览器(Python)
- 【编译原理】 CS143 斯坦福大学公开课 第一周:简介
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计
- Python上位机与C51单片机串口通信
- Docker 学习笔记(Docker 架构 / 镜像 / 容器 / 常用命令 / Dockerfile / 镜像仓库)
- Python数据可视化之散点图和折线图
- 令人发指的关于方法重载和方法重写的一些理解(多态)
- 单道批-多道批-分时-实时
- 数据库中锁机制的学习
- 龙智集团赢得2022年Atlassian与AWS云销售竞赛
- 机器学习数学基础——全概率公式与贝叶斯公式
热门文章
- 0020-使用JDBC向Kudu表插入中文字符-双引号的秘密
- 百胜软件牵手晨光文具打造电商信息化平台
- 加解密算法、消息摘要、消息认证技术、数字签名与公钥证书
- SQL Server 2008 R2 数据库安装
- subsonic 配置及使用
- vtigerCrm 目录结构(整理中)
- Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)
- 用python numpy实现幻方
- javaweb成长之路:SSM框架搭建
- Android开发之注解式框架ButterKnife在ADT中的设置