2017-05-20 3 views
1

Je crée un service Web pour la caméra ONVIF à l'aide de gSoap. J'ai généré l'en-tête et les fichiers source en utilisant le noyau wdsl fourni par ONVIF au https://www.onvif.org/profiles/specifications/.Erreur gSoap SOAP-ENV: MustUnderstand [aucun sous-code]

Cependant, chaque fois que je fais une demande du client i obtenir l'erreur ci-dessous dans la fonction soap_begin_serve(soap):

SOAP 1.2 fault SOAP-ENV:MustUnderstand[no subcode] 
"The data in element 'Security' must be understood but cannot be processed" 

Qu'est-ce que le moyen d'erreur ci-dessus et comment puis-je résoudre ce problème?

EDIT: Voici ce que je reçois sur le côté de la caméra:

POST/HTTP/1.1 
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetSystemDateAndTime" 
Host: localhost:8090 
Content-Length: 261 
Accept-Encoding: gzip, deflate 
Connection: Close 

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>POST/HTTP/1.1 
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetScopes" 
Host: localhost:8090 
Content-Length: 905 
Accept-Encoding: gzip, deflate 
Connection: Close 

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Header><Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>admin</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">WFz21zL8rch8LRoxAPzgHRMBbr0=</Password><Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">9y79ka0xD02oCIw6GAoIPwEAAAAAAA==</Nonce><Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2017-05-21T08:15:58.902Z</Created></UsernameToken></Security></s:Header><s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><GetScopes xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope> 
+0

Il y a un problème dans l'en-tête UsernameToken/Security. Pouvez-vous poster le message SOAP que vous envoyez à la caméra? – aminexplo

+0

a posté la demande reçue à camera.thanks. – thunderbird

+0

dois-je configurer séparément gsoap pour WS-Security? – thunderbird

Répondre

0

SOAP 1.2 faute SOAP-ENV: MustUnderstand [pas sous-code] « Les données dans l'élément 'sécurité' doit être comprise, mais ne peut pas être traitée »

Cela signifie que vous devez activer WS-Security pour authentifier:

  1. ajouter #import "wsse.h" au fichier d'en-tête .h (aka. service et liaison de données "fichier d'interface") pour soapcpp2 à traiter.

  2. dans votre code source, #include "plugin/wsseapi.h"

  3. dans votre code source, fournir les informations d'identification utilisateur avant d'envoyer la demande avec soap_wsse_add_UsernameTokenDigest(soap, NULL, "username", "password");

  4. compiler le code source avec le drapeau du compilateur -DWITH_OPENSSL et compiler votre base de code d'application avec plugin/wsseapi.c, plugin/smdevp.c, et plugin/mecevp.c (le répertoire plugin se trouve dans le chemin de distribution gSOAP), et bien sûr également de compiler stdsoap2.c ou stdsoap2.cpp et d'autres fichiers générés;

  5. liaison avec OpenSSL -lssl -lcrypto, et peut-être -lz si la compression est souhaitée;

  6. lorsque vous utilisez les fonctionnalités complètes du plugin WS-Security avec gSOAP (signature numérique et/ou cryptage), vous devez compiler tout le code source avec option de compilateur -DWITH_OPENSSL -DWITH_DOM -DWITH_GZIP et aussi compiler dom.c ou dom.cpp avec votre code.

Voir aussi the WS-Security plugin pour gSOAP.

Espérons que cela aide.