2017-02-20 1 views
1

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> 

그러나 때문에 이러한 점에 불가능 :

  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' 
) 

을 그러나 스크립트를 실행할 때 예외가 throw됩니다.

ValueError: There is no default service defined. This is usually due to missing wsdl:service definitions in the WSDL

그리고 WSDL 파일을 직접 수정할 때 (노드 ab 모든 것이 올바르게 작동합니다.

어떤 아이디어입니까? 나는 잠시 싸우고있어, 조금 걷어차 야해.

감사합니다.

답변

1

service = client.create_service()가 작동해야합니다 (동일한 wsdl의 경우 https://github.com/mvantellingen/python-zeep/issues/106 참조).

당신이 불행하게도, 그것은 나를 위해 작동하지 않습니다 예를 들어, 대신 클라이언트의 service.Operation()을? (대한 후속 호출

+0

를 생성 된 서비스 개체를 사용하고,하지만 난 :-(바랍니다. 당신의 대답 후 나는 내 버전을 발견 지프 (0.21.0), 그리고 그것 때문에 그럴 수 있다고 생각하지만, 릴리스 날짜에 따르면 create_service() 메소드가 포함되어야합니다. 그럼에도 불구하고 1.1.0으로 업데이트되었지만 여전히 작동하지 않습니다. (기본 서비스가 정의되어 있지 않습니다.) 그리고 "후속 호출"을 사용하면 client.service.Operation()을 호출하고 있습니다. 괜찮습니까? 위에 쓴 코드는 올바른 것입니까? client 및 create_service)? – Honza

+0

실제로 오류가 발생하는 이유는 없습니다 .client.service 객체는 기본 mappi입니다. ng. create_service를 사용하여 새 것을 작성했기 때문에 대신 create_service를 사용해야합니다. 그래서 my_service = client.create_service (..); my_service.operaton() – mvantellingen

+0

자문에 대한 답변이 있었지만 특정 버전의 지프와 함께 사용되었습니다. 조금 이상하지만 0.21.0에서 0.24.0까지 버전의 Zeep을 설치하면 완벽하게 작동합니다. 버전 0.26.0과 0.27.0의 Zeep을 설치하면 X 요청 중 하나만 작동합니다 (다른 X -1 요청은 예외를 던졌습니다. 더 자세히 설명하겠습니다). 버전 1.0.0 및 1.1.0의 Zeep을 설치하면 예외가 발생했습니다. "http.client.RemoteDisconnected : 응답없이 원격 종료 연결을 닫습니다." 그래서 각 종속성을 업그레이드하려고했지만 도움이되지 않습니다. 다시 감사합니다. – Honza

관련 문제