Onvif协议客户端开发【1.概念篇】

这段时间在做毕设,做的东西是基于Onvif的视频流云存储。把碰到的一些问题记录下来。

一.如何理解Onvif协议

一开始拿到这个课题只知道要通过Onvif协议获得视频流,然后把视频流存储下来。但是对于Onvif协议根本没有理解。我在翻译外文文献的时候,文章中反复出现stub这个单词,我也翻译不好这个单词。后来才发现,原来这个单词是RPC(远程过程调用)的概念。所以,我们首先来看看RPC:

这里引用了某位同学的博客,分深入和浅出两篇讲解了RPC的过程:

深入浅出RPC——浅出篇

深入浅出RPC——深入篇

这里主要盗用下面两张图来很好的说明整个过程:

rpc

rpc_detail

具体这两张图片的含义通过上面的两个博客应该能够很清晰的理解了。

 

二.学习Onvif协议

在理解了RPC之后,可以开始学习Onvif了。简单来说,可以把Onvif协议想像成Http协议,客户端发出请求,然后服务端在收到请求之后把所需信息返回给客户端。以浏览器为例子,html代码通过http协议来传送。其实Onvif的整个过程很类似的,当你想去学习onvif协议的时候,所有介绍onvif的文章里面都会提到,onvif是基于soap协议和wsdl协议的,而soap协议和wsdl协议都是基于xml的。我们先不管soap协议和wsdl协议是什么东西,但是对于xml我们应该比较熟悉的。我们知道xml里面其实传送的是数据或请求命令,那么这里就可以把xml想像成html了。这样一来就比较好理解了。举个例子:

对于网络摄像头,我们可以看成是服务端(Onvif里面把IP摄像头定义为NVT设备 :Network Video Transmitter),既然是服务端,就跑着很多“服务”,比如说设置IP的服务,控制摄像头移动、调焦的服务,提供网络视频流的服务,等等。而每一个服务都有一个Profile(配置文件)。我们想要使用这些服务,必须首先去请求获得这些Profile(配置文件),这些Profile里面有关于对应服务的具体信息。

客户端首先去请求获得某个服务的Profile,服务端收到请求后把该Peofile里面的信息返回给客户端。这样客户端根据收到的Profile里面的信息就可以使用服务了。(当然真正的过程远比这个复杂,但是大致就是这个流程)。

那么,服务端提供哪些服务呢?我们可以认为在wsdl协议里面规范了提供的服务。

那么,客户端和服务端是怎么进行交互的呢?我们可以认为soap协议规范了交互这个过程。

现在我们对整个流程的了解更进了一步,接下来我们再回过头来看看上面的第一张图。

我们编写的是客户端,所以我们就是caller。我们所要编写的代码是红色的那部分,也就是逻辑函数。

而具体的函数实现是在黄色的User-stub里面实现的。黄色的这部分不用我们来做,刚才已经说了,交互是通过soap来进行的,所以我们可以使用工具来自动生成User-stub,具体步骤如下:

1.使用Onvif协议的官方wsdl文档生成头文件,使用的工具是wsdl2h

2.根据头文件生成stub代码,使用的工具是soapcpp2

最后,绿色的部分是RPC runtime,由于我们编写的是红色的逻辑代码的函数,而RPC runtime是根据黄色的User-stub生成的,所以调试起来会比较麻烦。搜索一下别人的博客可以发现一些调试技巧,这里就不写出来了,大家可以自己找一下。

 

希望这篇文章对您理解Onvif的整个流程有所帮助。