2012-05-29 10 views
5

tenemos una cámara IP de red que admite el protocolo ONVIF. Cuando traté de obtener su configuración PTZ da error de autenticación. Estoy implementando esto en C. A continuación están la solicitud y la respuesta.¿Cómo autenticar al usuario en ONVIF?

Solicitud:

"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
    "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\"" 
    "xmlns:tds=\"http://www.onvif.org/ver20/ptz/wsdl\">" 
    "<soap:Body>" 
    "<tds:GetNodes/>" 
    "</soap:Body>" 
    "</soap:Envelope>" 

Respuesta:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:wsa5="http://www.w3.org/2005/08/addressing" 
       xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" 
       xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
       xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 
       xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
       xmlns:ptzimg2="http://www.onvif.org/ver10/schema" 
       xmlns:ptzimg3="http://www.w3.org/2005/05/xmlmime" 
       xmlns:ptzimg4="http://docs.oasis-open.org/wsn/b-2" 
       xmlns:ptzimg5="http://docs.oasis-open.org/wsrf/bf-2" 
       xmlns:ptzimg6="http://docs.oasis-open.org/wsn/t-1" 
       xmlns:ptzimg1="http://www.onvif.org/ver20/ptz/wsdl" 
       xmlns:ptzimg7="http://www.onvif.org/ver20/imaging/wsdl" 
       xmlns:ter="http://www.onvif.org/ver10/error"> 

<SOAP-ENV:Body> 
    <SOAP-ENV:Fault> 
     <SOAP-ENV:Code> 
      <SOAP-ENV:Value> 
       SOAP-ENV:Sender 
      </SOAP-ENV:Value> 
      <SOAP-ENV:Subcode> 
       <SOAP-ENV:Value> 
        ter:NotAuthorized 
       </SOAP-ENV:Value> 
      </SOAP-ENV:Subcode> 
     </SOAP-ENV:Code> 
     <SOAP-ENV:Reason> 
      <SOAP-ENV:Text xml:lang="en"> 
       Sender Not Authorized 
      </SOAP-ENV:Text> 
     </SOAP-ENV:Reason> 
     <SOAP-ENV:Node> 
      http://www.w3.org/2003/05/soap-envelope/node/ultimateReceiver 
     </SOAP-ENV:Node> 
     <SOAP-ENV:Role> 
      http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver 
     </SOAP-ENV:Role> 
     <SOAP-ENV:Detail> 
      The action requested requires authorization and the sender is not authorized 
     </SOAP-ENV:Detail> 
    </SOAP-ENV:Fault> 
</SOAP-ENV:Body> 

¿Cómo puedo autenticar a los usuarios? Gracias

+0

P: ¿Está codificando a mano su SOAP? P: ¿Cuál es el modelo y fabricante de la cámara? ¿Admiten una biblioteca de interfaz? O cualquier especificación (además del WSDL)? ¿Has intentado contactarlos (al menos para el código de muestra)? – paulsm4

+0

Es una cámara Canon, VB-M40. Este método de autenticación se proporciona en la guía del programador ONVIF. "http://www.onvif.org/Portals/0/documents/WhitePapers/ONVIF_WG-APG-Application_Programmer%27s_Guide.pdf" –

Respuesta

2

aquellos comandos que requieren autenticación. Sus encabezados de autenticación se pueden agregar así.

snprintf(postData, sizeof(postData), 
      "<?xml version=\"1.0\" encoding=\"utf-8\"?>" 
      "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://www.w3.org/2003/05/soap-envelope\"" 
      "xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401" 
      "-wss-wssecurity-secext-1.0.xsd\"" 
      "xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-" 
      "200401-wss-wssecurity-utility-1.0.xsd\"" 
      "xmlns:tds=\"http://www.onvif.org/ver20/ptz/wsdl\">" 
      "<SOAP-ENV:Header><wsse:Security><wsse:UsernameToken>" 
      "<wsse:Username>%s</wsse:Username>" 
      "<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-" 
      "200401-wss-username-token-profile-1.0#PasswordDigest\">" 
       "%s</wsse:Password><wsse:Nonce>%s</wsse:Nonce>" 
      "<wsu:Created>%s</wsu:Created></wsse:UsernameToken>" 
      "</wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body>" 
      "<tds:GetNodes>" 
      "</SOAP-ENV:Body></SOAP-ENV:Envelope>", 
      username, base64EncDigest, nonce_char, time_char); 
+0

¿Cómo se genera el resumen de contraseña? Estoy mirando a través de la API de programadores ONVIF y parece que el resumen de contraseñas se produce al ejecutar 'Digest = B64ENCODE (SHA1 (B64DECODE (Nonce) + Date + Password))' pero tanto la fecha como la contraseña son cadenas que se han convertido a binario. ¿Qué significa convertir una cadena a binaria? ¿Cómo generó el resumen? – CadentOrange

+0

el nonce_char debe estar codificado en base64? ¿Qué es time_char? ¿es la marca de tiempo o la hora actual como 2014-01-02T12: 47: 08Z – kashifmehmood

1

Puede utilizar gSOAP con WSSE plugin para generar C++ proxy de cliente de OnVif de WDSL que necesita.

Eso simplifica enormemente mi trabajo. Aquí hay un ejemplo de cómo llamar a GetVideoEncoderConfiguration y leer la respuesta.

_media__GetVideoEncoderConfigurations query; 
_media__GetVideoEncoderConfigurationsResponse response; 

soap_wsse_add_Security(&mediaProxy); 
soap_wsse_add_UsernameTokenDigest(&mediaProxy, NULL, m_username.c_str(), m_password.c_str()); 

if(mediaProxy.GetVideoEncoderConfigurations(&query, &response) == SOAP_OK) 
{ 
    LogSuccess("GetVideoEncoderConfigurations"); 
    for(auto it = response.Configurations.begin(); it != response.Configurations.end(); ++it) 
    { 
     onvif__VideoEncoderConfiguration* videoConf = *it; 
     log(I3) << "Name= " << videoConf->Name << ", Encoding=" << videoConf->Encoding << ", Resolution=" << videoConf->Resolution->Width << "x" << videoConf->Resolution->Height; 
    } 
} 
else 
    LogError("GetVideoEncoderConfigurations", soap_faultdetail(&mediaProxy)); 

De modo que no se crean mensajes de jabón manualmente. El código generado por SOAP se encarga de eso en la capa inferior. Por supuesto, lleva 2 días generar código de trabajo con soporte wsse, pero aún así fue probablemente 10 veces más rápido hacerlo manualmente. Si está interesado en obtener más información, puede ponerse en contacto conmigo.

Cuestiones relacionadas