ONVIF协议操作摄像头方法

一.前言

简单介绍一下涉及到的名称。SOAP是一种基于XML的RPC协议规范,gSOAP是一个开发SOAP和XML应用(它们组成了webservice)的工具。ONVIF协议就是在SOAP协议规范的基础之上定义的一套用于网络摄像机的标准协议。

二.gsoap工具

gsoap包含wsdl2h和soapcpp2两个工具和一些拓展功能源码。wsdl2h顾名思义,通过下载onvif协议规范wsdl文件来产生c代码头文件。soapcpp2是通过头文件生成合适的代码。工具下载地址:https://sourceforge.net/projects/gsoap2/files/latest/download

三.生成代码

1.生成onvif头文件 -c 表示生成c代码,-s 表示不生成STL代码(使用系统标准库), -t 指定typemap.dat文件(数据类型定义) 这里面一个URL可以认为是摄像头的一个Profile。比如云台就需要用到ptz.wsdl,多播搜索设备用到remotediscovery.wsdl。

bash 复制代码
wsdl2h -o onvif.h -c -s -t ./typemap.dat \
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl \
http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl \
http://www.onvif.org/onvif/ver10/display.wsdl \
http://www.onvif.org/onvif/ver10/deviceio.wsdl \
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl \
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl \
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl \
 http://www.onvif.org/onvif/ver10/receiver.wsdl \
http://www.onvif.org/onvif/ver10/recording.wsdl \
 http://www.onvif.org/onvif/ver10/search.wsdl \
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl \
http://www.onvif.org/onvif/ver10/replay.wsdl \
http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl \
http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl \
 http://www.onvif.org/onvif/ver10/schema/onvif.xsd \
 http://www.onvif.org/ver10/actionengine.wsdl

2.生成框架代码和业务代码。 -C 仅生成客户端代码 -S 仅生成服务端代码(这里用不上) -x 不生成xml文件 -L 不生成lib文件 -I 指定onvif.h依赖的头文件路径,不指定可能会报错。

bash 复制代码
 ./soapcpp2 -x -L -C -I../gsoap-2.8/gsoap/import:../gsoap-2.8/gsoap onvif.h

四.开发和整合代码

上面生成的代码用起来还是比较麻烦,可以先封装一下接口提供给上层应用调用。最后把自己封装好的代码和生成的代码提取出来,这里还会用到一些gsoap插件也要加进去(位于gsoap工具包的plugin目录),如果需要ssl支持还需要把ssl库加进来,把这些文件放一起就可以生成库文件。

bash 复制代码
.
├── build.sh
├── CMakeLists.txt
├── config
│   └── RTSP_CAP.cfg
├── include
│   ├── httpda.h
│   ├── mecevp.h
│   ├── onvif.h
│   ├── openssl
│   │   ├── aes.h
│   │   ├── asn1.h
│   │   ├── asn1_mac.h
│   │   ├── asn1t.h
│   │   ├── bio.h
│   │   ├── blowfish.h
│   │   ├── bn.h
│   │   ├── buffer.h
│   │   ├── camellia.h
│   │   ├── cast.h
│   │   ├── cmac.h
│   │   ├── cms.h
│   │   ├── comp.h
│   │   ├── conf_api.h
│   │   ├── conf.h
│   │   ├── crypto.h
│   │   ├── des.h
│   │   ├── des_old.h
│   │   ├── dh.h
│   │   ├── dsa.h
│   │   ├── dso.h
│   │   ├── dtls1.h
│   │   ├── ebcdic.h
│   │   ├── ecdh.h
│   │   ├── ecdsa.h
│   │   ├── ec.h
│   │   ├── engine.h
│   │   ├── e_os2.h
│   │   ├── err.h
│   │   ├── evp.h
│   │   ├── hmac.h
│   │   ├── idea.h
│   │   ├── krb5_asn.h
│   │   ├── kssl.h
│   │   ├── lhash.h
│   │   ├── md4.h
│   │   ├── md5.h
│   │   ├── mdc2.h
│   │   ├── modes.h
│   │   ├── objects.h
│   │   ├── obj_mac.h
│   │   ├── ocsp.h
│   │   ├── opensslconf.h
│   │   ├── opensslv.h
│   │   ├── ossl_typ.h
│   │   ├── pem2.h
│   │   ├── pem.h
│   │   ├── pkcs12.h
│   │   ├── pkcs7.h
│   │   ├── pqueue.h
│   │   ├── rand.h
│   │   ├── rc2.h
│   │   ├── rc4.h
│   │   ├── ripemd.h
│   │   ├── rsa.h
│   │   ├── safestack.h
│   │   ├── seed.h
│   │   ├── sha.h
│   │   ├── srp.h
│   │   ├── srtp.h
│   │   ├── ssl23.h
│   │   ├── ssl2.h
│   │   ├── ssl3.h
│   │   ├── ssl.h
│   │   ├── stack.h
│   │   ├── symhacks.h
│   │   ├── tls1.h
│   │   ├── ts.h
│   │   ├── txt_db.h
│   │   ├── ui_compat.h
│   │   ├── ui.h
│   │   ├── whrlpool.h
│   │   ├── x509.h
│   │   ├── x509v3.h
│   │   └── x509_vfy.h
│   ├── plc_driver.h
│   ├── plcdrv.h
│   ├── PTZBinding.nsmap
│   ├── smdevp.h
│   ├── soapH.h
│   ├── soapStub.h
│   ├── stdsoap2.h
│   ├── struct_timeval.h
│   ├── threads.h
│   ├── wsaapi.h
│   └── wsseapi.h
├── lib
│   ├── libcrypto.a
│   ├── libcrypto.so
│   ├── libcrypto.so.1.0.0
│   ├── libssl.a
│   ├── libssl.so
│   └── libssl.so.1.0.0
└── src
    ├── dom.c
    ├── httpda.c
    ├── mecevp.c
    ├── plc_driver.c
    ├── plcdrv.c
    ├── ptzctrl.c
    ├── smdevp.c
    ├── soapC.c
    ├── soapClient.c
    ├── stdsoap2.c
    ├── struct_timeval.c
    ├── threads.c
    ├── wsaapi.c
    └── wsseapi.c
相关推荐
BingoGo2 小时前
PHP 如何利用 Opcache 来实现保护源码
后端·php
BingoGo1 天前
2025 年 PHP 常见面试题整理以及对应答案和代码示例
后端·php
Bruce1232 天前
web专题之php代审(二)
php
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
BingoGo2 天前
PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来
后端·php
echoarts2 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题2 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说2 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机