Аутентификация ONVIF в .NET 4.0 с Visual Studios 2010 - PullRequest
11 голосов
/ 12 апреля 2011

Моя задача состоит в том, чтобы попытаться установить связь с камерой 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]);

У меня есть эта спецификация xml для customBinding в моем файле app.config:

  <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) очень, очень запутан, с множеством разных решений, и ничего для меня не работает.Например, этот пост здесь звучит очень просто, но я попытался создать UserNameSecurityToken, и я все еще получаю 400 ошибок неверного запроса.Так как я не знаю, потому ли это, что я написал свою систему токенов неправильно, если это потому, что камера не поддерживает то, что я пытаюсь сделать.

Я уже попробовал WSHttpBinding и поместил его в Имя пользователярежим, но с помощью WSHttpBinding нарушить базовое раскрытие информации, которое я смог создать (с ошибкой MustUnderstand) ...

Есть ли у меня какие-нибудь указатели?Простые учебники по WS-Security / .NET, C # / ONVIF, все будет принято.

1 Ответ

12 голосов
/ 15 апреля 2011

Все в порядке:

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, чтобы воссоздать его в моем собственном программном обеспечении.

...