Android Onvif协议获取支持Onvif协议的流播放地址
以下为上份工作 在android机顶盒内发现局域网内支持Onvif协议的摄像头地址。也是网络找的demo 修改后实现。
在此备份以备不时之需。
ONVIF协议的本质就是通过发送xml格式的文件 包含soap 以及指定的标签以实现进行某种操作的目的。
第一步是发现设备,通过发送搜索广播包到局域网的广播地址,等待支持onvif协议的设备回复报文。需要从报文中提取uuid和onvif设备的主地址。
CameraFinder.Java 实现了上述第一步功能。
发送的xml数据为该文件中DISCOVERY_PROBE_TDS字符串。因为eclipse中””为String开始结束符 查看xml格式的数据时,需把\” 中的转义字符\去掉
下边代码为上述发送广播和接收回复的代码实现。
第二步,第一步获取到的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