好久没有写博客,今天将前段时间做的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。

  1. <GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
  2. <StreamSetup>
  3. <Stream xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast</Stream>
  4. <Transport xmlns="http://www.onvif.org/ver10/schema">
  5. <Protocol>UDP</Protocol>
  6. </Transport>
  7. </StreamSetup>
  8. <ProfileToken>profile-0_0</ProfileToken>
  9. </GetStreamUri>

IP Camera在接收到该调用后会返回如下:

  1. <trt:GetStreamUriResponse>
  2. <trt:MediaUri>
  3. <tt:Uri>rtsp://192.168.0.105/live1.sdp</tt:Uri>
  4. <tt:InvalidAfterConnect>false</tt:InvalidAfterConnect>
  5. <tt:InvalidAfterReboot>false</tt:InvalidAfterReboot>
  6. <tt:Timeout>P1Y</tt:Timeout>
  7. </trt:MediaUri>
  8. </trt:GetStreamUriResponse>

3)接收返回值(保证返回代码是200),解析XML,获取RTSP的流地址。

(3)获取视频流


 

android下的实现方式
1)实例化Socket对象
2)根据RTSP的协议封一个包

  1. DESCRIBE
  2. RTSP/1.0
  3. CSeq:0
  4. Accept:application/sdp
  5. 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");
示例代码:

    1. public String getPasswordEncode(String nonce, String password, String date) {
    2. try {
    3. MessageDigest md = MessageDigest.getInstance("SHA-1");
    4. byte[] b1 = Base64.decode(nonce.getBytes(), Base64.DEFAULT);
    5. byte[] b2 = date.getBytes(); // "2013-09-17T09:13:35Z";
    6. byte[] b3 = password.getBytes();
    7. byte[] b4 = new byte[b1.length + b2.length + b3.length];
    8. md.update(b1, 0, b1.length);
    9. md.update(b2, 0, b2.length);
    10. md.update(b3, 0, b3.length);
    11. b4 = md.digest();
    12. String result = new String(Base64.encode(b4, Base64.DEFAULT));
    13. return result.replace("\n", "");
    14. } catch (Exception e) {
    15. e.printStackTrace();
    16. return "";
    17. }
    18. }
    19. public String getNonce() {
    20. String base = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    21. Random random = new Random();
    22. StringBuffer sb = new StringBuffer();
    23. for (int i = 0; i < 24; i++) {
    24. int number = random.nextInt(base.length());
    25. sb.append(base.charAt(number));
    26. }
    27. return sb.toString();
    28. }
    29. private void createAuthString() {
    30. SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'",
    31. Locale.CHINA);
    32. mCreated = df.format(new Date());
    33. mNonce = getNonce();
    34. mAuthPwd = getPasswordEncode(mNonce, mCamera.password, mCreated);
    35. }  

      http://blog.csdn.net/yanjiee/article/details/18809107

最新文章

  1. 使用github的使用,利用git shell命令行模式进行操作
  2. xcode中使用正则表达式来搜索替换代码
  3. java_Excel 导出
  4. MyBatis学习总结(六)——调用存储过程
  5. UVALive 6092 Catching Shade in Flatland --枚举+几何计算
  6. Java中的AWT进阶
  7. TCP释放连接的四次挥手过程
  8. Codevs 1684 垃圾陷阱
  9. 卸载安装失败的sqlserver2008 R2
  10. IAR编译ZStack-CC2530为可下载运行的HEX文件的正确配置
  11. LabView 快捷键
  12. 【菜鸟学习Linux】-第三章- Linux环境搭建-使用VMware9安装Ubuntu 12.04系统
  13. android Handler vs Timer
  14. 【转载】Sublime Text 3065 Keygen and Patcher
  15. Eclipse集成spket插件_Ext-5.1.0
  16. phper的Go之旅(-)--书写前言
  17. jdk源码阅读笔记-Integer
  18. orcal - 增删改
  19. Windows10下安装Maven以及Eclipse安装Maven插件 + 创建Maven项目
  20. seleium 鼠标悬停事件

热门文章

  1. log4j日志properties配置
  2. keil 选项卡设置
  3. I2C总线、设备、驱动
  4. oss打包下载
  5. C#中[STAThread]的作用
  6. jmeter非GUI的运行命令
  7. linux实操_shell判断语句
  8. WCF错误处理
  9. redis 订阅&amp;发布(转载)
  10. python-windows安装相关问题