2015-02-06 95 views
3

我试图用http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl文件控制PTZ摄像机。如何使用onvif ptz wsdl

我可以使用没有问题的GotoPreset函数,但ContinuousMove函数抛出ProtocolException。 “指南”显示了如何使用ConinuousMove函数的示例。

按照这份指南为我提供了下面的代码:

 OnvifMediaClient.Profile[] profs = this.mediaClient.GetProfiles(); 
     OnvifMediaClient.Profile profile = mediaClient.GetProfile(profs[0].token); 

     OnvifPTZ.PTZConfigurationOptions options = PtzClient.GetConfigurationOptions(profile.token); 

     OnvifPTZ.PTZSpeed velocity = new OnvifPTZ.PTZSpeed(); 

     velocity.PanTilt = new OnvifPTZ.Vector2D(); 
     velocity.Zoom = new OnvifPTZ.Vector1D(); 

     velocity.PanTilt.x = options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Max; 
     velocity.PanTilt.y = options.Spaces.ContinuousPanTiltVelocitySpace[0].YRange.Max; 
     velocity.PanTilt.space = options.Spaces.ContinuousPanTiltVelocitySpace[0].URI; 
     velocity.Zoom.x = options.Spaces.ContinuousZoomVelocitySpace[0].XRange.Max; 
     velocity.Zoom.space = options.Spaces.ContinuousZoomVelocitySpace[0].URI; 

     PtzClient.ContinuousMove(profile.token, velocity, "1000"); 

     Thread.Sleep(2000); 

     PtzClient.Stop(profile.token, true, true); 

但也有与导向在代码中的一些差异,例如实际ContinuousMove功能需要在我的代码3个参数,而不是2中导游。额外的参数是一个超时,所以我认为这不会有太大的差别,但也许其他一些事情是不同的,导致我的代码失败。

我想知道this这个问题,在那个人说的PTZ摄像机不支持ver20的问题。但是,当我将ver20的服务引用添加到wsdl并将其更改为ver10时,我收到一条消息,指出添加wsdl失败,因为它包含无法解析的链接。另外,当我粘贴ver10网址(http://www.onvif.org/onvif/ver10/ptz/wsdl/ptz.wsdl)在我的浏览器时,它显示了一个xml而不是wsdl。

如何使用正确的wsdl文件,如果我没有使用它或什么可以解决我当前的设置中的行为?

回答

2

我找到了解决方案。

原来我误解了PtzClient.ContunuousMove中的超时参数。在之前的wsdl版本(版本10)中,每当您希望当前的PTZ操作停止时,您必须调用停止功能。在wsdl的ver20中,PTZ功能(除非调用Stop功能)将持续与timeout参数中指定的一样长的时间。我认为这是一个响应超时或什么,但事实并非如此。

调用ContinuousMove现在看起来是这样的:

PtzClient.ContinuousMove(profile.token, velocity, "PT1S"); 

凡字符串中的数字表示的秒云台动作应该持续量。

希望它可以帮助别人。