基于ONVIF的客户端事件处理接口的设计与实现

2016-10-17 09:05苏凯雄李芳芳
电视技术 2016年9期
关键词:调用线程摄像头

邓 凯,苏凯雄,李芳芳

(福州大学 物理与信息工程学院,福建 福州 350100)



基于ONVIF的客户端事件处理接口的设计与实现

邓凯,苏凯雄,李芳芳

(福州大学 物理与信息工程学院,福建 福州 350100)

在对ONVIF协议深入分析研究的基础上,使用gsoap和VS2008等工具设计了一个高效的ONVIF事件处理库,集成了通用的ONVIF事件处理接口。ONVIF事件处理库中的接口被设计成自启线程的模式,对用户屏蔽了底层ONVIF协议的实现过程,允许用户设计自己的事件响应方法,同时具有完备的错误处理机制,能够快速方便地被顶层应用程序调用。ONVIF事件处理库具有自身的独立性,不依赖于某个工程,可以被不同的工程快速集成和调用。

ONVIF;视频监控;告警;事件处理接口;线程

随着网络视频监控市场规模的扩大,各种品牌型号的网络摄像机纷纷涌入市场,推动了视频监控应用领域的迅速扩展。但由于没有统一的标准,各个厂商各自为营,按照各自的协议开发产品,并捆绑销售各自软硬件,从而导致了不同产品之间互不兼容,限制了视频监控系统的互联互通与规模应用[1]。为了打破这种局面,2008年5月,安讯士、博世和索尼三方宣布共同发起成立了一个国际开放型网络视频接口论坛,取名为ONVIF(Open Network Video Interface Forum),其目标是在世界范围内推动不同厂商视频监控产品的相互兼容。时至今日,ONVIF已经拥有500多家会员。国内摄像头厂商海康威视和大华也已加入ONVIF,作为ONVIF会员,其产品完全支持ONVIF协议,同时具有多种事件处理功能。

尽管兼容ONVIF协议的网络摄像头越来越多,但目前没有统一的专为ONVIF协议设计的客户端软件。各个厂商在设计自己的客户端软件时,虽然集成了ONVIF功能来支持自己的摄像头,但不可分离、不可复用。而国内外的许多文献虽然研究了ONVIF协议,也有提出库的思想,但是针对事件处理的研究较少,更没有具体的框架方案。基于上述状况,本文设计了一个通用的ONVIF协议事件处理库,并对用户屏蔽了底层ONVIF协议的处理过程,使得用户只需要将这个事件处理库添加到自己的工程中,并在工作函数中设计自己的事件响应方法,就可以调用事件处理库中的接口自动响应发生的事件。在这个过程中,用户无需关心底层的处理机制,只需要提供摄像头的地址,账号和密码以及自己设计的事件响应方法即可。

1 ONVIF事件处理机制分析

ONVIF将所有的设备功能定义为Web服务,使用基于XML的WSDL语言来描述这些服务,使用SOAP协议和HTTP协议来进行信息交互[2]。ONVIF协议实现机制是:ONVIF客户端根据WSDL描述文件将请求封装为SOAP消息,通过HTTP发送到包含对应Web Services的Web服务器上;Web Services解析SOAP请求并通过HTTP回复客户端;客户端解析SOAP,提取应答信息[3]。

ONVIF很大程度上支持现有的标准,因为它的目标是实现不同产品的互通性,而不是定义全新的标准[4]。其事件处理就使用了OASIS的WS-BaseNotification和WS-Topics规范[2,5]。WS-BaseNotification规范着重于订阅和通知操作,规范了信息交互过程中的术语、概念、操作和交互语言的格式等,定义了生产者和消费者的角色[6]。WS-Topics规范定义了主题的概念来对事件进行组织和分类,并定义了对事件进行筛选的语法和表达式[7]。

根据WS-BaseNotification规范,ONVIF的事件处理机制定义了三种角色,即客户端、事件服务器和订阅管理器。ONVIF为他们之间的交互定义了两种方式,第一种是监听阻塞方式,第二种是实时Pull-Point方式[8]。第二种方式的实时性不如第一种,但具有防火墙友好通知的优势,当事件服务器和客户端不在同一个网络内时,解决了事件服务器向客户端发送通知被防火墙拦截的问题。本文采用实时Pull-Point方式,交互过程如图1所示。

