2017-02-20 2 views
1

J'implémente une application utilisant le protocole ONVIF. Il y a un fichier WSDL https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl avec lequel je dois travailler. Mais il est nécessaire de définir le service par défaut, pour ajouter du code ci-dessous dans le fichier WSDL:ONVIF - Python + ZEEP: create_service ne fonctionne pas

<wsdl:service name="DeviceService"> 
    <wsdl:port name="DevicePort" binding="tds:DeviceBinding"> 
     <soap:address location="http://ip_address/onvif/device_service"/> 
    </wsdl:port> 
</wsdl:service> 

Mais il est impossible en raison de ces points:

  1. pour ajouter le nœud dans le fichier WSDL, vous devez télécharger le fichier WSDL (ce n'est pas un vrai problème, car j'ai téléchargé le fichier en raison de la performance - pour l'instant)
  2. l'application doit communiquer avec de nombreuses caméras IP dans divers réseaux, donc il n'est pas possible de définir la ligne: <soap:address location="http://ip/onvif/device_service"/>

Alors que je cherchais une solution et je l'ai trouvé dans la documentation Zeep (http://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects), où est écrit:

There are situations where you either need to change the SOAP address from the one which is defined within the WSDL or the WSDL doesn’t define any service elements.

J'ai donc essayé d'appeler ceci:

client = Client(
    wsdl = '/path/to/local/wsdl_file.wsdl', 
    wsse = self.InitSecurity(), 
    service_name = 'DeviceService', 
    port_name = 'DevicePort' 
) 

service = client.create_service(
    '{http://www.onvif.org/ver10/device/wsdl}DeviceBinding', 
    'http://ip_address/onvif/device_service' 
) 

mais quand je lance le script, exception suivante est lancée:

ValueError: There is no default service defined. This is usually due to missing wsdl:service definitions in the WSDL

Et quand je modifie le fichier WSDL directement (ajoutez le nœud ab ove), tout fonctionne correctement.

Une idée, s'il vous plaît? Je me bats avec un moment, donc j'ai besoin de botter un peu.

Merci.

Répondre

1

Le service = client.create_service() doit fonctionner (voir aussi https://github.com/mvantellingen/python-zeep/issues/106 pour le même fichier wsdl).

Utilisez-vous l'objet de service créé pour les appels suivants (par exemple service.Operation() au lieu du client?

+0

Malheureusement, cela ne fonctionne pas pour moi, mais je souhaite :-(. Après votre réponse, j'ai remarqué ma version de Zeep (0.21.0), et je pensais que cela pourrait être à cause de cela, mais selon la date de publication, il devrait contenir la méthode create_service() fonctionnant, néanmoins, j'ai mis à jour vers 1.1.0 mais ne fonctionne toujours pas - la même exception thrown (aucun service par défaut défini) Et avec les "appels suivants", je pense que je suis - j'appelle client.service.Operation(), est-ce que ça va? Est-ce que le code que j'ai écrit ci-dessus est correct? client et create_service)? – Honza

+0

Non, c'est la raison pour laquelle il vous donne l'erreur en réalité: l'objet client.service est un mappi par défaut ng Puisque vous en créez un nouveau avec le service create_service, vous devez l'utiliser à la place. donc my_service = client.create_service (..); my_service.operaton() – mvantellingen

+0

Ainsi, votre conseil était la réponse - mais en combinaison avec la version spécifique de Zeep. C'est un peu bizarre, mais quand j'ai installé Zeep des versions de 0.21.0 à 0.24.0, ça fonctionne parfaitement, quand j'ai installé Zeep des versions 0.26.0 et 0.27.0, ça fonctionne juste une des requêtes X (dans d'autres X -1 demandes il a jeté une exception que je décrirai plus loin) et quand j'ai installé Zeep des versions 1.0.0 et 1.1.0, il y avait à chaque fois jeté une exception: "http.client.RemoteDisconnected: Connexion à extrémité fermée à distance sans réponse". J'ai donc essayé de mettre à jour chaque dépendance, mais ça n'aidera pas. Merci encore. – Honza