AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke WebServices - Discovery: Hello, Probe, Bye ......
Thema durchsuchen
Ansicht
Themen-Optionen

WebServices - Discovery: Hello, Probe, Bye ......

Ein Thema von TERWI · begonnen am 31. Jan 2016 · letzter Beitrag vom 8. Feb 2016
Antwort Antwort
Seite 2 von 2     12   
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
970 Beiträge
 
Delphi 6 Professional
 
#11

AW: WebServices - Discovery: Hello, Probe, Bye ......

  Alt 5. Feb 2016, 18:48
Bist Du dir sicher, das die Kameras mit PROBE,HELLO,BYE arbeiten?

Teilweise werden von den Hersteller eigene Protokolle/Services verwendet und dann antworten die Geräte natürlich nicht auf dein PROBE.

Ein Beispiel ist mein Buffalo NAS, die haben dort auch ein auf UDP basierenden Service auf dem NAS laufen, welcher jedoch über ein spezielles Protokoll (Commandos) arbeitet.

Die Hersteller eigene Software kennt natürlich das Protokoll und kann so mit den Geräten kommunizieren.

Einfach mal die Kommunikation zwischen der PingPong-Software und den Kameras belauschen.
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: WebServices - Discovery: Hello, Probe, Bye ......

  Alt 6. Feb 2016, 12:02
Ja, bin ich - zumindestens was PROBE betrifft.

Schau doch bitte noch mal genau in mein 1. Posting.
Dort habe ich die XML-Texte von ONVIF und Microsoft zu dem Thema gelistet. Beide nahezu identisch - zumindestens inhaltlich. (MS hat am Schluss '</e:Envelope>' vergessen)
Beide geben 239.255.255.250 : 3702 an.

Dieser Satz in der WS-Spezifikation gibt mir doch noch etwas zu denken:
Because there is no explicit ReplyTo SOAP header block [WS-Addressing], any response to this Probe will be sent as a UDP packet to the source IP address and port of the Probe transport header [SOAP/UDP].
Soll dann heißen: (!?)
Jede Antwort auf die PROBE wird als UDP-Paket an die im Probe-Header enthaltene IP-Adresse und Port der Quelle (Absender) gesendet.

Da ich hier keinen Plan habe, die Fragen:
- Welche IP sende ich denn ? Die meines Rechner denke ich mal ... oder ?
- Und welcher Port ist hier gemeint ? Der, den ich anfrage ?
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: WebServices - Discovery: Hello, Probe, Bye ......

  Alt 6. Feb 2016, 19:15
Die gute Nachricht zwischendurch:

.... HOUSTON - WIR HABEN KONTAKT !!!
(ich zur Kamera und nutzbare Daten davon zurück)

Allerdings nicht wie erwartet via WS-Dicovery-Probe.
Der "Kabel-Hai" hat's an's Licht gebracht - Mega Dank an HolgerX für den Tipp !!!

Details später - ich muss da noch im speziellen eben noch mal schnell etwas fummeln ....
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: WebServices - Discovery: Hello, Probe, Bye ......

  Alt 7. Feb 2016, 12:26
... die Details - wo fange ich mal an ?

Vorweg gesagt: Es geht offensichtlich auf 2 Wegen - sowohl via WS-Discovery PROBE und auch einem anscheinend internem Protokoll/Kommando !

Nachdem ich mir nach den (zunächst) erfolglosen Versuchen mal den Datenverkehr mit dem Kabel-Hai angesehen habe, was denn da alles so vom ChinaMan-DeviceManager gesendet wird, war zunächst folgendes festzustellen:

Es geht abweichend zu WS-Discovery ein Broadcast an 255.255.255.255 : 34569 mit 20 Byte Daten raus, von nur 3 Byte > 0 sind.
Die Kamera(s) antworten alle innerhalb 1/2 Sekunde an die absendende IP an den Port, der beim Senden mitgegeben wurde und schicken dazu etwa 450-500 Byte mit.
Diese Daten sind fast selbsterklärend und bestehen immer aus "Variable":"Wert und Komma. Recht einfach, das auszuwerten.

Das wird hier offensichtlich genauso gehandelt wie bei WS-Discovery. Entspricht genau dem Satz aus der Spezifikation, wie ich es 2 Postings zuvor geschrieben gabe.
Das war nämlich mein Fehler bei der Anfrage via ONVIF - ich hab schlicht vergessen dem UDP-Server den richtigen Port zu sagen .... der hat dann in's leere gehorcht.


Vorhin hab ich noch ein bischen rumgesnifft, um zu sehen, was denn der ONVIF-Manager (sourceforge.net) so alles von sich gibt und auch zurückbekommt.
Siehe da: alle Kameras antworten ebenfalls artig mit einem ProbeMatch zurück !

