如何使用onvif ptz wsdl

时间:2015-02-06 16:00:44

标签: c# soap wsdl ip-camera onvif

我正在尝试使用http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl文件控制PTZ摄像机。

我可以毫无问题地使用GotoPreset函数,但ContinuousMove函数会抛出ProtocolException。

this指南的第77页显示了如何使用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。但是当我向wsdl添加服务引用并将ver20更改为ver10时,我收到一条消息,指出添加wsdl失败,因为它包含无法解析的链接。此外,当我将ver10网址(http://www.onvif.org/onvif/ver10/ptz/wsdl/ptz.wsdl)粘贴到我的网络浏览器中时,它会显示一个xml而不是一个wsdl。

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

1 个答案:

答案 0 :(得分:2)

我找到了解决方案。

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

现在调用ContinuousMove如下所示:

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

其中字符串中的数字代表PTZ操作应该持续的秒数。

希望它有所帮助。