нарушение протокола асинхронного перемещения и / или потеря соединения ONVIF - PullRequest
0 голосов
/ 28 июня 2018

Справочная информация:

В настоящее время я создаю приложение для формы c # windows, используя Visual Studio 2017 и используя ONVIF .wsdl (OnvifMedia10 и OnvifPTZService).

У меня есть доступ администратора к целевой камере.

Я получил профиль от созданного медиа-клиента:

var mediaEndPointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/media");
var mediaEncoding = new TextMessageEncodingBindingElement
{
     MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
};
var mediaBinding = new HttpTransportBindingElement
{
     AuthenticationScheme = AuthenticationSchemes.Digest
};
var mediaCustomBinding = new CustomBinding(mediaEncoding, mediaBinding);
var mediaPasswordDigestBehavior = new PasswordDigestBehavior(userName, password);
mediaClient = new MediaClient(mediaCustomBinding, mediaEndPointAddress);
mediaClient.Endpoint.EndpointBehaviors.Add(mediaPasswordDigestBehavior);

var profs = mediaClient.GetProfiles();

profile = mediaClient.GetProfile(profs[0].token);

PasswordDigestBehavior является частью некоторого кода, который я нашел по этой ссылке .

Я использовал ту же методологию для получения ptzClient и его конфигураций:

...
var ptzEndpointAddress = new EndpointAddress($"http://{cameraAddress}/onvif/ptz");
ptzClient = new PTZClient(commonCustomBinding, ptzEndpointAddress);
ptzClient.Endpoint.EndpointBehaviors.Add(commonPasswordDigestBehavior);
var configs = ptzClient.GetConfigurations();
options = ptzClient.GetConfigurationOptions(configs[0].token);

Затем я создал переменную PTZSpeed, чтобы сохранить движение камеры:

velocity = new OnvifPTZService.PTZSpeed();
velocity.PanTilt = new OnvifPTZService.Vector2D();
velocity.Zoom = new OnvifPTZService.Vector1D();

Мой вопрос:

Когда я хочу повернуть целевую камеру, я использую какую-то функцию PanLeft():

public void PanLeft()
    {
        if(Initialised && CanPanTilt)
        {
            velocity.PanTilt.x = options.Spaces.ContinuousPanTiltVelocitySpace[0].XRange.Min;
            velocity.PanTilt.y = 0;
            ptzClient.ContinuousMoveAsync(profile.token, velocity, "PT5S");
        }
    }

И чтобы остановить камеру, я изменяю velocity.PanTilt.x и velocity.PanTilt.y на ноль, прежде чем отправлять другой запрос на асинхронное перемещение.

После пары движений / остановок я продолжаю терять соединение с моей камерой ...

Интересно, потому что я делаю слишком много асинхронных запросов одновременно или что-то в этом роде ...

Сначала я думал, что проблема была в моей сети, так как я подключался к камере через Wi-Fi, но я попытался подключить ее напрямую с помощью кабеля Ethernet, и это ничего не изменило ...

Я хочу знать, в порядке ли мой способ перемещения, если есть лучший способ сделать это, не ломая мое приложение и не получая ошибок в моем заголовке (нарушение протокола и т. Д.) ...

Я также использую приложение OnvifDeviceManager , чтобы вести себя через разработку этого проекта, чтобы увидеть, что я могу и не могу сделать, но кажется, что даже это приложение разрывает / теряет соединение с камерой после пара действий PTZ ...

1 Ответ

0 голосов
/ 09 июля 2018

Я думаю, проблема в том, что слишком много запросов на отправку отправлено / получено одновременно ...

Но я только что узнал, что есть функция ptzClient.Stop(profile.token, true, false), которая делает именно то, что я хочу ...

Останавливает панорамирование / наклон данного ptzClient, если первый логический параметр имеет значение true, и останавливает масштабирование, если второй логический оператор имеет значение true.

При использовании этой команды мое приложение работает дольше.

Проблема все еще существует, но она встречается реже!

...