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:= 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框架。
主要有两点需要注意
- gSoap工具编译的时候指定openssl库目录
- 修改typemap.dat,由于使用time_duration,需要取消xsd__duration注释
参考1:ONVIF协议网络摄像机(IPC)客户端程序开发(6):使用gSOAP生成ONVIF框架代码
参考2:使用gSOAP生成ONVIF框架,控制网络摄像机及云台