一、ONVIF协议:使用gSOAP生成ONVIF框架代码

本文详细介绍使用gSOAP工具生成ONVIF框架代码的过程,包括环境搭建、代码编译及应用开发等内容,帮助读者快速掌握ONVIF协议的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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:= devicefind

CC:= gcc

SRCS:= $(wildcard *.c)

OBJS:= $(SRCS:.c=.o)

INC = -I./                               \
      -I/opt/openssl/include/openssl/    \
      -I/opt/openssl/include

LIBS += -L/opt/openssl/lib               \
        -lssl                            \
        -lcrypto                         \
        -lpthread

CFLAGS += -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框架,控制网络摄像机及云台

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值