看了前一篇的ONVIF的简单介绍应该对它的基本使用都有了一些基本的了解了吧!
下面我讲一步分解向大家介绍下如何通过gsoap生成需要的代码,以及代码中需要注意的问题[基于Linux平台 C开发]

生成Onvif相关源代码(我现在使用的gsoap版本是gsoap2.8.14,下面有下载地址):

在下载的gsoap文件下,在/gsoap-2.8/gsoap的目录下有有个typemap.dat文件,后面就是通过此文件来生成onvif.h文件的。在这里说明下

利用gsoap-2.8.8的版本的话,需要稍微修改下typemap.dat文件,在其后面添加如下内容:

  1. tds  = "http://www.onvif.org/ver10/device/wsdl"
  2. tev  = "http://www.onvif.org/ver10/events/wsdl"
  3. tls  = "http://www.onvif.org/ver10/display/wsdl"
  4. tmd  = "http://www.onvif.org/ver10/deviceIO/wsdl"
  5. timg = "http://www.onvif.org/ver20/imaging/wsdl"
  6. trt  = "http://www.onvif.org/ver10/media/wsdl"
  7. tptz = "http://www.onvif.org/ver20/ptz/wsdl"
  8. trv  = "http://www.onvif.org/ver10/receiver/wsdl"
  9. trc  = "http://www.onvif.org/ver10/recording/wsdl"
  10. tse  = "http://www.onvif.org/ver10/search/wsdl"
  11. trp  = "http://www.onvif.org/ver10/replay/wsdl"
  12. tan  = "http://www.onvif.org/ver20/analytics/wsdl"
  13. tad  = "http://www.onvif.org/ver10/analyticsdevice/wsdl"
  14. tdn  = "http://www.onvif.org/ver10/network/wsdl"
  15. tt   = "http://www.onvif.org/ver10/schema"
  16. #   OASIS recommended prefixes
  17. wsnt    = "http://docs.oasis-open.org/wsn/b-2"
  18. wsntw   = "http://docs.oasis-open.org/wsn/bw-2"
  19. wsrfbf  = "http://docs.oasis-open.org/wsrf/bf-2"
  20. wsrfr   = "http://docs.oasis-open.org/wsrf/r-2"
  21. wsrfrw  = "http://docs.oasis-open.org/wsrf/rw-2"
  22. wstop   = "http://docs.oasis-open.org/wsn/t-1"
  23. #   WS-Discovery 1.0 remapping
  24. wsdd10__HelloType           = | wsdd__HelloType
  25. wsdd10__ByeType             = | wsdd__ByeType
  26. wsdd10__ProbeType           = | wsdd__ProbeType
  27. wsdd10__ProbeMatchesType    = | wsdd__ProbeMatchesType
  28. wsdd10__ProbeMatchType      = | wsdd__ProbeMatchType
  29. wsdd10__ResolveType         = | wsdd__ResolveType
  30. wsdd10__ResolveMatchesType  = | wsdd__ResolveMatchesType
  31. wsdd10__ResolveMatchType    = | wsdd__ResolveMatchType
  32. #   SOAP-ENV mapping
  33. SOAP_ENV__Envelope  = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope
  34. SOAP_ENV__Header    = | struct SOAP_ENV__Header
  35. SOAP_ENV__Fault     = | struct SOAP_ENV__Fault
  36. SOAP_ENV__Detail    = | struct SOAP_ENV__Detail
  37. SOAP_ENV__Code      = | struct SOAP_ENV__Code
  38. SOAP_ENV__Subcode   = | struct SOAP_ENV__Subcode
  39. SOAP_ENV__Reason    = | struct SOAP_ENV__Reason

