Onvif协议及其在Android下的实现
好久没有写博客,今天将前段时间做的Onvif协议在Android上的实现分享给大家。
首先,我们先来了解一下什么是Onvif协议:ONVIF 协议是由Open Network Video Interface Forum (开放型网络视频接口论坛)制定的开放性行业标准。这一接口标准的目的是确保不同厂商生产的网络视频产品具有互通性。
ONVIF规范中设备管理和控制部分所定义的接口均以Web Services的形式提供。ONVIF规范涵盖了完全的XML及WSDL的定义。每一个支持ONVIF规范的终端设备均须提供与功能相应的Web Service。服务端与客户端的数据交互采用SOAP协议。ONVIF中的其他部分比如音视频流则通过RTP/RTSP进行 。
如图所示就是Onvif协议要实现的内容,其中IPCAM就是指网络摄像机(IP Camera)。
接下去我们分步骤来说:
(1)发现ipcam
客户端首先发起ws-discovery,查找所在网络段内的所有的ipcam。Ipcam在接收到ws-discovery之后可以进行响应。
在android下的实现方式
1)DatagramPacket类,UDP的方式
2)计算广播地址(192.168.1.255)
3)socket send probe
4)开启一个线程去receive
5)解析收到的probematch
(2)对IP Camera参数配置
通过soap调用web server的方法,可根据wsdl进行方法的请求封装,实现具体的方法。
Soap:简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。
Wsdl:Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。为用户提供详细的接口说明书。
在android下实现方式:
1)实例化一个HttpURLConnection,并使用POST的方式
2)POST一个遵从WSDL定义的接口的包,例如GetStreamUri。
- <GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
- <StreamSetup>
- <Stream xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast</Stream>
- <Transport xmlns="http://www.onvif.org/ver10/schema">
- <Protocol>UDP</Protocol>
- </Transport>
- </StreamSetup>
- <ProfileToken>profile-0_0</ProfileToken>
- </GetStreamUri>
IP Camera在接收到该调用后会返回如下:
- <trt:GetStreamUriResponse>
- <trt:MediaUri>
- <tt:Uri>rtsp://192.168.0.105/live1.sdp</tt:Uri>
- <tt:InvalidAfterConnect>false</tt:InvalidAfterConnect>
- <tt:InvalidAfterReboot>false</tt:InvalidAfterReboot>
- <tt:Timeout>P1Y</tt:Timeout>
- </trt:MediaUri>
- </trt:GetStreamUriResponse>
3)接收返回值(保证返回代码是200),解析XML,获取RTSP的流地址。
(3)获取视频流
android下的实现方式
1)实例化Socket对象
2)根据RTSP的协议封一个包
- DESCRIBE
- RTSP/1.0
- CSeq:0
- Accept:application/sdp
- Authorization:Basic (admin:12345的base64编码)
3)解析RTSP流
PS:
实际上,在Android中,我们只要获得IPCAM的rtsp地址之后,有几种方法可以直接在SurfaceView上播放视频了:1.JavaCV;2.VLC;3.支持硬解码的MediaPlayer和VideoPlayer;(4)Vitamio
最后说一下第二步中SOAP的实现中,从开始设置ipcam的包中,需要在包头中加入ipcam的鉴权。官方给的公式是:
其中base64编码容易实现,nonce只是一个16位随机数即可。Sha-1在JAVA中的实现方式是:
MessageDigest md = MessageDigest.getInstance("SHA-1");
示例代码:
- public String getPasswordEncode(String nonce, String password, String date) {
- try {
- MessageDigest md = MessageDigest.getInstance("SHA-1");
- byte[] b1 = Base64.decode(nonce.getBytes(), Base64.DEFAULT);
- byte[] b2 = date.getBytes(); // "2013-09-17T09:13:35Z";
- byte[] b3 = password.getBytes();
- byte[] b4 = new byte[b1.length + b2.length + b3.length];
- md.update(b1, 0, b1.length);
- md.update(b2, 0, b2.length);
- md.update(b3, 0, b3.length);
- b4 = md.digest();
- String result = new String(Base64.encode(b4, Base64.DEFAULT));
- return result.replace("\n", "");
- } catch (Exception e) {
- e.printStackTrace();
- return "";
- }
- }
- public String getNonce() {
- String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- Random random = new Random();
- StringBuffer sb = new StringBuffer();
- for (int i = 0; i < 24; i++) {
- int number = random.nextInt(base.length());
- sb.append(base.charAt(number));
- }
- return sb.toString();
- }
- private void createAuthString() {
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",
- Locale.CHINA);
- mCreated = df.format(new Date());
- mNonce = getNonce();
- mAuthPwd = getPasswordEncode(mNonce, mCamera.password, mCreated);
- }
Onvif协议及其在Android下的实现的更多相关文章
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(一)使用Onvif协议进行设备发现以及指定设备信息探测
背景分析 众所周知,EasyNVR不拘泥.不受限于摄像机的品牌厂商及其配套平台,只要是网络监控摄像机IPC.硬盘录像机NVR.且设备支持标准的RTSP/Onvif协议,都可以接入实时视频流进入Easy ...
- android下tcpdump抓包
tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解.android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传 ...
- ONVIF协议学习笔记
一.理解 1.1 技术理解 ONVIF = 服务端 + 客户端 =(Web Services + RTSP)+ 客户端 = ((WSDL + SOAP) + RTSP) + 客户端 WSDL是服务端用 ...
- onvif 协议
1.ONVIF 协议解读 https://www.onvif.org 一.什么是ONVIF? 1.1形成 2008年5月,由安讯士(AXIS)联合博世(BOSCH)及索尼(SONY)公司三方宣布携手共 ...
- EasyNVR RTSP摄像机转HLS直播服务器中使用Onvif协议控制预置位
EasyNVR支持预置位控制,包括转到指定预置位,设置指定预置位,删除指定预置位 预置位在安防领域有较为普遍的应用,可以进行很多既定位置的跳转,很方便 之前我们说过如何用Onvif协议进行设备的发现, ...
- android下JNI开发
android下JNI开发 what 什么是JNI JNI java native interface native本地 java本地接口 通过JNI可以实现java和本地代码之间相互调用 jni可以 ...
- 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案中使用Onvif协议控制视频设备预置位转动
EasyNVR支持预置位控制,包括转到指定预置位,设置指定预置位,删除指定预置位.预置位在安防领域有较为普遍的应用,可以进行很多既定位置的跳转,很方便.之前我们说过如何用Onvif协议进行设备的发现, ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(三)使用Onvif协议进行设备PTZ云台控制
背景分析 熟悉EasyNVR产品的盆友们应该都知道,EasyNVR主要完成的是RTSP视频流到RTMP/HLS/Flv的转码,并提供了一套api和一个可视化管理平台来便于调用.同时支持ONVIF协议进 ...
随机推荐
- Mac中设置网络优先级
- 个人作业-Alpha项目测试—luomei1547
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1/ 这个作业要求在哪里 https://edu.cnbl ...
- 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】
问题 C: 磨刀 时间限制: 1 Sec 内存限制: 128 MB提交: 190 解决: 39[提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃下进 ...
- [Visual Studio] 一些VS2013的使用技巧
作者:h46incon的Blog 1. Peek View 可以在不新建TAB的情况下快速查看.编辑一个函数的代码. 用法:在光标移至某个函数下,按下alt+F12. 然后在Peek窗口里可以继续按a ...
- IP协议首部结构介绍
当提交给数据链路层进行传送时,一个 I P分片或一个很小的无需分片的 I P数据报称为分组.数据链路层在分组前面加上它自己的首部,并发送得到的帧.I P只考虑它自己加上的 I P首部,对报文本身既不检 ...
- MongoDB同步机制
复制 在此页 冗余和数据可用性 在MongoDB中复制 异步复制 自动故障转移 读取操作 交易次数 更改流 附加的功能 甲副本集 MongoDB中是一组mongod其保持相同的数据集的过程.副本集提供 ...
- OPT
http://cdn.imgtec.com/sdk-documentation/PowerVR.Performance+Recommendations.pdf 宝贝 https://developer ...
- 一个有趣的 SQL 查询
来源:站长资讯 一个朋友有这样一个SQL查询需求: 有一个登录表(tmp_test),包含用户ID(uid)和登录时间(login_time).表结构如下: ********************* ...
- 为什么Object.prototype在Function的原型链上与Function.prototype在Object的原型链上都为true
关于javascript的原型链有一个问题我一直很疑惑:为什么 Function instanceof Object 与 Object instanceof Function都为true呢? Func ...
- vue编辑、新增弹框(引用外部页面)
vue编辑.新增弹框(引用外部页面) 2018年06月15日 09:37:20 会飞的猪biubiu 阅读数 10265 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...