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
Benutzerbild von TERWI
TERWI

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

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

  Alt 5. Feb 2016, 13:05
Hab noch mal ein wenig rumgelesen...

Billy Boy Gates lässt hier
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
schreiben:
A Probe message is a WS-Discovery message used by a client to search for services on the network by service type. For more information about Probe messages, see section 5.2 of the WS-Discovery Specification.
A Probe message is sent by UDP multicast to port 3702. Unicast Probe messages are not supported.
DPWS clients send Probe messages. The following list shows scenarios in which WSDAPI will send a Probe message.

Im oben benannten PDF
http://specs.xmlsoap.org/ws/2005/04/...-discovery.pdf
findet man auf Seite 4/5 entsprechendes wieder:
... Probe message multicast by a Client searching for ... (dort Drucker)
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].

Lt. dem Beispiel im ONVIF-Progger-Handbuch (link dazu weiter oben) und Wiki's ist die Multicast-Adresse 239.255.255.250
Als Port bei MS als auch bei ONVIF ist 3207 angegeben.


Nach sehr vielen Jahren hab ich wieder INDY in der letzten Version Indy10_5339 auf das Delphi 7 gepackt, reichlich aus dem Netz abgeguckt betreff UDP und was mit UDPClient/-Server gebastelt. (Grausig, warum es so viele Unterschiede von Indy 9 nach 10 bei den Demos gibt ...)
Code:
unit TestUnit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,
  IdUDPBase, IdUDPServer, IdBaseComponent, IdComponent,
  IdGlobal, IdSocketHandle, IdUDPClient, IdStack;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    EditHost: TEdit;
    Label2: TLabel;
    EditPort: TEdit;
    UDPServer: TIdUDPServer;
    Button1: TButton;
    UDPClient: TIdUDPClient;
    procedure UDPServerUDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// http://stackoverflow.com/questions/15741862/delphi-xe2-indy10-udp-client-server-interchange-using-sendbuffer-receivebuffer

// -----------------------------------------------------------------------------
procedure TForm1.UDPServerUDPRead(AThread: TIdUDPListenerThread;
          const AData: TIdBytes; ABinding: TIdSocketHandle);
begin
  Memo1.Lines.Add(' Server read: ' + ToHex(AData, length(AData)));
//  with ABinding do
//    SendTo(PeerIP, PeerPort, AData);
end;

// -----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  XMLRequest : TStringStream;
  SndBytes,
  RcvBytes  : TIdBytes;
  k : integer;
begin
  Memo1.Clear;
  // Siehe ONVIF Application Programmer's Guide - Seite 14-15
  XMLRequest := TStringStream.Create(
    '<?xml version="1.0" encoding="UTF-8"?>' + #10#13 +
    '<e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope"' + #10#13 +
    'xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing"' + #10#13 +
    'xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"' + #10#13 +
    'xmlns:dn="http://www.onvif.org/ver10/network/wsdl">'+ #10#13 +
    '<e:Header>' + #10#13 +
    '<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID>' + #10#13 +
    '<w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To>' + #10#13 +
    '<w:Action a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</w:Action>' + #10#13 +
    '</e:Header>' + #10#13 +
    '<e:Body>' + #10#13 +
    '<d:Probe>' + #10#13 +
    '<d:Types>dn:NetworkVideoTransmitter</d:Types>' + #10#13 +
    '</d:Probe>' + #10#13 +
    '</e:Body>' + #10#13 +
    '</e:Envelope>');
  SndBytes := RawToBytes(XMLRequest, SizeOf(XMLRequest));
  try
    // Setup UDP-Server:
    with udpServer do
    begin
      Active := false;
      DefaultPort := strtoint(EditPort.text); // DEFAULT: 3702
      BufferSize := 8192;