Und nochmal siehe da: Nimmt man einer Kamera mal kurz den Saft, meldet diese sich nach ca. 10-15 sek. Initialisierung mit einem freundlich WS-Discovery HELLO !
Demzufolge müsste auch ein BYE drin sein - sofern ein entsprechenden Befehl zum "schlafengehen" exisiert.


Fazit bis hierher:
Nachdem ich mir Tage mit diesem WSDL-Kram um die Ohren gehauen habe, ist es doch erstaunlich festzustellen, mit wie wenig Zeilen Code + entsprechenden XML-Befehlssätzen sich eine Kommunikation erstellen lässt. Hab ich selber nicht dran geglaubt ...

Und wenn man zwischen <d:Types>dn: xxxxxx </d:Types>' etwas anderes als NetworkVideoTransmitter angibt, lassen sich sicherlich auch andere, diesen Service unterstützende Geräte im LAN finden.

Ich werde derweil ein wenig weitertippen, damit ein brauchbares Tool draus wird und lasse es euch bei zeiten zukommen.
Zwischenzeitlich kommen sicherlich noch etliche Fragen auf ...
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

Registriert seit: 29. Mär 2008
Ort: D-49626
381 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: WebServices - Discovery: Hello, Probe, Bye ......

  Alt 8. Feb 2016, 19:27
Ich möchte euch ja nicht vorenthalten, wie das mit eigentlich minimalistischem Code funktioniert.

Ich habe dafür nur einen UDP-Server benutzt, der beides macht:
Daten versenden und gleichzeitig empangen.
Die eigentliche procedure zur Anfrage als Broadcast via UDP:
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  SndBytes : TIdBytes;
begin
  with udpServer do
  begin
    Active := false;            // proforma FALSE / stoppen
    Bindings.DefaultPort := strtoint(EditRcvPort.text);
    BroadcastEnabled := true; //
    Active := True;             // ... und wieder starten
    ONVIF.GenSendBytes_PROBE(SndBytes);
    udpServer.SendBuffer(EditHost.Text, strtoint(EditPort.text), SndBytes);
    Memo1.Lines.Add('Data send to: ' + EditHost.Text + ':' + EditPort.text);
    Memo1.Lines.Add('Server started on port: ' + EditRcvPort.text);
  end;
end;
Die procedure, woher obige den SOAP/XML-String her bekommt:
Code:
procedure TONVIF.GenSendBytes_PROBE(var SndBytes : TIdBytes);
var
  s : string;
begin
  s := '<?xml version="1.0" encoding="UTF-8"?>' +
    '<e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope"' +
    'xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing"' +
    'xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"' +
    'xmlns:dn="http://www.onvif.org/ver10/network/wsdl">'+
    '<e:Header>' +
    '<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID>' +
    '<w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To>' +
    '<w:Action a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action>' +
    '</e:Header>' +
    '<e:Body>' +
    '<d:Probe>' +
    '<d:Types>dn:NetworkVideoTransmitter</d:Types>' +
    '</d:Probe>' +
    '</e:Body>' +
    '</e:Envelope>';
  SetLength(SndBytes, Length(s) + 1);
  fillchar(SndBytes[0], length(s) + 1, 0);
  move(s[1], SndBytes[0], Length(s));
