gpt4 book ai didi

c# - 如何使用 ONVIF 验证 AXIS 摄像机

转载 作者:行者123 更新时间:2023-11-30 20:57:45 29 4
gpt4 key购买 nike

我有 3 台 ONVIF 摄像机(博世、松下和安讯士)。我使用 WS-Discovery 查找摄像头,并且可以使用 GetDeviceInformation 从摄像头获取信息。我的问题是,当我尝试从中获取信息时,AXIS 相机返回 (400) Bad Request,其他两个的工作就像一个魅力。

我已经从 SourceForge 安装了 ONVIF 设备管理器。如果我在程序中输入登录凭据,我可以从 AXIS 摄像机流式传输实时视频。如果我不输入任何登录凭据,我可以找到摄像头,但无法播放任何视频。因此,基于此我得出结论,相机配置正确。

我认为它与绑定(bind)上的登录凭据有关,但无法弄清楚哪里出了问题。

我的代码是这样的

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);
}
}

最佳答案

解决了问题...

最让我受骗的事情之一是 AXIS 摄像机和客户端 (PC) 必须在 +-5 秒内进行时间同步。如果我更改 PC 时间,我只会收到 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));

关于c# - 如何使用 ONVIF 验证 AXIS 摄像机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16584139/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com