一、ONVIF协议:使用gSOAP生成ONVIF框架代码
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 环境准备
- Bison http://www.gnu.org/software/bison/
- 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
- 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框架。
主要有两点需要注意
- gSoap工具编译的时候指定openssl库目录
- 修改typemap.dat,由于使用time_duration,需要取消xsd__duration注释
参考1:ONVIF协议网络摄像机(IPC)客户端程序开发(6):使用gSOAP生成ONVIF框架代码
参考2:使用gSOAP生成ONVIF框架,控制网络摄像机及云台
一、ONVIF协议:使用gSOAP生成ONVIF框架代码相关推荐
- ONVIF协议网络摄像机(IPC)客户端程序开发使用gSOAP生成ONVIF框架代码(C++)03-->Windows
其它的不多说,直接开始步骤. 我的版本是2.8.109,目前最新版本. 实际上,onvif的源码是兼容Linux.Windows版本的,例如如果你已经在这篇文章ONVIF协议网络摄像机(IPC)客户端 ...
- onvif学习笔记4:Windows环境使用gsoap生成onvif框架代码
因工作原因,被安排接手onvif,为了对其有个真正.切实.系统.认真.严谨的了解,就利用周末等业余时间来学习研究. 本文主要讲述在windows环境中使用gsoap生成onvif框架的代码,但不涉及框 ...
- gSOAP生成ONVIF框架代码
gSOAP生成ONVIF框架代码 一次性把所有可能会用到的WSDL文档都纳入编译,以便得到一份尽可能齐全的ONVIF接口代码.我这样做是为了省事,但我希望你在心底里能明白一件事情:ONVIF有好多个模 ...
- Linux gsoap生成onvif框架(C语言客户端代码)一
创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发. ...
- SOAP学习之二:全网最简单的ONVIF协议IPC云台PTZ控制VC++代码--不使用gsoap!!
接触soap和xml第三天,稍有一点认识,看了很多文章,都不适合我的项目.目前项目中用到三台不同品牌的IPC,虽说厂家都用SDK,但在项目中引入三套SDK有点臃肿,何况目前已实现了使用VLC的拉流播放 ...
- Onvif协议之gSOAP工具
1.简介 gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然.这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应 ...
- onvif协议服务器端口,通过onvif协议接入海康、大华NVR步骤
<通过onvif协议接入海康.大华NVR步骤>由会员分享,可在线阅读,更多相关<通过onvif协议接入海康.大华NVR步骤(4页珍藏版)>请在人人文库网上搜索. 1.通过onv ...
- gSoap编译生成onvif框架代码
注意:以上操作命令是在gsoap-2.8/gsoap 路径下执行的 编译修改 typemap.dat 1. 去掉 xsd__duration = #import "custom/durati ...
- 安防百科-单了解ONVIF 协议
什么是ONVIF ? ONVIF:原意为 开放型网络视频接口论坛,即 Open Network Video Interface Forum ,是安讯士.博世.索尼等三家公司在2008年共同成立的一个国 ...
最新文章
- JavaScript学习笔记——underscore操作对象的方法
- ubuntu下安装vue-cli后输入vue提示无法找到vue命令解决办法
- 【译】SQL Server误区30日谈-Day2-DBCC CHECKDB会导致阻塞
- php网页生命周期函数,PHP的生命周期
- python nmap模块详解_python中的Nmap模块问题
- matlab批量将图片反色
- 微信小程序chooseMedia应用
- 蚂蚁森林 离线爬虫自动收能量,养小鸡,等各种操作
- SQL注入案例演示与防范措施大全
- 互联网域名系统国家工程中心(ZDNS)正式运营“.ren”顶级域名
- CentOS8 启动错误,enter emergency mode 报错 Failed to mount /sysroot 解决方法
- 计算机启动硬盘自检,启动时硬盘自检?这样处理就没事了
- 国家税务总局全国增值税发票查验平台-客户端
- java在win10和win7哪个好_老电脑win10和win7哪个好用
- 没有项目经验?软件测试简历项目经验怎么写...
- 如何批量的修改文件后缀名
- [iOS]Advanced Memory Management Programming Guide 高级内存管理编程指南(官方文档翻译)
- wpscan更新失败
- hz和分贝怎么转换_分贝转换
- 【华为OD机试真题 python】机房布局【2023 Q1 | 200分】
热门文章
- 面向对象——封装继承编程题
- 小说视频图片站群采集工具程序源码
- android 中期检查,基于Android的中小学在线问答系统的中期检查报告.docx
- java淘宝秒杀脚本(已自测)
- linux高级程序复习(未完,整理比较粗糙)
- 使用包configparser,出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 155: illegal mu
- SAP税务处理---采购/销售相关
- DDOS SYN攻击
- Shopify建站必不可少的5个效率提升插件
- sis、sisx文件解压 SISWare