图1 Pull-Point交互过程

2 接口设计与实现

ONVIF使用的SOAP协议是用于信息交互的一种轻量级协议[9]。客户端与服务器的交互信息最终需要按照SOAP协议进行结构化填充。根据WSDL文档进行ONVIF协议的开发可以有两种方法:第一种是手动的根据WSDL文档进行SOAP协议的封装和解析,第二种是通过第三方工具对WSDL进行自动解析编译,提供自动封装和解析SOAP协议的接口。对WSDL进行解析的第三方工具有很多,例如gsoap,Apache Axis2/C,WSF/C和Staff等。综合对比,gsoap具有更优秀的能力,能够最大化的屏蔽底层通信协议的封装和解析,提供优良的接口,简化开发过程[10]。本文使用gsoap2.8.19作为开发工具。

2.1框架代码的生成

ONVIF的大多数功能都需要进行鉴权,即在soap消息的header部分添加WS-Security标签。在ONVIF核心规范中,鉴权属于设备管理服务下的安全部分,有关鉴权的接口被定义在devicemgmt.wsdl中,事件处理服务的相关接口被定义在event.wsdl中[8]。

使用gsoap的wsdl2h.exe工具将event.wsdl和devicemgmt.wsdl编译成中间头文件,然后在头文件中添加#import "wsse.h",打开鉴权功能后再使用soapcpp2.exe生成框架代码。Event开发的相关接口在soapStub.h中声明,在soapClient.cpp中实现。根据实时Pull-Point方式的交互过程,开发中实际用到的基本接口有:GetCapabilities用于判断摄像头是否支持事件处理功能,CreatePullPointSubscription,PullMessages和Unsubscribe用于事件的订阅、获取和注销,UsernameTokenDigest用于鉴权,new,delete和destroy等用于对象的实例化和销毁。本文使用VS2008创建一个动态链接库工程,将生成的基本接口文件以及鉴权相关文件和其他所需文件(例如跟soap接口相关的stdsoap2.h和stdsoap2.cpp等)添加到工程中,并以此为基础,对基本接口进行合理的规划和封装,创建面向用户的简洁接口,以库的形式提供给用户使用。

2.2接口的总体设计

基本接口通过封装成类的方式对用户进行屏蔽,方便用户的操作。在封装的过程中对返回的错误信息进行了处理,并向上层报告。event类成员函数设计如下:

public:

event ():构造函数,封装了各种基本的new接口;

~event ():析构函数,封装了各种基本的delete和destroy等接口;

InitUserToken():初始化用户名和密码;

InitDeviceReference():初始化网络摄像头服务入口地址;

GetDeviceEventCapability():封装基本接口GetCapabilities,判断是否支持事件处理功能[11];

InitCallbackFunc():初始化用户回调函数;

RenewCallbackFunc():更新用户回调函数;

Start():启动事件处理服务;

private:

mCreatPullPointSubscription():封装基本接口CreatePullPointSubscription,创建订阅管理器;

mPullMessages():封装基本接口PullMessages,获取事件通知;

mThreadFunc():事件处理服务线程方法函数;

mDestroyPullPointSubscription():封装基本接口Unsubscribe,注销订阅管理器。

Start()是事件处理服务面向用户的核心部分,封装了事件处理服务线程的创建,线程方法函数为ThreadFunc()。在ThreadFunc()中会调用一次mCreatPullPointSubscription()接口,向网络摄像头中的服务器申请创建订阅管理器,之后不停地调用mPullMessages()接口请求并处理事件通知。mPullMessages()是事件处理服务面向ONVIF协议的底层核心部分,以函数指针的形式关联用户的事件处理方法。经过一系列的初始化后,用户只需调用Start()即可开启独立线程开始事件处理服务,而不需理解底层事件处理的具体流程和操作。用户唯一需要关心的就是编写自己的事件处理方法,通过InitCallbackFunc()接口将其入口地址告知事件处理服务线程,同时可以在任何时候通过RenewCallbackFunc()更换事件处理方法。事件处理服务顶层工作流程如图2所示,Strat()调用底层接口的过程如图3所示。

图2 事件处理服务顶层工作机制

图3 Strat()内部机制

2.3ThreadFunc()线程方法函数的设计

