1 前言

  特别感谢@许振坪大佬的文章,使得我能在很短的时间内,通过ONVIF协议获得设备信息。
  因为时间的原因,我项目完结之后,再补充相关基础知识,本文章主要记录框架代码生成步骤和遇见的问题。

1.1 ONVIF

  ONVIF:开放式网络视频接口论坛(Open Network Video Interface Forum)。创建了一个视频监控和其他物理安全领域的IP产品如何相互通信的标准,这种标准也可以称为ONVIF标准。
  ONVIF框架通常通过gSOAP工具生成,手动实现成本高,难度大。

1.2 gSOAP

  gSOAP:提供了一个SOAP关于C/C++语言的实现。
  要通过gSOAP生成C/C++框架,需要WSDL文件,ONVIF的WSDL文件由ONVIF官方社区提供。

1.3 WSDL

  WSDL:Web服务描述语言(Web Services Description Language)。是为描述Web服务发布的XML格式。
  只有SOAP方式实现的Web Services才有WSDL文档,其他方式实现的Web Services并没有WSDL文档。

1.4 SOAP

  SOAP:简单对象访问协议(Simple Object Access Protoco)。是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的固化下的信息。
  XML:可扩展标记语言。是标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
  标准通用置标语言:也成为标准通用标记语言。是当今创建结构化文档描述语言规则的战略集合。
  SOAP相当于HTTP的数据部分,HTTP是对SOAP消息的封装。

1.5 WSDL资源

  • DeviceMgmt(设备管理)
    https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
  • DeviceIO(设备IO服务)
    http://www.onvif.org/onvif/ver10/deviceio.wsdl
  • Event(事件处理)
    http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
  • Analytics(视频分析)
    http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl
  • AnalyticsDevice(分析设备)
    http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
  • Display(显示服务)
    http://www.onvif.org/onvif/ver10/display.wsdl
  • Imaging(图像配置)
    http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl
  • Media(媒体配置)
    https://www.onvif.org/ver10/media/wsdl/media.wsdl
  • PTZ(PTZ控制)
    http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
  • Receiver(接收端配置)
    http://www.onvif.org/onvif/ver10/receiver.wsdl
  • RemoteDiscovery(设备发现)
    https://www.onvif.org/ver10/networ/wsdl/remotediscovery.wsdl
  • Recording(录像控制)
    http://www.onvif.org/onvif/ver10/recording.wsdl
  • Replay(重放控制)
    http://www.onvif.org/onvif/ver10/replay.wsdl
  • Search(记录搜索)
    http://www.onvif.org/onvif/ver10/search.wsdl
  • 对应各模块文档:
    https://www.onvif.org/onvif/ver20/util/operationIndex.html

2 环境准备

  1. Bison http://www.gnu.org/software/bison/
  2. Flex http://flex.sourceforge.net/
    编译报错*** [Makefile:1696: stage1scan.c] Segmentation fault (core dumped)
    添加选项
./configure CFLAGS='-g -O2 -D_GNU_SOURCE' --prefix=/opt/flex-2.6.4
  1. OpenSSL https://www.openssl.org/
    openssl选择按照在/usr/local/ssl,openssl安装很重要,因为后续编译会用到该库,我在这里走了很多弯路。

3 编译gSOAP源码

gSOAP开源版下载地址:http://sourceforge.net/projects/gsoap2

cd gsoap-2.8
./configure --with-openssl=/usr/local/ssl
make
sudo make install

4 使用gSOAP生成ONVIF框架代码

4.1 参考gSOAP官网说明修改gsoap\typemap.data

  参考「How do I use gSOAP with the ONVIF specifications」https://www.genivia.com/resources.html)我用的gsop_2.8.117,typemap.dat文件满足要求,不用改。

4.2 使用wsdl2h工具,生成头文件

cd gsoap-2.8/gsoap/
mkdir -p samples/onvif
wsdl2h -P -x -c -s -t ./typemap.dat -o samples/onvif/onvif.h https://www.onvif.org/ver10/network/wsdl/remotediscovery.wsdl https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/ver10/media/wsdl/media.wsdl

  生成头文件的过程中出现两个Warning,不需要管它。

4.3 因为鉴权(认证)需要,修改onvif.h文件

有些ONVIF接口调用时需要携带认证信息,要使用soap_wsse_add_UsernameTokenDigest函数进行授权,所以要在onvif.h头文件开头加入

#import "wsse.h"

4.4 使用soapcpp2工具,根据头文件产生框架代码

  因为onvif.h头文件中的两个"wsdd10.h“和"wsa5.h"都定义了int SOAP_ENV__Fault,所以我们修改import\wsa5.h文件,将int SOAP_ENV__Fault修改为int SOAP_ENV__Fault_alex

soapcpp2 -2 -C -L -c -x -I import:custom -d samples/onvif/ samples/onvif/onvif.h

4.5 拷贝其他还会用的源码

cp stdsoap2.c stdsoap2.h plugin/wsaapi.c plugin/wsaapi.h custom/duration.c custom/duration.h  samples/onvif/

4.6 "namespaces"命令空间定义实现,修改stdsoap2.c文件

  在samples\onvif\stdsoap2.h中有命名空间"namespaces变量"的定义声明,"namespaces变量"的定义实现,是在samples\onvif\wsdd.nsmap文件中,为了后续应用程序要顺利编译,修改samples\onvif\stdsoap2.c文件,在开头加入:

