【问题标题】:C# :OnvifClientPTZC# :OnvifClientPTZ
【发布时间】:2020-02-13 15:30:57
【问题描述】:

我正在尝试使用 ONVIF 开发控制 IP 摄像机。但是我在连接 ONVIF 的 PTZ 服务器时遇到了一点问题。 这是我的代码:

 private void PTZTest(DeviceClient client, double deviceTimeOffset, string ip, int port)
   {
        // Create Media object
        string xaddr = string.Format("http://{0}/onvif/device_service", txtIP.Text); 
        MediaClient mediaService = OnvifServices.GetOnvifMediaClient(xaddr, deviceTimeOffset, txtUser.Text, txtPassword.Text);

        // Create PTZ object
        string xaddr2 = string.Format("http://{0}/onvif/ptz_service",txtIP.Text);
        PTZClient ptzService = OnvifServices.GetOnvifPTZClient(xaddr2, deviceTimeOffset, txtUser.Text, txtPassword.Text);
// Get target profile
        Profile[] mediaProfiles = mediaService.GetProfiles();
        Profile mediaProfile = mediaService.GetProfile(mediaProfiles[0].token);
        PTZConfigurationOptions ptzConfigurationOptions = ptzService.GetConfigurationOptions(mediaProfile.PTZConfiguration.token);

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

        velocity.Zoom = new PTZ.Vector1D() { x = speed * ptzConfigurationOptions.Spaces.ContinuousZoomVelocitySpace[0].XRange.Max };

当我在该行设置断点时 PTZConfigurationOptions ptzConfigurationOptions = ptzService.GetConfigurationOptions(mediaProfile.PTZConfiguration.token);我收到了这个错误信息:

没有监听端点 http://192.168.123.2/onvif/ptz_service 可以接受该消息。 这通常是由于 SOAP 地址或操作不正确造成的。如果存在, 有关详细信息,请参阅 InnerException 元素。

但我不明白为什么我可以获得 PTZ 服务列表和有关 mediaService 的所有信息,但我无法获得 ptzconfiguration 选项。

有谁知道到底是什么问题?请问我该如何解决!

【问题讨论】:

  • 我需要从响应中查看状态码。使用像 wireshark 或 fiddler 这样的嗅探器来捕获请求和响应。如果您有一个工作应用程序,那么将第一个工作请求与非工作请求进行比较。然后使 c# 非工作请求看起来像工作请求。正常的故障状态代码是 400s 或 500s 错误。

标签: c# camera zooming pan onvif


【解决方案1】:

并非每个 onvif 设备都会在同一端点上托管其 PTZ 服务。通常使用的方法是从 DeviceService 查询 GetServices/GetCapabilities 调用。这是唯一通常始终具有相同 URL 的服务 - “http://ip/onvif/device_service

因此使用方法是(在伪代码中)

var devService =  OnvifServices.GetOnvifDeviceService("http://ip/onvif/device_service)
var services = devService.GetServices() or devService.GetCapabilities()
var ptzServiceInfo = services.Where(x => x.Name.Contains("Ptz));

var ptzServiceInfo = OnvifServices.GetPtzService(ptzServiceInfo.Url);

您不使用 device_server 进行任何 ptz_service 调用,您只需使用它来查找设备服务的正确 URL 如果您进行 GetService 调用,响应将包含类似

<tds:Service> <tds:Namespace>onvif.org/ver20/ptz/wsdl</tds:Namespace> <tds:XAddr>ip/onvif/ptz</tds:XAddr> </tds:Service> 

详情请见onvif.org/specs/core/ONVIF-Core-Specification-v250.pdf

【讨论】:

  • 感谢您的信息。但是,如果我使用 来尝试获取 ptzConfigurationOptions,我会收到 (400) 错误请求。这意味着 ptzService 的正确 IP 是 192.168.123.2/onvif/ptz_service>,不是吗?请多指教,万分感谢
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多