大家好,欢迎来到IT知识分享网。
感谢博主OceanStar的学习笔记,ONVIF系列二和系列三中安装操作过程及代码实现参考了这位博主的博客。
ONVIF系列:
ONVIF系列一:ONVIF介绍
ONVIF系列二:Ubuntu安装gSOAP、生成ONVIF代码框架
ONVIF系列三:ONVIF客户端实现
1、ONVIF是什么
2、ONVIF Profile:
ONVIF提供了很多的Profile,每个Profile都定义了一组特定的功能集合,支持ONVIF不需要考虑ONVIF版本只需要保持Profile一致即可互通。
3、ONVIF开发技术框架
4、Web Services
网上对Web Services描述的很专业、很绕口,其实Web Services就是对外提供接口的一个http服务,客户端通过调用Web Services提供的接口满足自己的需求,使用的协议都是基于http的,只不过在http请求和响应报文中的负载(payload)不一样(当然我们也可以自己制定私有数据格式,只不过不被业界认可,一般都是内部使用)。
ONVIF就是把各个功能定义出来,并且把功能对应的Web Services接口固定下来,包括数据格式,参数等,这样就形成了一套规范,各个厂商都遵循这套规范就可以互通了。
4.1 RPC
1、客户端client发起服务调用请求。
2、client stub 可以理解成一个代理,会将调用方法、参数按照一定格式进行封装,通过服务提供的地址,发起网络请求。
3、消息通过网络传输到服务端。
4、server stub接受来自socket的消息
5、server stub将消息进行解包、告诉服务端调用的哪个服务,参数是什么
6、结果返回给server stub。
7、sever stub把结果进行打包交给socket
8、socket通过网络传输消息
9、client slub 从socket拿到消息。
10、client stub解包消息将结果返回给client。
在RPC框架中,client调用stub函数就和调用本地函数一样,stub函数会帮我们实现具体细节(http封包-步骤2、socket数据发送-步骤3、socker数据接收-步骤8、http解包-步骤9),这个stub(存根)函数也不需要我们自己写,都有开源框架帮我们实现,不必造轮子。同理server只需要实现server functions实现功能即可,其他的由RPC框架完成。
4.2 SOAP消息格式
SOAP消息以XML格式编码,一个典型的SOAP消息由以下几部分组成:
SOAP请求:
POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>
SOAP响应:
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse> </soap:Body> </soap:Envelope>
上面SOAP请求中GetStockPrice就是客户端要调用的远程RPC函数(说是服务也可以),StockName是远程RPC函数参数,SOAP响应中GetStockPriceResponse表示对客户端的响应,也就是客户端调用GetStockPrice RPC函数的响应,SOAP中响应一般是在请求的RPC函数后面加上Response表示响应,Price是GetStockPrice函数的处理结果。由上述过程可见,RPC就是把函数功能放到远端服务器上,由客户端调用,服务器处理完把结果返回,这中间的数据传输都是由HTTP + XML完成的。ONVIF其实就是对服务端(IPC摄像头等)有哪些功能,即RPC函数以及RPC函数参数,还有客户端调用这些RPC函数的http url以及http负载中的xml应该怎么写等进行规范(这些规范都写在了WSDL文档中,将在下面介绍),实现厂商之间互通。
4.3 WSDL
如下图所示,是ONVIF WSDL文档中定义的获取设备信息接口:
GetDeviceInformation表示接口名字(RPC函数名字),Description是对接口的描述。
SOAP Action 是用于标识 SOAP 消息中将要执行的操作的一个 HTTP 头部字段,它在 SOAP 1.1 中被定义为可选的,而在 SOAP 1.2 中则被视为弃用的。通常,SOAP Action 的值是一个 URI,用于唯一地标识 SOAP 消息中的操作。
Input表示GetDeviceInformation函数参数。
Output表示输出参数,即GetDeviceInformation返回的结果。
在ONVIF请求中,会把GetDeviceInformation函数名,GetDeviceInformation函数Input参数都封装到XML中(SOAP格式),在ONVIF响应中会把Output输出结果封装到XML(SOAP格式)中并返回给ONVIF客户端。
XML格式这里就不介绍了,相关教程有很多,推荐大家学习一下XML中的命名空间,XML命名空间和C++中的命名空间类似,是为了防止不同服务之间的命名冲突,就是在XML元素的前面加上命名空间:,命名空间是在哪里定义的要在属性中声明出来,例如上面SOAP请求中xmlns:m=”http://www.example.org/stock”就是声明这个命名空间是在哪里定义的,并给命名空间起一个别名为m,m:GetStockPrice表示调用http://www.example.org/stock里面定义的GetStockPrice,而不是其他地方定义的GetStockPrice,这样就防止了不同服务之前的命名冲突和歧义。
5、ONVIF WSDL文档
ONVIF的开发技术栈如下图所示:
我的开源:
5、simple rtsp client,rtsp客户端,支持TCP、UDP、H264、H265、AAC、PCMA,支持鉴权。项目地址:https://github.com/BreakingY/simple-rtsp-client
6、libflv,flv muxer/demuxer,支持H264/H265、AAC。项目地址:GitHub – BreakingY/libflv: flv muxer/demuxer,support H264/H265、AAC。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/116002.html