end;
.... und die procedure im Receive-Event des UDP-Servers:
Code:
procedure TForm1.UDPServerUDPRead(AThread: TIdUDPListenerThread;
          const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  Memo1.Lines.Add(' Server read num of bytes: ' + inttostr(length(AData)));
  Memo1.Lines.Add(' - from > IP: ' + ABinding.PeerIP + ' | Port: ' + inttostr(ABinding.PeerPort));
  Memo1.Lines.Add(BytesToString(AData));
end;
Dabei kommt dann z.B. so etwas als "Seifen-Oper" von der Kamera zurück:
(Händisch formatiert ohne Einrückungen für die Optik)
Code:
<?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:wsa5="http://www.w3.org/2005/08/addressing"
 xmlns:xop="http://www.w3.org/2004/08/xop/include"
 xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
 xmlns:tt="http://www.onvif.org/ver10/schema"
 xmlns:ns1="http://www.w3.org/2005/05/xmlmime"
 xmlns:wstop="http://docs.oasis-open.org/wsn/t-1"
 xmlns:ns7="http://docs.oasis-open.org/wsrf/r-2"
 xmlns:ns2="http://docs.oasis-open.org/wsrf/bf-2"
 xmlns:dndl="http://www.onvif.org/ver10/network/wsdl/DiscoveryLookupBinding"
 xmlns:dnrd="http://www.onvif.org/ver10/network/wsdl/RemoteDiscoveryBinding"
 xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
 xmlns:dn="http://www.onvif.org/ver10/network/wsdl"
 xmlns:ns10="http://www.onvif.org/ver10/replay/wsdl"
 xmlns:ns11="http://www.onvif.org/ver10/search/wsdl"
 xmlns:ns13="http://www.onvif.org/ver20/analytics/wsdl/RuleEngineBinding"
 xmlns:ns14="http://www.onvif.org/ver20/analytics/wsdl/AnalyticsEngineBinding"
 xmlns:tan="http://www.onvif.org/ver20/analytics/wsdl"
 xmlns:ns15="http://www.onvif.org/ver10/events/wsdl/PullPointSubscriptionBinding"
 xmlns:ns16="http://www.onvif.org/ver10/events/wsdl/EventBinding"
 xmlns:tev="http://www.onvif.org/ver10/events/wsdl"
 xmlns:ns17="http://www.onvif.org/ver10/events/wsdl/SubscriptionManagerBinding"
 xmlns:ns18="http://www.onvif.org/ver10/events/wsdl/NotificationProducerBinding"
 xmlns:ns19="http://www.onvif.org/ver10/events/wsdl/NotificationConsumerBinding"
 xmlns:ns20="http://www.onvif.org/ver10/events/wsdl/PullPointBinding"
 xmlns:ns21="http://www.onvif.org/ver10/events/wsdl/CreatePullPointBinding"
 xmlns:ns22="http://www.onvif.org/ver10/events/wsdl/PausableSubscriptionManagerBinding"
 xmlns:wsnt="http://docs.oasis-open.org/wsn/b-2"
 xmlns:ns3="http://www.onvif.org/ver10/analyticsdevice/wsdl"
 xmlns:ns4="http://www.onvif.org/ver10/deviceIO/wsdl"
 xmlns:ns5="http://www.onvif.org/ver10/display/wsdl"
 xmlns:ns8="http://www.onvif.org/ver10/receiver/wsdl"
 xmlns:ns9="http://www.onvif.org/ver10/recording/wsdl"
 xmlns:tds="http://www.onvif.org/ver10/device/wsdl"
 xmlns:timg="http://www.onvif.org/ver20/imaging/wsdl"
 xmlns:tptz="http://www.onvif.org/ver20/ptz/wsdl"
 xmlns:trt="http://www.onvif.org/ver10/media/wsdl"
 xmlns:ter="http://www.onvif.org/ver10/error"
 xmlns:tns1="http://www.onvif.org/ver10/topics"
 xmlns:tnsn="http://www.eventextension.com/2011/event/topics">
<SOAP-ENV:Header>
<wsa:MessageID>urn:uuid:327b23c6-5566-7788-99aa-0012152b823d</wsa:MessageID>
<wsa:RelatesTo>uuid:84ede3de-7dec-11d0-c360-f01234567890</wsa:RelatesTo>
<wsa:To SOAP-ENV:mustUnderstand="true">
http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
</wsa:To>
<wsa:Action SOAP-ENV:mustUnderstand="true">
http://schemas.xmlsoap.org/ws/2005/04/discovery/ProbeMatches
</wsa:Action>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<d:ProbeMatches><d:ProbeMatch><wsa:EndpointReference>
<wsa:Address>urn:uuid:327b23c6-5566-7788-99aa-0012152b823d</wsa:Address>
</wsa:EndpointReference>
<d:Types>dn:NetworkVideoTransmitter</d:Types>
<d:Scopes>
onvif://www.onvif.org/type/video_encoder
 onvif://www.onvif.org/type/audio_encoder
 onvif://www.onvif.org/hardware/IPC-model
 onvif://www.onvif.org/location/country/china
 onvif://www.onvif.org/name/NVT
</d:Scopes>
<d:XAddrs>http://192.168.178.39:8899/onvif/device_service</d:XAddrs>
<d:MetadataVersion>1</d:MetadataVersion>
</d:ProbeMatch></d:ProbeMatches>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
... 627 Byte allerfeinstes WebService-WSDL-SOAP-XML-Kauderwelsch !
... wovon mich eigentlich nur interessiert:

<wsa:MessageID>urn:uuid:327b23c6-5566-7788-99aa-0012152b823d</wsa:MessageID>
(gleich mit wsa:Address - immer !?)
<wsa:RelatesTo>uuid:84ede3de-7dec-11d0-c360-f01234567890</wsa:RelatesTo>
(zum Vergleich - die uuid hab ich geschickt)
<d:Scopes> .... </d:Scopes>
(die hier 5 darin entahltenen Typen, durch Leerzeichen getrennt)
... und wichtig
<d:XAddrs>http://192.168.178.39:8899/onvif/device_service</d:XAddrs>
hier eigenlich nur der Port für weitere Ansagen per HTTP. Die IP kenne ich ha schon aus dem eigentlichen Response vom Binding des UDP-Servers.


Als NOOB in diesem Bereich fällt mir als erstes die gute alte funktion POS ein, hier die elementar 3 bis 8 wichtigen Werte mit nem 5-Zeiler rauszubröseln.

Oder hat hemand da vielleicht eine (simplere) Idee ?
Lasst hören !

Geändert von TERWI ( 8. Feb 2016 um 19:30 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz