1. onvif是啥?
摄像头在我们的日常生活中可以说时随处可见。而在当下的时代,大多数摄像头都已经网络化,早期的网络摄像机硬件提供商都采用私有协议进行通讯。但随着时代的发展,摄像头的应用场景越来越多,各个摄像头的厂商也是百花齐放。私有协议终究会被淘汰。
为了解决这一困境,安讯士联合博世及索尼公司,共同制定了onvif(Open Network Video Interface Forum,开放型网络视频接口论坛)协议。
2. onvif可以做什么?
onvif协议涵盖了设备发现、设备配置、事件、PTZ控制、视频分析和实时流媒体直播功能,以及搜索,回放和录像录音管理功能。
3. onvif开发技术框架
ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行。
总结onvif协议的开发公式:ONVIF = 服务端 + 客户端 =(Web Services + RTSP)+ 客户端 = ((WSDL + SOAP) + RTSP) + 客户端
所以我们先来看看onvif开发中涉及到的一些技术框架
Web Services
Web Services是一种跨编程语言和跨操作系统平台的远程调用技术 ,可采用Http、SMTP等协议来在客户端和服务端之间传输数据。其中XML被用做数据描述的语法,SOAP用于消息传递,WSDL用来描述服务。
onvif是建立在Web Services标准上的,定义在onvif标准里的所有配置服务都表示为Web Services操作,并在WSDL中定义,使用HTTP作为通信机制。
WSDL
WSDL(Web Service Description Language),Web services 描述语言。用于描述Web服务和说明如何与Web服务通信的XML语言,为用户提供详细的接口说明书。
WSDL 文档是利用这些主要的元素来描述某个 web service 的:
<portType>: web service 执行的操作,可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。
<message>: web service 使用的消息,通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。message 用来定义每个soap服务的入参和出参,包括参数名,参数类型信息。(有点类似函数签名)。
<types>: web service 使用的数据类型定义,为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。
<binding>: web service 使用的通信协议。
wsdl实例:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。
上文提到的onvif的各个功能模块的接口都有相对应的WSDL文档进行描述,可以在ONVIF官网「Network Interface Specifications」中查阅:https://www.onvif.org/profiles/specifications/
SOAP
SOAP(Simple Object Access Protoco) 是一种基于 XML 的应用层协议,允许应用程序通过 HTTP、SMPT 来交换信息。
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
- 必需的 Envelope 元素, Envelope 元素是 SOAP 消息的根元素,它可把 XML 文档定义为 SOAP 消息。
- 可选的 Header 元素,包含头部信息,Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。
- 必需的 Body 元素, Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息,包含所有的调用和响应信息。
- 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息。
SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。
HTTP + XML = SOAP
SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。
HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
使用WSDL+XML的模式使得onvif协议具有良好的扩展性。
4. onvif协议规范
image.pngonvif定制了一系列的协议规范profiles,profiles协议协议要求客户端和设备彼此必须支持一组功能:
- Profile A:用于门禁控制配置,适用于电子门禁系统中使用的产品。
- Profile C:用于门控和事件管理,适用于电子门禁系统中使用的产品。
- Profile D – 候选版:用于访问控制周边设备,适用于周边设备的输入界面,例如令牌读取器(用于读取卡,钥匙,移动电话或条形码),生物识别读取器(用于指纹识别),相机(用于虹膜,面部或车牌识别),按键,传感器(用于识别锁状态,门状态,温度或动作)和部分输出设备(例如锁,显示器和LED)。
- Profile G:用于存储和检索,专为基于IP的视频系统而设计,支持元数据的分析配置和信息查询,以及元数据的过滤和流式传输。
- Profile Q: 用于快速安装,基于IP的视频系统,其目的是在网络上提供Profile Q一致产品(例如,网络摄像机,网络交换机,网络监视器)的快速发现和基本配置。
- Profile S:用于基本视频流,专为基于IP的视频系统而设计。
- Profile T:适用于高级视频流,专为基于IP的视频系统而设计。
详情可见:https://www.onvif.org/ch/profiles/
5. onvif通讯原理
服务供应者(设备)负责提供Web Services(如各种onvif功能服务),这些服务通过WSDL进行描述,然后,服务请求(客户端)将WSDL文档将作为服务实现的基础。WSDL编译工具能通过WSDL文件生成与平台相关的代码,如可将WSDL文件转化为c/c++代码的gsoap。
服务端和客户端采用soap消息来进行数据通讯。对Web Services请求和应答都会以soap消息的形式进行传输。soap消息独立于任何的操作系统或协议,而且可以使用各种不同的网络传输协议进行传送(也就是说onvif协议是应用层协议)。onvif定义了一致的soap消息传输协议,用于描述Web Services。
上图对onvif基于Web Services开发的基本原理进行了一个概括。
6. 一般的onvif协议开发流程
- 获取所需要的wsdl;
- WSDL编译工具能通过WSDL文件生成与平台相关的代码;
- 封装实现客户端业务逻辑;
网友评论