11

私の仕事は、建物内の ONVIF カメラとの通信を確立し、最終的には会社の Dootic ソリューションをアップグレードして、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 - Bad request」エラーが発生します。これは、カメラの認証を処理する必要があるためです。

問題は、WS-Security (ONVIF で使用されているようです) について私が見つけたものはすべて、本当に混乱しており、さまざまな解決策があり、実際には何も機能していないことです。たとえば、この投稿は非常に単純に聞こえますが、UserNameSecurityToken を作成しようとしましたが、まだ 400 の不正な要求エラーが発生します。それがトークンシステムを間違って書いたからなのか、カメラが私がやろうとしていることをサポートしていないからなのかはわかりません。

私はすでに WSHttpBinding を試してユーザー名モードにしましたが、WSHttpBinding を使用すると、作成できた基本的な情報ディスカバリーが壊れます (MustUnderstand エラーで)...

私への指針はありますか?簡単な WS-Security/.NET、C#/ONVIF チュートリアル、すべて受け入れられます。

4

1 に答える 1

12

わかった:

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 メッセージを最終的にキャッチして、自分のソフトウェアでそれを再作成することでした。

于 2011-04-15T07:18:22.100 に答える