#include "wsdd.nsmap"

4.7 编写主程序和Makefile文件

  主程序使用参考博客作者提供。

TAR:= devicefindCC:= gccSRCS:= $(wildcard *.c)OBJS:= $(SRCS:.c=.o)INC = -I./                               \-I/opt/openssl/include/openssl/    \-I/opt/openssl/includeLIBS += -L/opt/openssl/lib               \-lssl                            \-lcrypto                         \-lpthreadCFLAGS += -c -g -Wall -DWITH_DOM -DWITH_OPENSSL
CFLAGS += $(INC)
# 一定要添加 -DWITH_DOM -DWITH_OPENSSL
$(TAR):$(OBJS)$(CC) $^ -o $@ $(LIBS)
%.o:%.c@$(CC) $(CFLAGS) -c $< -o $@ clean:rm -rf $(OBJS)

我这里使用的是gsop_2.8.117版本,编译报错。

最后根据参考2完成ONVIF框架。
主要有两点需要注意

  1. gSoap工具编译的时候指定openssl库目录
  2. 修改typemap.dat,由于使用time_duration,需要取消xsd__duration注释

参考1:ONVIF协议网络摄像机(IPC)客户端程序开发(6):使用gSOAP生成ONVIF框架代码
参考2:使用gSOAP生成ONVIF框架,控制网络摄像机及云台

一、ONVIF协议:使用gSOAP生成ONVIF框架代码相关推荐

  1. ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++)03-->Windows

    其它的不多说,直接开始步骤. 我的版本是2.8.109,目前最新版本. 实际上,onvif的源码是兼容Linux.Windows版本的,例如如果你已经在这篇文章ONVIF协议网络摄像机(IPC)客户端 ...

  2. onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码

    因工作原因,被安排接手onvif,为了对其有个真正.切实.系统.认真.严谨的了解,就利用周末等业余时间来学习研究. 本文主要讲述在windows环境中使用gsoap生成onvif框架的代码,但不涉及框 ...

  3. gSOAP生成ONVIF框架代码

    gSOAP生成ONVIF框架代码 一次性把所有可能会用到的WSDL文档都纳入编译,以便得到一份尽可能齐全的ONVIF接口代码.我这样做是为了省事,但我希望你在心底里能明白一件事情:ONVIF有好多个模 ...

  4. Linux gsoap生成onvif框架(C语言客户端代码)一

    创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...

  5. SOAP学习之二:全网最简单的ONVIF协议IPC云台PTZ控制VC++代码--不使用gsoap!!

    接触soap和xml第三天,稍有一点认识,看了很多文章,都不适合我的项目.目前项目中用到三台不同品牌的IPC,虽说厂家都用SDK,但在项目中引入三套SDK有点臃肿,何况目前已实现了使用VLC的拉流播放 ...

  6. Onvif协议之gSOAP工具

    1.简介 gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然.这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应 ...

  7. onvif协议服务器端口,通过onvif协议接入海康、大华NVR步骤

    <通过onvif协议接入海康.大华NVR步骤>由会员分享,可在线阅读,更多相关<通过onvif协议接入海康.大华NVR步骤(4页珍藏版)>请在人人文库网上搜索. 1.通过onv ...

  8. gSoap编译生成onvif框架代码

    注意:以上操作命令是在gsoap-2.8/gsoap 路径下执行的 编译修改 typemap.dat 1. 去掉 xsd__duration = #import "custom/durati ...

  9. 安防百科-单了解ONVIF 协议

    什么是ONVIF ? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在2008年共同成立的一个国 ...

最新文章

  1. JavaScript学习笔记——underscore操作对象的方法
  2. ubuntu下安装vue-cli后输入vue提示无法找到vue命令解决办法
  3. 【译】SQL Server误区30日谈-Day2-DBCC CHECKDB会导致阻塞
  4. php网页生命周期函数,PHP的生命周期
  5. python nmap模块详解_python中的Nmap模块问题
  6. matlab批量将图片反色
  7. 微信小程序chooseMedia应用
  8. 蚂蚁森林 离线爬虫自动收能量,养小鸡,等各种操作
  9. SQL注入案例演示与防范措施大全
  10. 互联网域名系统国家工程中心(ZDNS)正式运营“.ren”顶级域名
  11. CentOS8 启动错误,enter emergency mode 报错 Failed to mount /sysroot 解决方法
  12. 计算机启动硬盘自检,启动时硬盘自检?这样处理就没事了
  13. 国家税务总局全国增值税发票查验平台-客户端
  14. java在win10和win7哪个好_老电脑win10和win7哪个好用
  15. 没有项目经验?软件测试简历项目经验怎么写...
  16. 如何批量的修改文件后缀名
  17. [iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)
  18. wpscan更新失败
  19. hz和分贝怎么转换_分贝转换
  20. 【华为OD机试真题 python】机房布局【2023 Q1 | 200分】

热门文章

  1. 面向对象——封装继承编程题
  2. 小说视频图片站群采集工具程序源码
  3. android 中期检查,基于Android的中小学在线问答系统的中期检查报告.docx
  4. java淘宝秒杀脚本(已自测)
  5. linux高级程序复习(未完,整理比较粗糙)
  6. 使用包configparser,出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 155: illegal mu
  7. SAP税务处理---采购/销售相关
  8. DDOS SYN攻击
  9. Shopify建站必不可少的5个效率提升插件
  10. sis、sisx文件解压 SISWare