gSOAP+onvif初探(一):生成onvif代码框架

一些预备知识:

  要用ONVIF协议和设备通信,绕不过soap协议。
  ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的 XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。
  ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。
  SOAP是一个基于xml的简易协议,可使应用程序在 HTTP 之上进行信息交换。
  gSOAP是一个用来生成SOAP的C/C++代码框架的工具,它可以将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构。


生成onvif代码框架

  在gsoap\bin\win32目录下有两个.exe文件。名字分别为wsdl2h.exe和soapcpp2.exe。执行顺序为:

第一步:用.wsdl文件生成onvif服务相关头文件,可命名为onvif.h

  这里的wsdl是要从网上获取的,可以直接链接到远程网址,也可以下载下来后再链接。在Onvif官网Specification页面中下载提供的功能相应的wsdl文件,如analytics.wsdl;devicemgmt.wsdl等。地址 http://www.onvif.org/profiles/specifications/,直接将WSDL的链接另存为,保存下来就是wsdl文件了。因为不太确定哪些文件不需要,所以我这里全部都下载了,全部放在bin下新建的wsdl文件夹内。包括这些wsdl中需要调用的xsd文件,
  (地址: http://www.onvif.org/onvif/ver10/schema/onvif.xsd
       http://docs.oasis-open.org/wsn/b-2.xsd
      http://docs.oasis-open.org/wsrf/bf-2.xsd)
需要将在内出现的网址改为本地路径。
在命令提示符窗口运行下列命令:

D:\gsoap\bin\win32>wsdl2h  - c -t typemap.dat -o onvif.h ./wsdl/accesscontrol.wsdl ./wsdl/accessrules.wsdl ./wsdl/actionengine.wsdl ./wsdl/advancedsecurity.wsdl ./wsdl/analytics.wsdl ./wsdl/analyticsdevice.wsdl ./wsdl/bw-2.wsdl ./wsdl/credential.wsdl ./wsdl/deviceio.wsdl ./wsdl/devicemgmt.wsdl ./wsdl/display.wsdl ./wsdl/doorcontrol.wsdl ./wsdl./event.wsdl ./wsdl/imaging.wsdl ./wsdl/media.wsdl ./wsdl/ptz.wsdl ./wsdl/receiver.wsdl ./wsdl/recording.wsdl ./wsdl/replay.wsdl ./wsdl/rw-2.wsdl ./wsdl/schedule.wsdl ./wsdl/search.wsdl ./wsdl/thermal.wsdl

其中typemap.dat是从gsoap文件夹下拷贝过来的。
wsdl2h后面可以加编译参数,如-S -c -C -x等。可以用--help了解。其中比较重要的就是:

  • -c:生成.c文件(默认是.cpp文件);
  • -C:只生成客户端文件
  • -S:只生成服务器端文件(注意大小写)

我这里生成的是.c文件。


第二步:用上一步生成的onvif.h文件来生成soap框架代码。

注意:如要包含onvif鉴权功能,需要手动在onvif.h里面加上

#import "wsse.h"

然后运行:

D:gsoap\bin\win32>soapcpp2 -c onvif.h -I../../;../../import;../../custom

这里soapcpp2后面也可以加编译参数,就和第一步的意义一样。

soapC.c、soapH.h、soapClient.c、soapClientLib、soapStub、soapServer.c、soapServerLib.c。 

用这些文件,加上gsoap文件夹下的stdsoap2.c、stdsoap.h、dom.c就可以直接调用soap的api了!


  关于这个生成代码框架的问题,一开始我只是机械的按照网上的教程一步一步去生成soap代码,最后可以调用成功就不错了。但是一直不是很明白。
  why?and how?
  为什么要这样去生成代码,为什么这样生成了代码就可以直接用它的一些接口去进行应用层上的操作。它是怎么做到的?
  之前做的比较多的就是直接调用别人写好的库(或者是有源码,自己编译)。比如opencvffmpegsdlMP4v2等。只要把库添加到自己的工程里,然后加上头文件包含,添加依赖。然后调用,OK。
  gSOAP其实是生成了一个源代码,而不是库文件。这比库文件更加方便,因为你甚至可以直接改soap的源码(当然大多时候不需要这样做)。它更加灵活,第一步生成的头文件是你代码的灵魂。它包含了你想要的功能函数的声明。你可以不用wsdl去生成,而是自己写一个头文件,然后在服务器端实现头文件函数的定义。这是一个远程调用 的过程。
  onvif.h包含了客户端调用需要的函数声明,定义则在服务器端。
  
  关于ONVIF、SOAP、Web Services、gSOAP的更详细解释可看:
  
  onvif规范的实现:使用gSOAP创建SOAP调用实例
   wsdl:WSDL : 描述你的Web服务

你可能感兴趣的:(onvif入门)