注意:gsoap-2.8.14版本则不需要更改
现在就开始对typemap.dat操作来生生头文件了,一般情况都有有两种方法:链接网络生成和本地生成
在下载gsoap文件中,在gsoap-2.8/gsoap/bin/linux386/目录下,有一个wsdl2h命令,可以将此命令和typemap.dat文件放在同一个测试文件夹中
wsdl2h命令的相关参数包括,可以根据实际开发需要来生成代码:

  1. -c   产生c语言的代码,否则产生C++(默认)
  2. -s   不使用STL代码
  3. -t   指定typemap.dat文件
  4. -o   指定生成的头文件名

链接网络生成的基本命令如下(各个URL用空格隔开):

  1. wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
  2. http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
  3. http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl
  4. http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
  5. http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
  6. http://www.onvif.org/onvif/ver10/deviceio.wsdl
  7. http://www.onvif.org/onvif/ver10/display.wsdl
  8. http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
  9. http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl
  10. http://www.onvif.org/onvif/ver10/recording.wsdl
  11. http://www.onvif.org/onvif/ver10/replay.wsdl
  12. http://www.onvif.org/onvif/ver10/search.wsdl
  13. http://www.onvif.org/onvif/ver10/receiver.wsdl
  14. http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl

此方法因为和网络环境有很大的关系,所以中间很容易因为网络问题断掉重新开始,所以不建议使用此方法.

本地生成的基本命令(先在官网下载好wsdl文件,然后和前面wsdl2h命令放在同一个文件下,执行命令时各个wsdl文件之间用空格分开):

  1. wsdl2h  -c  -s  -t  typemap.dat  -o  onvif.h remotediscovery.wsdl devicemgmt.wsdl analytics.wsdl analyticsdevice.wsdl
  2. 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行的样子)

  1. import "wsse.h"   // 安全验证

修改好onvif.h后,在gsoap-2.8.14/gsoap-2.8/gsoap/bin/linux386下把soapcpp2也拷贝到当前生成onvif.h的目录下,
行如下命令:

  1. 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/
  1. //soapcpp2命令的相关命令参数如下:(可以根据自己的实际需要添加不同参数)
  2. -2    //采用SOAP1.2,和SOAP1.0版本不同,会导致搜索工具搜索不到
  3. -x    //不产生xml文件(可用可不用,xml有一定帮助,但是太多)
  4. -I   //为引入路径
  5. -C   //只产生客户端代码(注意:C是大写,不推荐有次命令)

生成的文件如下:

  1. -rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsDeviceBinding.nsmap
  2. -rw-r--r-- 1      3634 2013-12-25 10:14 AnalyticsEngineBinding.nsmap
  3. -rw-r--r-- 1      3634 2013-12-25 10:14 CreatePullPointBinding.nsmap
  4. -rw-r--r-- 1      3634 2013-12-25 10:14 DeviceBinding.nsmap
  5. -rw-r--r-- 1      3634 2013-12-25 10:14 DeviceIOBinding.nsmap
  6. -rw-r--r-- 1      3634 2013-12-25 10:14 DiscoveryLookupBinding.nsmap
  7. -rw-r--r-- 1      3634 2013-12-25 10:14 DisplayBinding.nsmap
  8. -rw-r--r-- 1      3634 2013-12-25 10:14 EventBinding.nsmap
  9. -rw-r--r-- 1      3634 2013-12-25 10:14 ImagingBinding.nsmap
  10. -rw-r--r-- 1      3634 2013-12-25 10:14 MediaBinding.nsmap
  11. -rw-r--r-- 1      3634 2013-12-25 10:14 NotificationConsumerBinding.nsmap
  12. -rw-r--r-- 1      3634 2013-12-25 10:14 NotificationProducerBinding.nsmap
  13. -rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h
  14. -rw-r--r-- 1      3634 2013-12-25 10:14 PausableSubscriptionManagerBinding.nsmap
  15. -rw-r--r-- 1      3634 2013-12-25 10:14 PTZBinding.nsmap
  16. -rw-r--r-- 1      3634 2013-12-25 10:14 PullPointBinding.nsmap
  17. -rw-r--r-- 1      3634 2013-12-25 10:14 PullPointSubscriptionBinding.nsmap
  18. -rw-r--r-- 1      3634 2013-12-25 10:14 ReceiverBinding.nsmap
  19. -rw-r--r-- 1      3634 2013-12-25 10:14 RecordingBinding.nsmap
  20. -rw-r--r-- 1      3634 2013-12-25 10:14 RemoteDiscoveryBinding.nsmap
  21. -rw-r--r-- 1      3634 2013-12-25 10:14 RuleEngineBinding.nsmap
  22. -rw-r--r-- 1      3634 2013-12-25 10:14 SearchBinding.nsmap
  23. -rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c
  24. -rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c
  25. -rw-r--r-- 1       741 2013-12-25 10:14 soapClientLib.c
  26. -rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h
  27. -rw-r--r-- 1    636427 2013-12-25 10:14 soapServer.c
  28. -rw-r--r-- 1       741 2013-12-25 10:14 soapServerLib.c
  29. -rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h
  30. -rw-r--r-- 1      3634 2013-12-25 10:14 SubscriptionManagerBinding.nsmap
  31. -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文件)
