ONVIF - Python + ZEEP:create_service 不工作

ONVIF - Python + ZEEP: create_service not working

我正在使用 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. 要将节点添加到 WSDL 文件中,您必须下载 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 文件(添加上面的节点)时,一切正常。

有什么想法吗?打了一会,所以我需要踢一下。

谢谢。

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

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