2017-02-20 8 views
1

私はONVIFプロトコルを使用してアプリケーションを実装しています。 WSDLファイルhttps://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdlがあります。ONVIF - Python + ZEEP:create_serviceが動作しない

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

しかし、それは、これらの点にことはできません:しかし、それは、WSDLファイルに次のコードを追加するために、デフォルトのサービスを定義する必要がありますあなたがする必要がある、WSDLファイルにノードを追加する

  1. WSDLファイルをダウンロードしてください(これは実際の問題ではありません)。
  2. アプリケーションはさまざまなネットワークの多くのIPカメラと通信する必要があるため、行を定義することはできません。<soap:address location="http://ip/onvif/device_service"/>

だから私はいくつかの解決策を探していたと私は書かれているZEEPのドキュメント(http://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects)、でそれを見つけた:

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.

だから私はこれを呼び出すために試してみた:

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

しかし、スクリプトを実行すると例外がスローされます。

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

そして、私はWSDLファイルを直接変更します(ノードabすべて)正常に動作します。

どうかありがとうございますか?私はしばらくして戦っているので、少し蹴る必要があります。

ありがとうございます。

答えて

1

service = client.create_service()は動作するはずです(同じwsdlについてはhttps://github.com/mvantellingen/python-zeep/issues/106も参照してください)。代わりに、クライアントの

あなたは後続の呼び出し用に作成されたサービスオブジェクトを使用しています(例えばservice.Operation()

+0

残念ながら、それは私のために動作しませんが、私は:-(たい。あなたの答えの後、私は私のバージョンに気づきましたZeep(0.21.0)、それが原因かもしれないと思っていましたが、リリース日に合わせてcreate_service()メソッドが含まれているはずですが、1.1.0に更新しましたがまだ動作しません。 (デフォルトのサービスは定義されていません)、 "後続の呼び出し"では、私はclient.service.Operation()を呼び出していると思います。 clientとcreate_service)? – Honza

+0

実際にエラーが発生する理由はありません.client.serviceオブジェクトはデフォルトのmappiですng。 create_serviceを使用して新しいものを作成するので、代わりにそれを使用する必要があります。したがって、my_service = client.create_service(..); my_service.operaton() – mvantellingen

+0

あなたのアドバイスは答えでしたが、特定のバージョンのZeepとの組み合わせで回答しました。ちょっと奇妙ですが、Zeepを0.21.0から0.24.0にインストールしたとき、Zeepをバージョン0.26.0と0.27.0でインストールしたときに完全に動作します。これはXリクエストのうちの1つ(他のX -1の要求で例外がスローされました)、バージョン1.0.0と1.1.0のZeepをインストールすると、毎回「http.client.RemoteDisconnected:応答なしのリモートエンドクローズド接続」という例外がスローされました。だから私は各依存関係をアップグレードしようとしましたが、それは助けにはなりません。ありがとうございました。 – Honza