EasyCVR安防协议视频综合管理系统在研发初期就以"全能型"平台为目标进行设计,支持各种私有协议接入,并且提供了Onvif探测功能。采用Onvif协议的优势在于,终端用户和集成商可以选择不同制造商的技术和解决方案。该协议的支持大大拓展了EasyCVR的适用范围,使其具备更广泛的应用性。
在局域网内使用EasyCVR时,可以借助Onvif探测功能轻松发现可用的摄像头并直接获取流地址,操作简便方便。然而,在特定场景下可能会遇到探测失败或无法获取流地址的情况,但是使用Onvif设备管理器却能够成功发现设备。
经过抓包调试来定位问题,发现在GetStreamUrl中的参数与EasyCVR中的内容存在差异。在GetStreamUrl中,参数为Profile Token=Profile_1,并且成功获取到地址时需要传递此参数。然而在EasyCVR中,传输的参数为Profile Token=Profile_101,当返回101时表示获取地址失败,导致无法进行Onvif探测。
以下是对Onvif Device Manager抓包结果的改写。要解决这个问题,我们只需要在EasyCVR中将101更改为1,这样就可以成功获取流地址了。下面是相应的参考代码:
fmt.Println("call GetStreamUri")
m_media_url_req := media.GetStreamUri{
XMLName:"http://www.onvif.org/ver10/media/wsdl",
StreamSetup:onvif2.StreamSetup{
Stream: "RTP-Unicast",
Transport: onvif2.Transport{
Protocol: "RTSP",
Tunnel: nil,
},
},
ProfileToken: "Profile_1",
}
{
m_media_url_resp, err := dev.CallMethod(m_media_url_req)
if err == nil {
//fmt.Println("resp:", readResponse(m_media_url_resp))
bs, _ := ioutil.ReadAll(m_media_url_resp.Body)
log.Printf("output %+v %s", m_media_url_resp.StatusCode, bs)
//{
// var methodStruct interface{}
// methodStruct,e :=getMediaStructByName("GetProfiles")
// if e == nil{
// str := string(bs)
// resp, err := xmlAnalize(methodStruct, &str)
// if err != nil {
// return
// }
//
// log.Println(resp)
// }
//}
}
}
目前在TSINGSEE青犀视频开发的多个视频平台项目当中,EasyNVR和EasyCVR在支持RTSP协议的同时已经支持了Onvif探测,支持通过Onvif控制摄像头云台,该功能可以在测试中使用,欢迎大家测试。
标签:Profile,视频,url,media,resp,EasyCVR,探测,Onvif From: https://blog.51cto.com/u_16225501/7324854