利用gSOAP生成ONVIF框架(C++)

0 背景介绍

​ ONVIF接口已经算得上是监控摄像头的标配了,为了能够方便快捷开发出一款可以对接ONVIF摄像头的NVR,就需要构建ONVIF客户端。下面着重介绍如何利用gSOAP技术,根据WSDL文件生成我们需要的ONVIF框架代码。

0.1 ONVIF

  • ONVIF:开放式网络视频接口论坛(Open Network Video Interface Forum)。创建了一个视频监控和其他物理安全领域的IP产品如何进行相互通信的标准,这种标准也可以称为ONVIF标准。
  • 注意: ONVIF框架通常通过gSOAP工具生成,手动实现成本高,难度大。

0.2 gSOAP

  • gSOAP:提供了一个SOAP关于C/C++ 语言的实现。
  • 注意: 要通过gSOAP生成C/C++框架,需要WSDL文件,ONVIF的WSDL文件由ONVIF官方社区提供。

0.3 WSDL

  • WSDL:Web服务描述语言(Web Services Description Language)。是为描述Web服务发布的XML格式。
  • 注意:只有SOAP方式实现的Web Services才有WSDL文档,其他方式实现的Web Services并没有WSDL文档。

0.4 SOAP

  • SOAP:简单对象访问协议(Simple Object Access Protoco)。是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
  • XML:可扩展标记语言。是标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
  • 标准通用置标语言:也成为标准通用标记语言。是当今创建结构化文档描述语言规则的战略集合。
  • 注意: SOAP相当于HTTP的数据部分,HTTP是对SOAP消息的封装。

0.5 小结

​ 网络摄像头的目的是实现不同机器,不同进程之间的数据交换。HTTP技术在网路数据交换中不可替代,因而网络摄像头更像是利用HTTP技术实现数据交换,而数据则是SOAP格式。

1 开发环境

1.1 操作系统

  • Ubuntu 18.04

1.2 预安装

  • 安装flex、bison、libssl-dev、unzip、ffmpeg等工具
sudo apt-get install flex bison libssl-dev unzip zlib1g-dev ffmpeg

1.3 安装gSOAP工具

  • 下载gSOAP源码
  • 解压gSOAP
  • 进入gsoap-2.8目录
  • 执行配置脚本
  • 执行make命令
  • 执行make install命令
unzip gsoap_2.8.*.zip
cd gsoap-2.8
./configure
make
sudo make install

1.4 目录结构

  • 新建onvifclient文件夹
  • 在onvifclient文件夹下新建tmp文件夹
  • 复制gsoap-2.8源码下的gsoap目录到onvifclient文件夹
mkdir onvifclient
cd onvifclient
mkdir tmp
cp path/to/gsoap ./ -r

2 选择WSDL文件

2.1 开启ONVIF支持

2.2 设备能力获取

  • 网上搜索,下载并安装ONVIF Device Test Tool
  • 运行ONVIF Device Test Tool 获取该摄像头具备的能力。
  • 方法:发现设备,切换到Debug选项卡,选择Get Services按钮,分析右侧消息,确定设备所具有的能力。

2.3 选择wsdl

  • 根据设备能力或自身需求选择wsdl文件,也可以直接全部选择。
  • 方法:在对应wsdl链接上右键,选择复制链接,将链接保存在txt文件中备用

3 生成ONVIF框架

3.1 生成并修改onvif.h文件

  • 进入onvifclient目录,用wsdl2h命令生成onvif.h文件
  • 修改onvif.h文件
#生成onvif.h文件
wsdl2h -c++ -O4 -P -x -o onvif.h -t ./gsoap/typemap.dat \
https://www.onvif.org/ver20/analytics/wsdl/analytics.wsdl \
https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl \
https://www.onvif.org/ver10/events/wsdl/event.wsdl \
https://www.onvif.org/ver20/imaging/wsdl/imaging.wsdl \
https://www.onvif.org/ver10/media/wsdl/media.wsdl \
https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl \
https://www.onvif.org/ver10/deviceio.wsdl \
https://www.onvif.org/ver10/recording.wsdl \
https://www.onvif.org/ver10/search.wsdl \
https://www.onvif.org/ver10/replay.wsdl \

#加入鉴权,发送请求需要用户名和密码
sed -i '122 a #import "wsse.h"' onvif.h

#加入wsdd,用于发现网络中的设备
sed -i '122 a #import "wsdd5.h"' onvif.h

3.2 根据onvif.h生成c++代码框架

  • 用soapcpp2 命令生成c++代码
  • 复制需要用到的文件
#生成.cpp .h .nsmap 等文件
soapcpp2 -2 -c++ -C -L -x -j -r onvif.h -d tmp/ -I ./gsoap/ -I ./gsoap/import/ -I ./gsoap/custom/

#复制需要的文件到tmp下,如gsoap下的dom.cpp文件、custom文件夹、plugin文件夹,根据实际情况需求复制

3.3 实现设备发现功能

  • 编译时增加-DWITH_OPENSSL -DWITH_DOM -DWITH_ZLIB等参数
  • 引用libcrypto.so libssl.so libz.so等动态库
  • 设备发现功能伪代码
#include 
#include "wsdd.namap"
#include "soapwsddProxy.h"
int main()
{
    struct wsddProxy wsddTest;
    struct wsdd__ProbeType req;
    struct __wsdd__ProbeMatches rep;
    wsddTest.soap_endpoint = "soap.udp://239.255.255.250:3702";
    wsddTest.send_Probe(&req);
    wsddTest.recv_ProbeMatches(rep);
    for (int i = 0; i < rep.wsdd__ProbeMatches->__sizeProbeMatch; i++)
    {
        std::cout << rep.wsdd__ProbeMatches->ProbeMatch->XAddrs << std::endl;
    }
}

参考内容

你可能感兴趣的:(利用gSOAP生成ONVIF框架(C++))