利用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 小结
【利用gSOAP生成ONVIF框架(C++)】? 网络摄像头的目的是实现不同机器,不同进程之间的数据交换。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支持
  • 根据自身摄像头品牌,搜索对应ONVIF协议打开方式。例如,海康威视IPC开启ONVIF、大华摄像头怎么开启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; } }

参考内容
  • ONVIF协议网络摄像机(IPC)客户端程序开发(1):专栏开篇_许振坪的专栏-CSDN博客
  • ONVIF之开发框架搭建(C++) - 简书 (jianshu.com)
  • How_do_I_use_gSOAP_with_the_ONVIF_specifications?
  • ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++)-云社区-华为云 (huaweicloud.com)
  • ONVIF协议开发之网络摄像头云台控制(C版)_ZONGXP的博客-CSDN博客
  • ONVIF Examples
  • Installing gSOAP on Unix/Linux

    推荐阅读