Android Onvif协议获取支持Onvif协议的流播放地址

以下为上份工作 在android机顶盒内发现局域网内支持Onvif协议的摄像头地址。也是网络找的demo 修改后实现。

在此备份以备不时之需。

ONVIF协议的本质就是通过发送xml格式的文件 包含soap 以及指定的标签以实现进行某种操作的目的。

第一步是发现设备,通过发送搜索广播包到局域网的广播地址,等待支持onvif协议的设备回复报文。需要从报文中提取uuid和onvif设备的主地址。

CameraFinder.Java  实现了上述第一步功能。

发送的xml数据为该文件中DISCOVERY_PROBE_TDS字符串。因为eclipse中””为String开始结束符 查看xml格式的数据时,需把\” 中的转义字符\去掉

Android Onvif协议获取支持Onvif协议的流播放地址

下边代码为上述发送广播和接收回复的代码实现。

Android Onvif协议获取支持Onvif协议的流播放地址

第二步,第一步获取到的uuid后续区分多个设备使用,android提供的UUID类不能直接转化 代码中把uuid定义为String 、主服务地址供该步请求使用。

HttpSoap.java中代码实现跟摄像头后续交互请求知道获取播放URI。以下多次请求均为HTTP  POST请求方式 发送的数据均在该文件中定义的String字符串,用户帐号和密码均在发送数据之前拼接到String字符串中。按流程分为以下几步:

1:获取摄像头所有功能列表

请求地址:第一步获取到的主服务器地址

 http://10.7.2.196:80/onvif/device_service

发送数据:GET_CAPABILITIES

获取到数据中需要解析得到的参数:media分类的服务地址

http://10.7.2.196:80/onvif/media_service

 

2:获取播放流地址有几个媒体源(例如该摄像头支持720p和1080p的就会提供两个Profiles)

请求地址:media分类的服务地址

发送数据:GET_PROFILES  

获取到数据中需要解析得到的参数:token 

该摄像头有两个媒体源 2个token分别为profile_1 和profile_0,后续访问媒体的信息需指定访问的是哪个token

 

3:获取读取RTSP的配置信息(通过token区分,该步如果不在机顶盒播放的话可省略)

请求地址:media分类的服务地址

发送数据:GET_PROFILE

获取到数据中需要解析得到的参数:Width   Height   FrameRateLimit 

以profile_0为例获取到的为1280   720  25

 

4:获取指定播放源的播放URI(通过token区分)

请求地址:media分类的服务地址

发送数据:GET_URI_BODY

获取到数据中需要解析得到的参数:URI

rtsp://10.7.13.196:554/stream1