Как аутентифицировать камеру AXIS с помощью ONVIF

У меня 3 камеры ONVIF (Bosch, Pansonic и AXIS). Я нахожу камеры с помощью WS-Discovery и могу получать информацию с камер с помощью GetDeviceInformation. Моя проблема в том, что камера AXIS возвращает (400) Bad Request, когда я пытаюсь получить от нее информацию, две другие работают как шарм.

Я установил диспетчер устройств ONVIF из SourceForge. Если я введу данные для входа в программу, я смогу транслировать видео в реальном времени с камеры AXIS. Если я не введу учетные данные для входа, я смогу найти камеру, но не буду транслировать видео. На основании этого я сделал вывод, что камера настроена правильно.

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

Мой код выглядит так

private void CustomBinding2()
{
        try
        {
            const string SERVICE_ADDRESS_DIRECT = "http://192.168.1.72/onvif/device_service"; //400 bad request
            const string USERNAME = "cbk";
            const string PASSWORD = "12";

            HttpTransportBindingElement httpTransportBindingElement = new HttpTransportBindingElement();
            httpTransportBindingElement.MaxReceivedMessageSize = Int32.MaxValue;
            httpTransportBindingElement.KeepAliveEnabled = false;
            httpTransportBindingElement.MaxBufferSize = Int32.MaxValue;
            httpTransportBindingElement.ProxyAddress = null;
            httpTransportBindingElement.BypassProxyOnLocal = true;
            httpTransportBindingElement.UseDefaultWebProxy = false;
            httpTransportBindingElement.TransferMode = TransferMode.StreamedResponse;
            httpTransportBindingElement.AuthenticationScheme = AuthenticationSchemes.Basic;

            TextMessageEncodingBindingElement messegeElement = new TextMessageEncodingBindingElement();
            messegeElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);

            CustomBinding binding = new CustomBinding(messegeElement, httpTransportBindingElement);
            binding.CloseTimeout = TimeSpan.FromSeconds(30.0);
            binding.OpenTimeout = TimeSpan.FromSeconds(30.0);
            binding.SendTimeout = TimeSpan.FromMinutes(10.0);
            binding.ReceiveTimeout = TimeSpan.FromMinutes(3.0);

            EndpointAddress serviceAddress = new EndpointAddress(SERVICE_ADDRESS_DIRECT);

            ChannelFactory<Device> channelFactory = new ChannelFactory<Device>(binding, serviceAddress);
            channelFactory.Credentials.UserName.UserName = USERNAME;
            channelFactory.Credentials.UserName.Password = PASSWORD;

            Device channel = channelFactory.CreateChannel();

            string model, firmwareVersion, serialNumber, hardwareId;
            channel.GetDeviceInformation(out model, out firmwareVersion, out serialNumber, out hardwareId);
            MessageBox.Show(string.Format("Model: {0}", model));
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);
        }
}

person kellelein    schedule 16.05.2013    source источник


Ответы (1)


Решил проблему ...

Одна из вещей, которая обманывала меня больше всего, заключалась в том, что камера AXIS и клиент (ПК) должны были быть синхронными по времени в пределах + -5 секунд. Если я изменю время ПК, я просто получу 400 неверных запросов. Если время совпадает, все работает !!!

            DateTime UTCTime = DateTime.UtcNow;

            tbInfo.AppendText(string.Format("Client Local Time: {0}\n", DateTime.Now.ToString("HH:mm:ss")));
            tbInfo.AppendText(string.Format("Client UTC Time: {0}\n", UTCTime.ToString("HH:mm:ss")));
            tbInfo.AppendText("\n\n");

            HttpTransportBindingElement httpTransport = new HttpTransportBindingElement();

            TransportSecurityBindingElement transportSecurity = new TransportSecurityBindingElement();
            transportSecurity.EndpointSupportingTokenParameters.SignedEncrypted.Add(new UsernameTokenParameters());
            transportSecurity.AllowInsecureTransport = true;
            transportSecurity.IncludeTimestamp = false;

            TextMessageEncodingBindingElement textMessageEncoding = new TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8);

            CustomBinding binding = new CustomBinding(transportSecurity, textMessageEncoding, httpTransport);

            EndpointAddress serviceAddress = new EndpointAddress(addressDirect);
            ChannelFactory<Device> channelFactory = new ChannelFactory<Device>(binding, serviceAddress);

            UsernameClientCredentials credentials = new UsernameClientCredentials(new UsernameInfo(username, password));

            channelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
            channelFactory.Endpoint.Behaviors.Add(credentials);

            Device channel = channelFactory.CreateChannel();

            var unitTime = channel.GetSystemDateAndTime(new GetSystemDateAndTimeRequest());
            tbInfo.AppendText(string.Format("Camera Local Time: {0}:{1}:{2}\n", unitTime.SystemDateAndTime.LocalDateTime.Time.Hour, unitTime.SystemDateAndTime.LocalDateTime.Time.Minute, unitTime.SystemDateAndTime.LocalDateTime.Time.Second));
            tbInfo.AppendText(string.Format("Camera UTC Time: {0}:{1}:{2}\n", unitTime.SystemDateAndTime.UTCDateTime.Time.Hour, unitTime.SystemDateAndTime.UTCDateTime.Time.Minute, unitTime.SystemDateAndTime.UTCDateTime.Time.Second));

            var info = channel.GetDeviceInformation(new GetDeviceInformationRequest());
            MessageBox.Show(string.Format("Model: {0}", info.Model));
person kellelein    schedule 24.05.2013
comment
не могли бы вы предоставить дополнительную информацию о классе UsernameTokenParameters, используемом в этом фрагменте кода? Я не могу найти, откуда этот класс ... - person rortegax2; 10.06.2019