//      BroadcastEnabled := true; // ??
      ThreadedEvent := true;
      Active := True;
      if Active then
        Memo1.Lines.Add('Server started on port: ' + IntToStr(DefaultPort));
    end;
    // Setup UDP-Client:
    with udpClient do
    begin
      BufferSize := 8192;
      Host := EditHost.Text;;         // DEFAULT: 239.255.255.250
      Port := strtoint(EditPort.text); // DEFAULT: 3702
    end;
    Memo1.Lines.Add(' Client sending Probe-Message');
    with udpClient do SendBuffer(Host, Port, SndBytes);
    try
      k := udpClient.ReceiveBuffer(RcvBytes, 10);
      if k > 0 then
        Memo1.Lines.Add(' Client read: ' + ToHex(RcvBytes, length(RcvBytes)))
      else
        Memo1.Lines.Add(' Client no response !');
    except
      on E: exception do
      begin
        Memo1.Lines.Add(Format(' Client read err: %s',[E.Message]));
      end;
    end;
  except
    on E: Exception do
    begin
      ShowMessage(E.ClassName + ': ' + E.Message);
    end;
  end;
  XMLRequest.Free;
end;

end.
Prinzipiell müsste das meiner bescheidenen Meinung nach funktionieren.
Das Proggy läuft zwar fehlerfrei - ich bekomme allerdings keinerlei Antwort. Gar nix, auch kein Daten-Kauderwelsch.

Was ist (grundsätzlich ?) falsch ?
Was hab ich vergessen ? (Zuweisungen, Einstellung am Client, Server, ...)

Ich alles komplett auch mit EXE angehängt, falls das jemand mal probieren möchte - vielleicht hat ja jemand eine ONVIF-taugliche Kamera o.ä. Gerät in seinem LAN.

Nochmals Hilfe bitte - hier ist mein KnoffHoff eher sehr bescheiden.
Angehängte Dateien
Dateityp: rar TEST_UDP.rar (225,3 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
HolgerX

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

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

  Alt 5. Feb 2016, 13:59
Hmm..

Ich werfe mal ein paar Punkte in den Raum:

Windows-Firewall? Auf dem UDP-Port des UDP-Servers offen, damit dieser überhaupt eine Antwort bekommen kann?

DSL-Router? Forward-Regel, damit die Antwortpakete überhaupt zu deinem Rechner gelangen, wenn abfrage über Internet.

Gibt es überhaupt den abzufragen Service in deinem Netz?
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

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

  Alt 5. Feb 2016, 14:34
Kurz zum Verständnis:

Es geht hier (momentan !) nur um mein Haus-LAN an einer 7490, wo div. Überwachungskameras reingehängt werden sollen (4 sind schon drin).
Die machen geben den "Service".
Kommunikation also nur im eigenen LAN - (noch) nicht aus dem InderNett.

Port 3702 habe ich in der FW pauschal mal freigemacht.

Kleiner Erfolg hier btw.:
Ich habe beim Clienten von SendBuffer() auf Broadcast() geändert.
Damit sieht der Server wenigstens die Message des Clienten - allerdings immer auf Port 1045 statt auf 3702 .... ??
  Mit Zitat antworten Zitat
Benutzerbild von TERWI
TERWI

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

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

  Alt 5. Feb 2016, 14:54
Noch ein paar Anmerkungen, bevor Fragen kommen wie:
".... wozu das eigentlich ? Die IP's der Kameras solltest du doch kennen - warum fragst du die nicht direkt (via TCP ?!) ab ?"

Sicherlich berechtigte Frage. Aber:
Soweit ich das bisher verstanden habe, sind mit WS-Discovery auch "Geräte" zu ermitteln, die nicht im IP-Breich des Routers liegen - aber im LAN erreichbar sind/wären.

Z.B. ein frisches China-Teil kommt immer irgendwie mit 192.168.0.1-10
Erstaunlicherweise erkennt die mitgelieferte PingPong-Soft diese CAMs trotzdem und man kann selbige dann auf die gewünschte IP (oder mit DCHP) umstellen.

Das wäre nur die "PROBE" Message.
Dann gibt es ja auch noch "HELLO", wenn sich so ein Gerät im Netz (neu !?) von selbst anmeldet.
Oder auch das "BYE", wenn man ein solches Gerät bewusst z.B. in StandBy schickt.

Auch diese Messages auszuwerten (ohne Ansage von einem Clienten) wäre sehr wünschenswert.
.... nur wie geht das ?

Geändert von TERWI ( 5. Feb 2016 um 15:00 Uhr)
  Mit Zitat antworten Zitat
HolgerX

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

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

  Alt 5. Feb 2016, 17: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
 
#6

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

  Alt 6. Feb 2016, 11: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
 
#7

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

  Alt 6. Feb 2016, 18: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
Antwort Antwort

 

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 01:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz