C#: OnvifClientPTZ - PullRequest
       96

C#: OnvifClientPTZ

0 голосов
/ 13 февраля 2020

Я пытаюсь разработать контрольную IP-камеру с ONVIF. Но у меня небольшая проблема с подключением PTZ-сервера ONVIF. Вот мой код:

 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 вариант.

Кто-нибудь знает, в чем конкретно проблема? И как мне это решить, пожалуйста!

1 Ответ

0 голосов
/ 14 февраля 2020

Не каждое устройство onvif будет размещать свою службу PTZ в одной и той же конечной точке. Обычно подход к использованию заключается в запросе вызовов GetServices / GetCapabilities из DeviceService. Это единственная служба, которая обычно всегда имеет один и тот же 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 для получения более подробной информации

...