Я реализую приложение, использующее протокол ONVIF. Существует файл WSDL https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl, с которым я должен работать. Но это необходимо, чтобы определить службу по умолчанию, чтобы добавить следующий код в 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 (это не проблема, потому что я загрузил файл из-за производительности - на данный момент)
- приложение должно взаимодействовать со многими 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 непосредственно (добавить узел аб ove), все работает правильно.
Любая идея, пожалуйста? Я борюсь с тобой, поэтому мне нужно немного отбить.
спасибо.
К сожалению, это не работает для меня, но я хочу :-(. После вашего ответа я заметил мою версию Zeep (0.21.0), и я думал, что это может быть из-за этого, но в соответствии с датой выпуска он должен содержать рабочий метод create_service(). Тем не менее, я обновился до 1.1.0, но все еще не работал - (без использования службы по умолчанию). И с «последующими вызовами», я думаю, что я - я вызываю client.service.Operation(), это нормально? Я написал код, который я написал выше (я имею в виду код для client и create_service)? – Honza
Нет, это причина, по которой он дает вам ошибку на самом деле. Объект client.service является стандартным mappi нг. Поскольку вы создаете новый с помощью create_service, вам нужно использовать это вместо этого. поэтому my_service = client.create_service (..); my_service.operaton() – mvantellingen
Итак, ваш совет был ответом - но в сочетании с конкретной версией Zeep. Это немного странно, но когда я установил Zeep версий от 0.21.0 до 0.24.0, он отлично работает, когда я установил Zeep версий 0.26.0 и 0.27.0, он работает только с одним из X-запросов (в другом X -1 требует от него исключения, о котором я расскажу подробнее), и когда я установил Zeep версий 1.0.0 и 1.1.0, каждый раз возникало исключение: «http.client.RemoteDisconnected: удаленное закрытое соединение без ответа». Поэтому я попытался обновить каждую зависимость, но это не поможет. Еще раз спасибо. – Honza