利用gSOAP生成ONVIF框架(C++)
Posted 泥泞的岁月
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用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支持
- 根据自身摄像头品牌,搜索对应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 <iostream>
#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
以上是关于利用gSOAP生成ONVIF框架(C++)的主要内容,如果未能解决你的问题,请参考以下文章
ONVIF协议网络摄像机(IPC)客户端程序开发使用ONVIF框架代码(C++)生成静态库04-->Windows