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>
但由于以下几点,这是不可能的:
- 要将节点添加到 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) 中找到了它,其中写道:
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()
而不是客户端?
我正在使用 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) 中找到了它,其中写道:
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()
而不是客户端?