从研发初期开始,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控制摄像头云台,该功能可以在测试中使用,欢迎大家测试。
文章讲述了EasyCVR安防系统如何支持Onvif协议,包括其在局域网内的应用与遇到的问题。重点介绍了通过抓包调试发现GetStreamUrl中的ProfileToken参数不匹配导致的流地址获取失败,以及提供的解决方案。

被折叠的 条评论
为什么被折叠?



