Open uched41 opened 5 years ago
I was able to narrow the issue down by using wireshark to observe the requests being sent. There seems to be an error in the request:
This is the result when I sniff packets from the script,
POST /onvif/media_service HTTP/1.1
Host: 192.168.0.10
Accept-Encoding: gzip, deflate
Accept: */*
User-Agent: Zeep/2.0.0 (www.python-zeep.org)
Connection: keep-alive
SOAPAction: "http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
Content-Length: 1384
<?xml version='1.0' encoding='utf-8'?>
<soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope">
<soap-env:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>admin</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">sl4l/u7/drfe9PawwI6bWO6m+Ew=</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">zwmmWqZjGYxuDDCaZhRSGA==</wsse:Nonce>
<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2018-10-12T04:06:01+00:00</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soap-env:Header>
<soap-env:Body>
<ns0:GetStreamUri xmlns:ns0="http://www.onvif.org/ver10/media/wsdl">
<ns0:StreamSetup>
<ns1:Stream xmlns:ns1="http://www.onvif.org/ver10/schema">RTP-Unicast</ns1:Stream>
<ns2:Transport xmlns:ns2="http://www.onvif.org/ver10/schema">
<ns2:Protocol>RTSP</ns2:Protocol>
</ns2:Transport>
</ns0:StreamSetup>
<ns0:ProfileToken>MainStreamTooken</ns0:ProfileToken>
</ns0:GetStreamUri>
</soap-env:Body>
</soap-env:Envelope>
HTTP/1.1 400 Bad Request
Server: gSOAP/2.8
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
Content-length: 2010
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:wsc="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2" xmlns:wstop="http://docs.oasis-open.org/wsn/t-1" xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2" xmlns:tdn="http://www.onvif.org/ver10/network/wsdl" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tdv="http://www.onvif.org/ver10/events/wsdl" xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2" xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl" xmlns:trt="http://www.onvif.org/ver10/media/wsdl" xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl" xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"><SOAP-ENV:Body><SOAP-ENV:Fault><SOAP-ENV:Code><SOAP-ENV:Value>SOAP-ENV:Receiver</SOAP-ENV:Value><SOAP-ENV:Subcode><SOAP-ENV:Value>ter:InvalidArgVal</SOAP-ENV:Value><SOAP-ENV:Subcode><SOAP-ENV:Value>ter:NoConfig</SOAP-ENV:Value></SOAP-ENV:Subcode></SOAP-ENV:Subcode></SOAP-ENV:Code><SOAP-ENV:Reason><SOAP-ENV:Text xml:lang="en"></SOAP-ENV:Reason></SOAP-ENV:Fault></SOAP-ENV:Body></SOAP-ENV:Envelope>
Compared to the results when I sniff packets of the same request coming from ONViFManager:
POST /onvif/media_service HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
Host: 192.168.0.10
Content-Length: 498
Accept-Encoding: gzip, deflate
Connection: Close
<s:Envelope
xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Body
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetStreamUri
xmlns="http://www.onvif.org/ver10/media/wsdl">
<StreamSetup>
<Stream
xmlns="http://www.onvif.org/ver10/schema">RTP-Unicast
</Stream>
<Transport
xmlns="http://www.onvif.org/ver10/schema">
<Protocol>RTSP</Protocol>
</Transport>
</StreamSetup>
<ProfileToken>MainStreamTooken</ProfileToken>
</GetStreamUri>
</s:Body>
</s:Envelope>HTTP/1.1 200 OK
Server: gSOAP/2.8
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/media/wsdl/GetStreamUri"
Content-length: 1931
Connection: close
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsdd="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:chan="http://schemas.microsoft.com/ws/2005/02/duplex"
xmlns:wsa5="http://www.w3.org/2005/08/addressing"
xmlns:c14n="http://www.w3.org/2001/10/xml-exc-c14n#"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:xenc="http://www.w3.org/2001/04/xmlenc#"
xmlns:wsc="http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:xmime="http://tempuri.org/xmime.xsd"
xmlns:xop="http://www.w3.org/2004/08/xop/include"
xmlns:tt="http://www.onvif.org/ver10/schema"
xmlns:wsrfbf="http://docs.oasis-open.org/wsrf/bf-2"
xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
xmlns:wsrfr="http://docs.oasis-open.org/wsrf/r-2"
xmlns:tdn="http://www.onvif.org/ver10/network/wsdl"
xmlns:tds="http://www.onvif.org/ver10/device/wsdl"
xmlns:tdv="http://www.onvif.org/ver10/events/wsdl"
xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"
xmlns:trt="http://www.onvif.org/ver10/media/wsdl"
xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"
xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl">
<SOAP-ENV:Body>
<trt:GetStreamUriResponse>
<trt:MediaUri>
<tt:Uri>rtsp://192.168.0.10:554/ch0_0.h264</tt:Uri>
<tt:InvalidAfterConnect>false</tt:InvalidAfterConnect>
<tt:InvalidAfterReboot>false</tt:InvalidAfterReboot>
<tt:Timeout>PT0S</tt:Timeout>
</trt:MediaUri>
</trt:GetStreamUriResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
It looks like there is an error in XML formatting.
Hi uched41,
In the script case, there is the soap header with wsse information that are not present with onvifdm.
Did you try to post the request using curl
or whatever to identify what is the part that allow the sever to understand the request ?
Best Regards,
Michel.
Hello mpromonet, I have inspected both requests and curl will work. I have tried using curl, and it works. The difference it the ns0 and ns1 in the request, Is there any way I can remove them
<ns0:GetStreamUri xmlns:ns0="http://www.onvif.org/ver10/media/wsdl">
<ns0:StreamSetup>
<ns1:Stream xmlns:ns1="http://www.onvif.org/ver10/schema">RTP-Unicast</ns1:Stream>
<ns2:Transport xmlns:ns2="http://www.onvif.org/ver10/schema">
<ns2:Protocol>RTSP</ns2:Protocol>
</ns2:Transport>
</ns0:StreamSetup>
<ns0:ProfileToken>MainStreamTooken</ns0:ProfileToken>
</ns0:GetStreamUri>
Hi uched41,
Obvisously this depends on the parser of your server, but <ns0:GetStreamUri xmlns:ns0="http://www.onvif.org/ver10/media/wsdl">
should be equivalent to <GetStreamUri xmlns="http://www.onvif.org/ver10/media/wsdl">
Best Regards,
Michel.
I write a simple base on example/streaming.py and python-onvif-zeep/issues/4, it work nice with HiKvision camera, as follow:
import zeep
from onvif import ONVIFCamera, ONVIFService
def zeep_pythonvalue(self, xmlvalue):
return xmlvalue
zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
def media_profile_configuration():
'''
A media profile consists of configuration entities such as video/audio
source configuration, video/audio encoder configuration,
or PTZ configuration. This use case describes how to change one
configuration entity which has been already added to the media profile.
'''
# Create the media service
mycam = ONVIFCamera('192.168.5.248', 80, 'admin', 'xxxxxx', 'E://python-onvif-zeep/wsdl/')
media_service = mycam.create_media_service()
token = None
profiles = media_service.GetProfiles()
print("dump profiles and find first profile token")
for prof in profiles:
if not token:
token = prof["token"]
print(token)
# Use the first profile and Profiles have at least one
# token = profiles[0]._token
token = "Profile_1"
# Get all video encoder configurations
configurations_list = media_service.GetVideoEncoderConfigurations()
print("dump configuration list")
for config in configurations_list:
print(config)
obj = media_service.create_type('GetStreamUri')
obj.ProfileToken = token
obj.StreamSetup = {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}}
print("dump stream uri")
print(media_service.GetStreamUri(obj))
if __name__ == '__main__':
media_profile_configuration()
I know this is old, but if anyone faces this issue, try to replace the code in client.py - ONVIFService - __init__
From
self.create_type = lambda x: self.zeep_client.get_element('ns0:' + x)()
to
namespace = binding_name[binding_name.find("{") + 1 : binding_name.find("}")]
available_ns = self.zeep_client.namespaces
active_ns = (
list(available_ns.keys())[list(available_ns.values()).index(namespace)]
or "ns0"
)
self.create_type = lambda x: self.zeep_client.get_element(active_ns + ":" + x)()
Hello Guys I get this error when I try to run the function GetStreamUri:
Here is the funtion I am running:
The error occurs on the funtion:
obj = media_service.create_type('GetStreamUri')
I have tried installing using pip3 and I have also tried installing from the github repo. I have also checkout different versions of the github repo, but all give the same error.
Any help will be appreciated, thanks, @FalkTannhaeuser @sinchb @iomihai @mpromonet @eLvErDe