ONVIF - Python + ZEEP:create_service无效

时间:2017-02-20 10:40:33

标签: python wsdl onvif zeep

我正在使用ONVIF协议实现应用程序。我必须使用WSDL文件https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl。但是,有必要定义默认服务,将以下代码添加到WSDL文件中:

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

但由于这些原因,这是不可能的:

  1. 要将Node添加到WSDL文件中,您必须下载WSDL文件(这不是真正的问题,因为我因性能而下载了文件 - 目前)
  2. 应用程序应与各种网络中的许多IP摄像头进行通信,因此无法定义行:<soap:address location="http://ip/onvif/device_service"/>
  3. 所以我正在寻找一些解决方案,我已经在Zeep文档中找到了它(http://docs.python-zeep.org/en/master/client.html#creating-new-serviceproxy-objects),其中写道:

      

    在某些情况下,您需要更改WSDL中定义的SOAP地址或 WSDL未定义任何服务元素。

    所以我试着称之为:

    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:没有定义默认服务。这通常是由于缺少WSDL中的wsdl:service定义

    当我直接修改WSDL文件(添加上面的Node)时,一切正常。

    请问,好吗?我有一段时间的战斗,所以我需要踢一点。

    谢谢。

1 个答案:

答案 0 :(得分:1)

service = client.create_service()应该可以工作(另请参阅https://github.com/mvantellingen/python-zeep/issues/106了解相同的wsdl)。

您是否在后续调用中使用创建的服务对象(例如service.Operation()而不是客户端?