Mi tarea es tratar de establecer una comunicación con un ONVIF de la cámara en el edificio a, eventualmente, actualización de la empresa de domótica solución para reconocer automáticamente ONVIF cámaras y ser capaz de configurar y de utilizar sus servicios.

Ya soy capaz de reunir algunas informaciones básicas como su modelo, su dirección MAC y la versión de su firmware de esta manera:

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

Tengo esta especificación xml para la customBinding en mi aplicación.archivo de configuración:

  <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>

Mi problema es que es imposible para mí para ir más profundo en lo que puedo pedir a la cámara. Me sale «400 – Bad request» errores para cualquier cosa que trate, y según lo que he leído es porque lo necesita para manejar la autenticación para la cámara.

El problema es que, todo lo que puedo encontrar acerca de WS-Security (que parece ser utilizado por el ONVIF) es realmente, realmente confundido, con un montón de diferentes soluciones, y nada realmente trabajando para mí. Por ejemplo, este post aquí hacerla sonar muy simple, pero he probado a crear un UserNameSecurityToken y todavía me dan 400 solicitud incorrecta errores. Ya no sé si es porque he escrito mi sistema de Token mal, si es porque la cámara no apoyo lo que trato de hacer.

Ya he probado WSHttpBinding y poner en nombre de Usuario modo, pero el uso de WSHttpBinding romper la información básica descubrimiento que yo era capaz de crear (con un MustUnderstand error)…

Cualquier punteros para mí? Simple de WS-Security/.NET, C#/ONVIF tutoriales, todo va a ser aceptado.

Esta es una nota de lado…El hecho de que parecen indicar que usted es nuevo en C# y que fueron capaces de llegar a este punto es impresionante.
Bueno, yo he hecho en JAVA por años, y en el final es definitivamente más fácil que hace algunos años, ahora usted puede encontrar generalmente pequeños fragmentos de código en internet

OriginalEl autor user704419 | 2011-04-12

1 Comentario

  1. 12

    Todo a la derecha:

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

    El problema era que la cámara de autenticación necesarios antes de dar cualquier información más allá de los más simples, y la parte más difícil fue para finalmente coger un xml onvif mensaje a recrear en mi propio software.

    Para aquellos no familiarizados con PasswordDigestBehavior, ver este post en el blog: blog.benpowell.co.reino unido/2010/11/…

    OriginalEl autor user704419

Dejar respuesta

Please enter your comment!
Please enter your name here