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
需要将在<schemaLocation>内出现的网址改为本地路径。
在命令提示符窗口运行下列命令:

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服务

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用gSOAP生成ONVIF框架代码需要遵循以下步骤: 1. 下载gSOAP工具包并安装到本地。 2. 下载ONVIF设备WSDL文件,例如https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl。 3. 使用gSOAP工具包中的wsdl2h工具将WSDL文件转换为头文件。 4. 使用soapcpp2工具生成ONVIF框架代码,例如: ```bash soapcpp2 -Iimport devicemgmt.h ``` 5. 在生成代码中实现ONVIF设备的具体操作。 以下是在Linux系统中使用gSOAP生成ONVIF框架代码的示例: 1. 下载gSOAP工具包并安装到本地: ```bash wget https://sourceforge.net/projects/gsoap2/files/gSOAP/gsoap_2.8.112.zip unzip gsoap_2.8.112.zip cd gsoap-2.8 ./configure make sudo make install ``` 2. 下载ONVIF设备WSDL文件: ```bash wget https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl ``` 3. 使用wsdl2h工具将WSDL文件转换为头文件: ```bash wsdl2h -o onvif.h devicemgmt.wsdl ``` 4. 使用soapcpp2工具生成ONVIF框架代码: ```bash soapcpp2 -Iimport onvif.h ``` 5. 在生成代码中实现ONVIF设备的具体操作。 在生成代码中,每个ONVIF操作都有对应的函数,例如`SOAP_FMAC5 int SOAP_FMAC6 __tds__GetDeviceInformation(struct soap* soap, _tds__GetDeviceInformation* tds__GetDeviceInformation, _tds__GetDeviceInformationResponse &tds__GetDeviceInformationResponse)`就是获取设备信息的函数。您可以在这些函数中实现具体的操作。 另外,生成代码中还有一些辅助函数和结构体,您也可以根据需要使用它们。 例如,以下代码片段演示了如何创建一个SOAP客户端并调用`__tds__GetDeviceInformation`函数: ```c++ #include "soapDeviceBindingProxy.h" const char* endpoint = "http://192.168.1.100/onvif/device_service"; DeviceBindingProxy proxy; proxy.soap_endpoint = endpoint; _tds__GetDeviceInformation tds__GetDeviceInformation; _tds__GetDeviceInformationResponse tds__GetDeviceInformationResponse; proxy.__tds__GetDeviceInformation(&tds__GetDeviceInformation, tds__GetDeviceInformationResponse); // 处理返回值 ``` 在使用时,需要将`endpoint`替换为实际的设备IP地址和ONVIF服务端口号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值