首页 > 解决方案 > C# :OnvifClientPTZ

问题描述

我正在尝试使用 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 选项。

有谁知道到底是什么问题?我该如何解决它,拜托!

标签: c#camerazoomingpanonvif

解决方案


并非每个 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


推荐阅读