剩下有效的源码文件如下:

  1. -rwxr-xr-x 1      6560 2013-12-25 10:44 duration.c*
  2. -rw-r--r-- 1   2410694 2013-12-25 10:07 onvif.h
  3. -rw-r--r-- 1  11308204 2013-12-25 10:14 soapC.c
  4. -rw-r--r-- 1    713192 2013-12-25 10:14 soapClient.c
  5. -rw-r--r-- 1   4882158 2013-12-25 10:14 soapH.h
  6. -rw-r--r-- 1    855676 2013-12-25 10:14 soapStub.h
  7. -rwxr-xr-x 1    477042 2013-12-25 10:31 stdsoap2.c*
  8. -rwxr-xr-x 1     91109 2013-12-25 10:31 stdsoap2.h*
  9. -rw-r--r-- 1      3634 2013-12-25 10:14 wsdd.h

这样基本的ONVIF代码框架就已经生成完成了,如果想看一个简单的代码例子的话,可以参考这个例程

onvif代码简单例程

后面的系列文章将简单下自己开发预览,参数这些基本模块的一些问题。

gsoap 2.8.14版本下载:gsoap2.8.14版本

Onvif开发之代码框架生成篇的更多相关文章

  1. Onvif开发之服务端发现篇

    服务端的开发相对来说比客户端稍微难一点,也就是给填充相关结构体的时候,需要一点一点的去查阅,验证各个结构中各个成员各自代表什么意思,以及对应的功能需要是那个接口实现,这是开发服务端最头疼的事情.(在开 ...

  2. OpenDaylight开发hello-world项目之代码框架搭建

    OpenDaylight开发hello-world项目之开发环境搭建 OpenDaylight开发hello-world项目之开发工具安装 OpenDaylight开发hello-world项目之代码 ...

  3. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  4. onvif开发实战1--总结框架搭建

    Gsoap及开发框架生成: 一:gsoap下载和编译   1.下载Gsoap:地址:http://sourceforge.net/projects/gsoap2/files/gSOAP/ 2.安装: ...

  5. 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

    引言 在上一篇<基于Python接口自动化测试框架(初级篇)附源码>讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

  6. [goa]golang微服务框架学习(二)-- 代码自动生成

    之前用过go语言的反射来做一些代码生成,参考这篇. 但是这种方式,入侵太强,需要执行对应的申明调用, 所以对GOA框架的自动生成非常感兴趣,于是仔细研究了一下,发现用的比较巧妙, 这里先卖个关子,先看 ...

  7. 基于gulp编写的一个简单实用的前端开发环境好了,安装完Gulp后,接下来是你大展身手的时候了,在你自己的电脑上面随便哪个地方建一个目录,打开命令行,然后进入创建好的目录里面,开始撸代码,关于生成的json文件请点击这里https://docs.npmjs.com/files/package.json,打开的速度看你的网速了注意:以下是为了演示 ,我建的一个目录结构,你自己可以根据项目需求自己建目

    自从Node.js出现以来,基于其的前端开发的工具框架也越来越多了,从Grunt到Gulp再到现在很火的WebPack,所有的这些新的东西的出现都极大的解放了我们在前端领域的开发,作为一个在前端领域里 ...

  8. iOS开发:代码通用性以及其规范 第二篇(猜想iOS中实现TableView内部设计思路(附代码),以类似的思想实现一个通用的进度条)

    在iOS开发中,经常是要用到UITableView的,我曾经思考过这样一个问题,为什么任何种类的model放到TableView和所需的cell里面,都可以正常显示?而我自己写的很多view却只是能放 ...

  9. Java下的框架编程(反射,泛型,元数据,CGLib,代码动态生成,AOP,动态语言嵌入)

    Java 虽然没有动态语言般暴起,但仍然天连天,水接水的生出好多框架技术---反射(reflection),泛型(generics),元数据(annotation),proxies(proxy/cgl ...

随机推荐

  1. Metasploit的攻击实例讲解----辅助扫描工具

    不多说,直接上干货! 怎么弹出来这个呢,连续按两次tab. msf > use auxiliary/scanner/ Display all possibilities? (y or n) us ...

  2. idea报错。Error:Failed to load project configuration: cannot parse xml file E:\project\.idea\workspace.xml: Error on line 1: 前言中不允许有内容。

    因为电脑卡死强制重启电脑后打开idea,进行junit单元测试报错: idea报错.Error:Failed to load project configuration: cannot parse x ...

  3. struts2连接mysql多表查询

    下载地址:http://download.csdn.net/detail/qq_33599520/9786567 项目结构: 代码: package com.mstf.action; import j ...

  4. nodejs 通过 get获取数据修改redis数据

    如下代码是没有报错的正确代码 我通过https获取到数据 想用redis set一个键值存储 现在我掉入了回调陷阱res.on 里面接收到的数据是data 里面如果放入 client.on('conn ...

  5. <Three.js>(第二节)添加长方体

    一.实验内容 上一节已经搭好了实验的框架.这一节我们将在屏幕上显示一些几何图形.如下图所示,我们将在屏幕上显示一个正方体. 二.实验步骤 1.创建场景 正像上一节所说,首先我们需要建一个场景,场景就是 ...

  6. day01-Python介绍,安装,idea

    一. python 简介 Python,读作['paɪθɑn],翻译成汉语是蟒蛇的意思,Python 的 logo 也是两条缠绕在一起的蟒蛇的样子,然而 Python 语言和蟒蛇实际上并没有一毛钱关系 ...

  7. [Bug]Python3.x AttributeError: libtest.so: undefined symbol: fact

    写kNN,需要在python中实现kd-tree 思考了一下,在python下写这种算法类的东西,还是十分别扭 于是希望用ctypes调用一下c++动态加载库 于是尝试实现一下 // test.cpp ...

  8. caioj 1081 动态规划入门(非常规DP5:观光游览)

    这道题和前面的分组的题有点像 就是枚举最后一组的长度. 然后组数可以在第一层循环也可以在第二层循环 我自己的话就统一一下在第一层循环吧 然后这道题题意我一直没理解清楚,浪费了很多时间,写复杂了 同时初 ...

  9. asp.net.core网站重启后登陆无效问题(部署在IIS)

    一.问题 在使用asp.net.core时,把网站发布到IIS后,在后续更新中需要停止网站,然后重启网站,发现已经登陆的用户会退出登陆.过程如下 1.登陆代码(测试) [AllowAnonymous] ...

  10. hdu 1423 最长公共递增子序列 LCIS

    最长公共上升子序列(LCIS)的O(n^2)算法 预备知识:动态规划的基本思想,LCS,LIS. 问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列). 首先我们可以看到,这个问题具有相 ...