从研发之初,EasyCVR安防协议视频综合管理系统就是作为一个“全能型”平台上线,支持各种私有协议接入的同时,也支持onvif探测。EasyCVR使用Onvif的优势就在终端用户和集成商可以使用不同制造商的技术及解决方案,该协议的支持给EasyCVR带来了更广泛的适用性。
如果在局域网内使用EasyCVR,可以通过Onvif探测的方式发现可用的摄像头,直接获取流地址,操作简单方便。但是在一些特定场景下,无法成功探测或者获取流地址,但是直接使用onvif device manager 能发现设备。
通过抓包调试定位问题,发现抓包中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控制摄像头云台,该功能可以在测试中使用,欢迎大家测试。