由于本文使用实时Pull-Point方式,所以在线程中需要将mPullMessages()放到while循环里,连续并主动地去获取事件通知并进行处理。这就需要考虑线程的退出问题。虽然Windows提供了一些终止线程的方法,例如ExitThread()和TerminateThread (),但这些方法都有内存泄露和死锁等风险。线程的最佳停止方法就是能够自行退出,而不是简单地使用ExitThread()或TerminateThread ()等来强行终止线程。本文根据实际应用情况,使用了一个事件对象,在while循环体中,每次调用mPullMessages()后,对这个事件对象进行超时等待。而事件的触发位于类的析构函数中,当该类的对象完成任务被析构时,就会触发该事件使线程正常退出。

2.4mPullMessages()的设计

mPullMessages()作为底层最核心的部分,决定了整个事件处理服务的框架和方法。mPullMessages()的主要功能是获取并分析网络摄像头发生的事件,并通过回调函数实现用户的响应方法。网络摄像头的异常事件有很多,例如移动、遮挡、越界、区域切换、外部IO触发和硬盘满等异常事件。这些事件可以通过主题和内容进行区分。CreatPullPointSubscription基本接口的请求参数列表中有一个Filter参数,根据主题填充该参数可以向事件服务器订阅专一的消息。例如,可以专门订阅移动侦测或者遮挡侦测,这样当各自的订阅管理器返回事件通知时,不必判断是哪一种事件就可以迅速作出处理。同样,可以订阅所有事件,然后对订阅管理器返回的事件类型进行判断后再做对应的处理。根据不同主题订阅专门的事件通知在实时性上占有很大的优势,但这种优势是体现在创建多线程的基础上。而多线程带来的是程序和资源分配的复杂性上升。对于实时性要求不是很高的场合,可以通过订阅所有事件,然后通过分析事件类型的方法来进行处理。本文实现的移动侦测和遮挡侦测在民用领域的实时性要求不是很高,有1 s左右的延时完全不影响结果,故采用订阅所有事件的方法。

mPullMessages()通过调用基本接口PullMessages向订阅管理器请求获取事件通知,然后根据返回的信息判断属于哪种类型的事件。根据海康威视和大华的网络摄像头返回结果,本文在Event类中定义Motion="tns1:RuleEngine/CellMotionDetector/Motion"和Tamper="tns1:RuleEngine/TamperDetector/Tamper"两个字符串常量,用于匹配移动侦测和遮挡侦测。

Event类中通过定义一个函数指针EventCallbackFunc来允许用户设计自己的事件响应方法。用户通过InitCallbackFunc()接口将自己的处理函数入口地址赋给EventCallbackFunc。mPullMessages()在分析判断出PullMessage基本接口的返回结果后,通过函数指针来调用用户的处理函数。这样在设计事件处理接口时不必考虑事件发生时该怎么处理,使得事件处理能够独立于顶层应用开发工程,而不与用户行为耦合在一起。Event类中还设计了一个RenewCallbackFunc()方法用于用户在事件处理过程中更换处理方法,同时mPullMessages()中对函数指针的调用进行加锁保护,为用户带来了极大的方便。mPullMessages()内部处理流程如图4所示。

图4 mPullMessages()内部机制

3 测试结果

由于海康威视和大华是国内权威的ONVIF摄像头厂商,所以使用海康威视DS-2CD3Q10FD-IW、DS-2CD3210D-I3和大华dh-ipc-kw12w-ce摄像头进行测试,开启摄像头的移动侦测功能和遮挡侦测功能。使用VS2008创建一个控制台应用工程,在工程中导入生成的库和类的头文件声明后,设计用户处理函数为Func1和Func2。在main函数中首先实例化一个event对象,接着依次调用InitUserToken()和InitDeviceReference()初始化用户名、密码和摄像头服务入口地址。然后调用GetDeviceEventCapability()判断摄像头是否支持事件处理,若支持则调用InitCallbackFunc(),初始化用户函数为Func1,最后调用Start()。启动程序后,当用硬纸板在摄像头前晃动时,迅速回显Func1的Motion字符串,如图5和图6所示;当用硬纸板挡在摄像头上时,迅速回显Func1的Tamper字符串,同时因为有移动,所以也会回显Func1的Motion字符串,如图7和图8所示。当调用RenewCallbackFunc()切换用户函数为Func2时,迅速回显Func2的相关字符串,如图9所示。每一次侦测到移动或者遮挡都会返回七八条事件通知。在测试过程中,每次回显间隔1 s左右,符合程序中设计的延时。

