可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Once I get a response back from the UDP Multicast Request to 239.255.255.250
I get back a ProbeMatch with an XAddrs http://10.10.10.10:1234/onvif/device_service
How do I now do the GetSystemDateAndTime and GetDeviceInformation
Is this a TCP/UDP request to 10.10.10.10 port 1234 ? Is this a HTTP request to 10.10.10.10 port 80 ?
Or What Once I have the device's address http:10.10.10.10:1234/onvif/device_service
Then what
Thanks in advance
回答1:
You need to send there just a HTTP request as SOAP works over HTTP. For example via CURL it would be like this:
curl 10.10.10.10:1234/onvif/device_service -d '<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"><GetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>'
As a result you will get something like this with some headers:
<tds:GetSystemDateAndTimeResponse> <tds:SystemDateAndTime> <tt:DateTimeType>Manual</tt:DateTimeType> <tt:DaylightSavings>false</tt:DaylightSavings> <tt:TimeZone> <tt:TZ>MoroccoStandardTime0</tt:TZ> </tt:TimeZone> <tt:UTCDateTime> <tt:Time> <tt:Hour>10</tt:Hour> <tt:Minute>5</tt:Minute> <tt:Second>35</tt:Second> </tt:Time> <tt:Date> <tt:Year>2014</tt:Year> <tt:Month>3</tt:Month> <tt:Day>14</tt:Day> </tt:Date> </tt:UTCDateTime> </tds:SystemDateAndTime> </tds:GetSystemDateAndTimeResponse>
And also dont forget that most of the actions requires authorization headers included in to the request.
AUTHENTICATION
In ONVIF Application Programmer's Guide on page 35 is described how auth is done. For example it looks like this:
<s:Header> <Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <UsernameToken> <Username>admin</Username> <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">MuMnyh3wTxGWOCc=</Password> <Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">8Qqve9KCkNhQAAAAAAA==</Nonce> <Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2014-03-04T14:03:05.130Z</Created> </UsernameToken> </Security> </s:Header>
回答2:
@Kirix solution didn't work for my particular camera. However, after a huge amount of code study and trail/error.. I determined that the Trendnet camera I have insists on the header being perfect. I figured out a curl variation:
curl http://192.168.xxx.xxx/onvif/device_service --data '<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"><GetSystemDateAndTime xmlns="http://www.onvif.org/ver10/device/wsdl"/></s:Body></s:Envelope>' --header 'Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetSystemDateAndTime";'
回答3:
In your case http://10.10.10.10:1234/onvif/device_service
is the address of the device management service. You need to send a GetSystemDateAndTime
request according to the SOAP protocol.
How to send such requests depends on the system you are working on. You may use Visual Studio or gsoap (there's a FAQ about ONVIF)