我正在使用 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>
但由于以下几点,这是不可能的:
- 要将节点添加到 WSDL 文件中,您必须下载 WSDL 文件(这不是真正的问题,因为我下载了文件由于性能 - 现在)
- 该应用程序应与各种网络中的许多 IP 摄像机通信,因此无法定义行:
<soap:address location="http://ip/onvif/device_service"/>
所以我一直在寻找一些解决方案,我在 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 文件(添加上面的节点)时,一切正常。
请问有什么想法吗?我正在战斗一段时间,所以我需要踢一点。
谢谢你。