Onvif开发之代码框架生成篇

简介: 看了前一篇的ONVIF的简单介绍应该对它的基本使用都有了一些基本的了解了吧!下面我讲一步分解向大家介绍下如何通过gsoap生成需要的代码,以及代码中需要注意的问题[基于Linux平台 C开发]  生成Onvif相关源代码(我现在使用的gsoap版本是gsoap2.8.14,下面有下载地址):   在下载的gsoap文件下,在/gsoap-2.8/gsoap的目录下有有个typemap.dat文件,后面就是通过此文件来生成onvif.h文件的。

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

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

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

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

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  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.   
  17. #   OASIS recommended prefixes  
  18. wsnt    = "http://docs.oasis-open.org/wsn/b-2"  
  19. wsntw   = "http://docs.oasis-open.org/wsn/bw-2"  
  20. wsrfbf  = "http://docs.oasis-open.org/wsrf/bf-2"  
  21. wsrfr   = "http://docs.oasis-open.org/wsrf/r-2"  
  22. wsrfrw  = "http://docs.oasis-open.org/wsrf/rw-2"  
  23. wstop   = "http://docs.oasis-open.org/wsn/t-1"  
  24.   
  25. #   WS-Discovery 1.0 remapping    
  26. wsdd10__HelloType           = | wsdd__HelloType    
  27. wsdd10__ByeType             = | wsdd__ByeType    
  28. wsdd10__ProbeType           = | wsdd__ProbeType    
  29. wsdd10__ProbeMatchesType    = | wsdd__ProbeMatchesType    
  30. wsdd10__ProbeMatchType      = | wsdd__ProbeMatchType    
  31. wsdd10__ResolveType         = | wsdd__ResolveType    
  32. wsdd10__ResolveMatchesType  = | wsdd__ResolveMatchesType    
  33. wsdd10__ResolveMatchType    = | wsdd__ResolveMatchType    
  34.   
  35. #   SOAP-ENV mapping    
  36. SOAP_ENV__Envelope  = struct SOAP_ENV__Envelope { struct SOAP_ENV__Header *SOAP_ENV__Header; _XML SOAP_ENV__Body; }; | struct SOAP_ENV__Envelope    
  37. SOAP_ENV__Header    = | struct SOAP_ENV__Header    
  38. SOAP_ENV__Fault     = | struct SOAP_ENV__Fault    
  39. SOAP_ENV__Detail    = | struct SOAP_ENV__Detail    
  40. SOAP_ENV__Code      = | struct SOAP_ENV__Code    
  41. SOAP_ENV__Subcode   = | struct SOAP_ENV__Subcode    
  42. SOAP_ENV__Reason    = | struct SOAP_ENV__Reason    

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

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. -c   产生c语言的代码,否则产生C++(默认)  
  2.      -s   不使用STL代码  
  3.      -t   指定typemap.dat文件  
  4.      -o   指定生成的头文件名  

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

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  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文件之间用空格分开):

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  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行的样子)

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  1. import "wsse.h"   // 安全验证  


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

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

生成的文件如下:

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  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文件)
剩下有效的源码文件如下:

[cpp] view plain copy
 
在CODE上查看代码片派生到我的代码片
  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开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
Onvif开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
Onvif开发笔记(二): 使用gSOAP编译Onvif协议之编译Onvif代码框架
|
22天前
|
自然语言处理 算法 测试技术
【C/C++ CommonAPI入门篇】从 Franca IDL 到 C++: 深入解析汽车软件接口开发
【C/C++ CommonAPI入门篇】从 Franca IDL 到 C++: 深入解析汽车软件接口开发
75 1
|
10月前
|
前端开发 容器
前端封装库/工具库的UI框架之Foundation
在现代前端开发中,UI 框架是一个非常重要的组成部分。其中,Foundation 是一个备受欢迎的响应式前端框架。
259 0
|
前端开发 JavaScript 开发者
封装库/工具库中重要概念之UI框架
UI(User Interface)框架是前端开发中十分重要的一部分,它提供了各种组件和样式,用于构建页面和用户界面。在前端开发中,封装库/工具库可以帮助我们更加高效地使用 UI 框架。
147 0
|
网络协议 Ubuntu Linux
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
866 0
基于C++(QT框架)设计的网络摄像头项目(支持跨平台运行)
|
编译器 C语言
QT应用编程: QtCreate编译部署开源音视频框架模块QtAV
QT应用编程: QtCreate编译部署开源音视频框架模块QtAV
167 0
QT应用编程: QtCreate编译部署开源音视频框架模块QtAV
|
开发工具 iOS开发
iOS中制作可复用的框架Framework(一)
iOS中制作可复用的框架Framework
125 0
iOS中制作可复用的框架Framework(一)
|
iOS开发
iOS中制作可复用的框架Framework(二)
iOS中制作可复用的框架Framework
120 0
iOS中制作可复用的框架Framework(二)
|
iOS开发
iOS中制作可复用的框架Framework
在iOS开发中,我们时常会使用一些我们封装好的管理类,框架类,方法类等,我们在实现这些文件时,可能还会依赖一些第三方库或者系统库。如果每次我们复用这些代码时,都要将关联的这些东西进行导入,甚至还要进行arc和mrc的编译设置,会浪费我们很大的精力。除此之外,如果项目需要多人合作,你可能也并不希望你的源代码暴漏在所有人的面前,这个时候,我们就可以使用静态库或者动态库的方式来对我们的代码进行包装,便于复用。
146 0