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
相关推荐
朝朝辞暮i几秒前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
掉进电商坑三年没爬出来的东叔34 分钟前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust1 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机
殷色玫瑰1 小时前
C++ STL:stack、queue、priority_queue 与容器适配器详解
java·开发语言·数据结构·c++·算法·visualstudio
IT方大同2 小时前
java输入输出+方法
java·开发语言·python
滕州市燕猫虎计算机科技工作室个体工商户2 小时前
《Rust程序设计》学习笔记一
开发语言·rust·学习笔记·rust程序设计
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 服务拆分之服务远程调用
java·开发语言·spring cloud
努力努力再努力wz2 小时前
【CUDA入门系列】CUDA编程实战:设备选择、显存管理、Kernel、Stream 与 Event 全流程梳理
开发语言·c++
杨丰玮4182 小时前
C语言核心语法
java·c语言·开发语言·学习方法
ttwuai2 小时前
Go开源后台管理系统推荐:README、源码和License应该怎么验
开发语言·golang·开源