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

码界逐光者
• 阅读 9306

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 <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;
    }
}

参考内容

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这