图5 移动(截图)

图6 移动回显(截图)

图7 遮挡(截图)

图8 遮挡回显(截图)

图9 用户函数切换回显(截图)

4 结束语

本文论述了基于ONVIF协议的事件处理接口的设计和实现方法。通过使用订阅所有事件分析返回结果判断事件类型的方法,实现了移动侦测和遮挡侦测。在工程中导入事件处理库和必要的声明文件后,用户只需要专注地设计自己的事件处理函数,然后经过非常简单的初始化和判断,就能调用Start()接口进行事件的侦测处理。这种事件处理库的设计模式不仅向用户屏蔽了ONVIF底层的处理过程,并且与用户行为高度分离,大大简化了应用程序的开发过程,缩短了开发周期。

[1]陈少尉,蔡东升,黄琦,等.基于ONVIF协议的变电站网络摄像机测试系统设计与实现[J].电测与仪表,2014,51(16):117-123.

[2]李校林,肖路欢,何策.基于ONVIF协议的NVR系统中网络视频接口的设计[J].电视技术,2014,38(11):166-169.

[3]文凯,张润.基于ONVIF的网络视频监控告警系统的实现[J].电视技术,2014,38(21):90-93.

[4]马宇昌,沈苏彬,欧阳志友.基于ONVIF标准的设备发现的设计与实现[J].计算机技术与发展,2013 (11):224-228.

[5]黄方靖.ONVIF协议在IPCam系统中的设计与实现[J].电子测量技术,2015,38(5):139-142.

[6]OASIS.Web services base notification 1.3 [EB/OL].[2015-10-16].http://docs.oasis-open.org/wsn.

[7]OASIS.Web services topics 1.3 [EB/OL].[2015-10-16].http://docs.oasis-open.org/wsn.

[8]ONVIF.ONVIF core specification ver2.6[EB/OL].[2015-10-16].http://www.onvif.org/specs/DocMap-2.6.html.

[9]W3C.SOAP version 1.2 part 1: messaging framework (second edition)[EB/OL].[2015-10-16].http://www.w3.org/TR/soap12-part1.

[10]LOPES S F,SILVA S,MENDES J,et al.Development of a library for clients of ONVIF video cameras: challenges and solutions [C]//2013 IEEE International Conference on Industrial Technology.[S.l.]:IEEE,2013:1260-1266.

[11]朱耀麟,李倩,王昊星.ONVIF协议的网络视频监控客户端接口研究[J].西北大学学报(自然科学版),2014,44(3):392-396.

责任编辑:闫雯雯

Design and implementation of event handing interfaces for clients based on ONVIF protocol

DENG Kai,SU Kaixiong,LI Fangfang

(CollegeofPhysicsandInformationEngineering,FuzhouUniversity,Fuzhou350100,China)

On the basis of in-depth analysis and research to ONVIF protocol, using tools such as gsoap and VS2008 designed an efficient ONVIF event handing library, integrating general ONVIF event handling interfaces. These interfaces in ONVIF event handing library are designed to start threads automatically, hide underlying ONVIF protocol implementation process from the user and allow users design themselves event response functions. These interfaces have complete error handling mechanism and can be called by the top application quickly and easily. This ONVIF event handing library is independent and doesn’t rely on a certain project. So it can be integrated and called by different projects rapidly.

ONVIF; video surveillance; alarm; event handing interface; thread

TN915

A

10.16280/j.videoe.2016.09.026

福建省产学重大项目(2015H6014);福建省发改委科技创新项目(闽发改投资【2014】168号)

2015-11-16

文献引用格式:邓凯,苏凯雄,李芳芳. 基于ONVIF的客户端事件处理接口的设计与实现[J].电视技术,2016,40(9):127-131.

DENG K,SU K X,LI F F. Design and implementation of event handing interfaces for clients based on ONVIF protocol[J]. Video engineering,2016,40(9):127-131.

猜你喜欢
调用线程摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
基于C#线程实验探究
基于国产化环境的线程池模型研究与实现
核电项目物项调用管理的应用研究
浅谈linux多线程协作
基于系统调用的恶意软件检测技术研究
奔驰360°摄像头系统介绍
利用RFC技术实现SAP系统接口通信
找出摄像头花屏的“罪魁祸首”