Справочная информация:
В настоящее время я создаю приложение для формы 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 ...