利用gSOAP生成ONVIF框架(C++)
0 背景介绍
? ONVIF接口已经算得上是监控摄像头的标配了,为了能够方便快捷开发出一款可以对接ONVIF摄像头的NVR,就需要构建ONVIF客户端。下面着重介绍如何利用gSOAP技术,根据WSDL文件生成我们需要的ONVIF框架代码。
0.1 ONVIF
- ONVIF:开放式网络视频接口论坛(Open Network Video Interface Forum)。创建了一个视频监控和其他物理安全领域的IP产品如何进行相互通信的标准,这种标准也可以称为ONVIF标准。
- 注意: ONVIF框架通常通过gSOAP工具生成,手动实现成本高,难度大。
- gSOAP:提供了一个SOAP关于C/C++ 语言的实现。
- 注意: 要通过gSOAP生成C/C++框架,需要WSDL文件,ONVIF的WSDL文件由ONVIF官方社区提供。
- WSDL:Web服务描述语言(Web Services Description Language)。是为描述Web服务发布的XML格式。
- 注意:只有SOAP方式实现的Web Services才有WSDL文档,其他方式实现的Web Services并没有WSDL文档。
- SOAP:简单对象访问协议(Simple Object Access Protoco)。是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。
- XML:可扩展标记语言。是标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
- 标准通用置标语言:也成为标准通用标记语言。是当今创建结构化文档描述语言规则的战略集合。
- 注意: SOAP相当于HTTP的数据部分,HTTP是对SOAP消息的封装。
【利用gSOAP生成ONVIF框架(C++)】? 网络摄像头的目的是实现不同机器,不同进程之间的数据交换。HTTP技术在网路数据交换中不可替代,因而网络摄像头更像是利用HTTP技术实现数据交换,而数据则是SOAP格式。
1 开发环境 1.1 操作系统
- Ubuntu 18.04
- 安装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
- 网上搜索,下载并安装ONVIF Device Test Tool
- 运行ONVIF Device Test Tool 获取该摄像头具备的能力。
- 方法:发现设备,切换到Debug选项卡,选择Get Services按钮,分析右侧消息,确定设备所具有的能力。
- 根据设备能力或自身需求选择wsdl文件,也可以直接全部选择。
- 方法:在对应wsdl链接上右键,选择复制链接,将链接保存在txt文件中备用
- 进入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
推荐阅读
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- ssh生成公钥秘钥
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- 15、IDEA学习系列之其他设置(生成javadoc、缓存和索引的清理等)
- Spring|Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
- 【万伽复利】什么是复利(如何利用复利赚钱?)
- javaweb|基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统
- 苹果手机如何利用库乐队自制铃声
- Java代码辅助效率工具Lombok(注解|Java代码辅助效率工具Lombok(注解,自动生成代码)
- python|python random使用方法