【问题标题】:ONVIF Authentication in .NET 4.0 with Visual Studios 2010.NET 4.0 中的 ONVIF 身份验证与 Visual Studios 2010
【发布时间】:2011-04-12 16:02:22
【问题描述】:

我的任务是尝试与大楼中的 ONVIF 摄像头建立通信,最终升级公司的 domotic 解决方案,以自动识别 ONVIF 摄像头并能够设置它们并使用它们的服务。

我已经能够通过这种方式收集一些基本信息,例如它的型号、MAC 地址和固件版本:

    EndpointAddress endPointAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service");
    CustomBinding bind = new CustomBinding("DeviceBinding");
    DeviceClient temp = new DeviceClient(bind, endPointAddress);
    String[] arrayString = new String[4];
    String res = temp.GetDeviceInformation(out arrayString[0], out arrayString[1], out arrayString[2], out  arrayString[3]);
    MessageBox.Show("Model " + arrayString[0] + ", FirmwareVersion " + arrayString[1] + ", SerialNumber " + arrayString[2] + ", HardwareId " + arrayString[3]);

我的 app.config 文件中有 customBinding 的这个 xml 规范:

  <customBinding>
    <binding name="DeviceBinding">
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
          messageVersion="Soap12" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>
      <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
          maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
          bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
          keepAliveEnabled="false" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
          realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
          useDefaultWebProxy="true" />
    </binding>
  </customBinding>

我的问题是,我无法更深入地了解我可以向相机询问的内容。我尝试任何操作都会收到“400 - 错误请求”错误,根据我所阅读的内容,这是因为我需要处理相机的身份验证。

问题是,我发现的关于 WS-Security(似乎被 ONVIF 使用)的所有内容都非常非常混乱,有很多不同的解决方案,但没有什么对我真正有用。例如,this post here 听起来很简单,但是我尝试创建一个 UserNameSecurityToken 并且仍然收到 400 错误请求错误。因为不知道是不是因为我的Token系统写错了,是不是因为相机不支持我尝试做的事情。

我已经尝试过 WSHttpBinding 并将其置于用户名模式,但使用 WSHttpBinding 会破坏我能够创建的基本信息发现(出现 MustUnderstand 错误)...

对我有什么建议吗?简单的 WS-Security/.NET、C#/ONVIF 教程,什么都可以接受。

【问题讨论】:

  • 这是一个旁注......事实上,您似乎表明您是 C# 新手并且您能够做到这一点,这令人印象深刻。
  • 嗯,我做 JAVA 已经很多年了,最后肯定比几年前更容易,现在你通常可以在互联网上找到小代码 sn-ps

标签: c# .net authentication ws-security onvif


【解决方案1】:

好的:

EndpointAddress serviceAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service");

HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();

httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;

var messageElement = new TextMessageEncodingBindingElement();

messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);

CustomBinding bind = new CustomBinding(messageElement, httpBinding);

// Add our custom behavior - this require the Microsoft WSE 3.0 SDK

PasswordDigestBehavior behavior = new PasswordDigestBehavior(CameraASCIIStringLogin, CameraASCIIStringPassword);

DeviceClient client = new DeviceClient(bind, serviceAddress);

client.Endpoint.Behaviors.Add(behavior);

// We can now ask for information

client.GetSystemDateAndTime();

client.GetNetworkInterfaces();

client.GetScopes();

client.GetRelayOutputs();

client.GetWsdlUrl();

问题在于,在提供最简单信息之外的任何信息之前,相机需要进行身份验证,而最棘手的部分是最终捕获一个有效的 xml onvif 消息,以便在我自己的软件中重新创建它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多