Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TCP persistent (https://www.delphipraxis.net/186049-tcp-persistent.html)

jeng37 30. Jul 2015 07:15

TCP persistent
 
Ein freundliches Hallo

Bin noch neu Hier,

Ich leg dann aber mal gleich Los.
Ich habe das problem, dass ich an eine electronik verschiedene hex codes senden möchte um relais ein oder auszuschalten.
Ich benutze dafür TidTCPClient und komme ich nicht weiter.
Ich sende meine Login daten und bekomme auch die bestätigung zurück dass ich verbunden bin.
Nun bin ich ja verbunden, jetzt schicke ich mein hex folge an den server um die ports an bzw. aus zuschalten, und da ist das problem, ich bekomme keine antwort mehr.
Ich habe ein programm zum testen (packetsender) wenn ich da auf "Presistent TCP" schalte dann klappt das auch! Wenn ich aber aus dem programm, nach dem login die befehle normal sende bekomme ich auch keine Antwort.

Also das gleiche phenomen das ich jetzt auch habe.


Ich weiss nich ob ich mich richtig ausdrücke... weiss auch nicht wie ich das im fach jargon benennen kann.
Ich währe dankbar für einen gedanken anstoss...

Sherlock 30. Jul 2015 07:17

AW: TCP persistent
 
Und wenn Du zu jedem Befehl das Login mitschickst?

Sherlock

jeng37 30. Jul 2015 07:21

AW: TCP persistent
 
Zitat:

Zitat von Sherlock (Beitrag 1310252)
Und wenn Du zu jedem Befehl das Login mitschickst?

Sherlock

Dann muss Ich ja bei jedem port den ich schalten bzw. dimmen möchte jedes mal die Login daten mitschicken.

Klaus01 30. Jul 2015 07:48

AW: TCP persistent
 
Guten Morgen,

hast Du keine Doku zu dem Protokoll?
Da sollte doch etwas drin stehen.

Grüße
Klaus

jeng37 30. Jul 2015 08:02

AW: TCP persistent
 
Guten Morgen,
Zitat:

Zitat von Klaus01 (Beitrag 1310258)
hast Du keine Doku zu dem Protokoll?
Da sollte doch etwas drin stehen.

Hallo Klaus,

Ja das währe doch zueinfach, nein habe ich leider nicht.
Ich habe alles was ich brauche per wireshark ausgetestet.
Die Firma gibt die Techniche infos nicht raus.

Sherlock 30. Jul 2015 08:17

AW: TCP persistent
 
Zitat:

Zitat von jeng37 (Beitrag 1310254)
Zitat:

Zitat von Sherlock (Beitrag 1310252)
Und wenn Du zu jedem Befehl das Login mitschickst?

Sherlock

Dann muss Ich ja bei jedem port den ich schalten bzw. dimmen möchte jedes mal die Login daten mitschicken.

Und das ist schlecht weil...?

Sherlock

jeng37 30. Jul 2015 08:32

AW: TCP persistent
 
Zitat:

Zitat von Sherlock (Beitrag 1310265)
Und das ist schlecht weil...?

Habs gerade versucht, und klappt auch nicht!

Mavarik 30. Jul 2015 08:51

AW: TCP persistent
 
Lass mich raten...

KNX?

jeng37 30. Jul 2015 08:57

AW: TCP persistent
 
Zitat:

Zitat von Mavarik (Beitrag 1310272)
Lass mich raten...

KNX?

:)Nein leider nicht. Ist ein Italienisches Produckt, nein auch kein BTicino :).
Es ist AnB.

jeng37 30. Jul 2015 14:09

AW: TCP persistent
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier mal zum Veranschaulichen.

Screen1

Oben rechts muss ich persitent TCP anklicken! "sonst gehts nicht"
Dann sende ich die login daten un es kommt ein popup fenster.

Screen2
In dem Fenster kommt die Antwort der Karte mit "V056".
Damit bin ich verbunden.
Jetzt sende ich TCP-Exo1-Port1-On und das modul schaltet.


Wer kann mir das näher erklären was da geschieht?

Klaus01 30. Jul 2015 14:24

AW: TCP persistent
 
Hallo,

TCP hält ja eigentlich von Hause aus die Verbindung offen. Warum dann persistent?

Schließt das Relay-Board die Verbindung wieder? (sollte im Wireshark trace sichtbar sein).
Erwartet das Board "Keep-Alive" Messages um die TCP Verbindung offen zu halten? (sollte auch im Wireshark trace sichtbar sein)

Grüße
Klaus

BUG 30. Jul 2015 14:32

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1310357)
Schließt das Relay-Board die Verbindung wieder? (sollte im Wireshark trace sichtbar sein).

Es könnte durchaus sein, dass das Board pro Verbindung nur einmal Authentifizierung+Befehl annimmt und dann die Verbindung schließt.

jeng37 30. Jul 2015 14:38

AW: TCP persistent
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Klaus01 (Beitrag 1310357)
Hallo,

TCP hält ja eigentlich von Hause aus die Verbindung offen. Warum dann persistent?

Ja das ist die Frage.

Zitat:

Schließt das Relay-Board die Verbindung wieder? (sollte im Wireshark trace sichtbar sein).
Nei dei verbindung bleibt offen!

Zitat:

Erwartet das Board "Keep-Alive" Messages um die TCP Verbindung offen zu halten? (sollte auch im Wireshark trace sichtbar sein)
Scheinbar nicht. Ich hab mal einen trace angehängt! Sieht nicht gerade top aus als txt, ich kann auch einen Wireshark dump reinstellen bei bedarf.
Port an: 04 01 02 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe
Port aus: 04 01 02 23 3c 00 0a 01 00 00 00 00 00 00 00 00 01

BUG 30. Jul 2015 14:52

AW: TCP persistent
 
Was ist mit den "05 01"-Sequenzen? Ich vermute, dass es eine Art Statusabfrage ist ... könnte doch durchaus als Heartbeat verwendet werden.

jeng37 30. Jul 2015 14:57

AW: TCP persistent
 
Zitat:

Zitat von BUG (Beitrag 1310364)
Was ist mit den "05 01"-Sequenzen? Ich vermute, dass es eine Art Statusabfrage ist ... könnte doch durchaus als Heartbeat verwendet werden.

Ja stimmt das ist die Statusabfrage.

jeng37 30. Jul 2015 15:49

AW: TCP persistent
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein Sauberer Wireshark Dump.
Wenn einer Lust hat mir das Licht Auszuknippsen:)

Filter:
IP: 188.115.10.88
TCP Port: 6354

jeng37 31. Jul 2015 06:51

AW: TCP persistent
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich setzte mal mein test Projekt rein.
Es war anfangs eine chat demo.
Ich hab diese umgebaut.

jeng37 7. Aug 2015 14:10

AW: TCP persistent
 
Hallo,

Ich hab endlich eine kleine beschreibung vom Hersteller der Karte bekommen.
Vieleicht kann mir damit jetzt besser jemand weiterhelfen.
Delphi-Quellcode:

{
Frame:(STX)(IDto)(IDFrom)(Lng max 128)(DATA max 128)(LRC)


STX='#'          1 byte
IDTo=0..255       1 byte
IdFrom=0..255     1 byte
Lng=2..128        1 byte Lng=DATA length+LRC
DATA=0…255        Lng-1 bytes
LRC=0…255         XOR all DATA (DATA0 xor DATA1 xor … DATA lng-1)
}
Wie bekomme ich dieses in eine prozedur zum senden bzw emfpangen wobei man IDTo wechseln kann ?

mfg
Jeng

Klaus01 7. Aug 2015 16:11

AW: TCP persistent
 
Hallo,

vom Prinzip könnte man es so auffassen:

Code:
<Header><Data><Trailer>
Der Header könnte so aussehen:

Delphi-Quellcode:
header = record
  STX : Byte; // ansiChar
  IdTo: Byte;
  IdFrom: Byte;
  Lng: Byte;
end;
data ist dann ein byteArray ( Array of Byte, Größe Lng-1)

trailer: Byte;

Beim Empfangen wertestDu erst den Header aus.
Abhängig von der Anzahl der Datenbytes (header.Lng -1)
werden die Daten gelesen.
Anschliessend wird der Trailer gelesen.
Aus den empfangenen Daten wird ein neuer LRC gebildet.
Dieser LRC wird mit dem empfangenen verglichen.
Stimmen sie überein sind die Daten ok.

Grüße
Klaus

jeng37 7. Aug 2015 17:11

AW: TCP persistent
 
Danke Klaus,
Ich versuch's mal auf diese weise!

mfg
Jeng

jeng37 19. Aug 2015 02:35

AW: TCP persistent
 
Hallo,

Ich habs am laufen!
Nur wieso funktionniert es mit der socket compo. und nicht mit der Indy?

Hier die socket version mit der es funktionniert!
Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
  var
    Data: AnsiString;
begin
  Data := #$04#$01#$02#$23#$3c#$00#$0a#$01#$ff#$00#$00#$00#$00#$00#$00#$00#$fe; // Nachricht zusammenbauen, z.B. schalten
  Memo1.Lines.Add('Send2: '+Str2Hex(Data));
  ClientSocket1.Socket.SendText(Data);
end;
Hier dann die Indy version mit IdTcpClient. (funktionniert leider nicht)
Delphi-Quellcode:
procedure TfrmMain.Button2Click(Sender: TObject);
Var
  port1on: string;
begin
  port1on := #$04#$01#$02#$23#$3c#$00#$0a#$01#$ff#$00#$00#$00#$00#$00#$00#$00#$fe;
  IdTCPClient1.IOHandler.Write(port1on);
end;

jeng37 20. Aug 2015 11:31

AW: TCP persistent
 
Dieses funktionniert leider auch nicht!
Was mache ich Falsch?

Delphi-Quellcode:
Procedure TFClient.BSendClick(Sender: TObject);
Var
    buf: TidBytes;
 

begin
  SetLength(Buf, 17);
  FillBytes(Buf, 17, 0);
  Buf[0] := $04;
  Buf[1] := $01;
  Buf[2] := $02;
  Buf[3] := $23;
  Buf[4] := $3c; // para1; //Exo1
  Buf[5] := $00;
  Buf[6] := $0a;
  Buf[7] := $01;
  Buf[8] := $ff;//port1;
  Buf[9] := $00;//port2;
  Buf[10] := $00;//port3;
  Buf[11] := $00;//port4;
  Buf[12] := $00;//port5;
  Buf[13] := $00;//port6;
  Buf[14] := $00;//port7;
  Buf[15] := $00;//port8;
  Buf[16] := $fe;//para3;
 
  //IdTCPClient1.IOHandler.Write(Buf); <---- geht nicht
  IdTCPClient1.Socket.Write(buf); <---- geht auch nicht
obwohl im buf die richtige bytefolge gesendet wird. :wall:

Klaus01 20. Aug 2015 12:27

AW: TCP persistent
 
.. und wie schaut es mit

Delphi-Quellcode:
idTCPClient1.IOHandler.Write(buf,17);
aus?

Grüße
Klaus

jeng37 20. Aug 2015 17:01

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1312862)
.. und wie schaut es mit

Delphi-Quellcode:
idTCPClient1.IOHandler.Write(buf,17);
aus?

Nein leider hilft das auch nicht.

Klaus01 20. Aug 2015 18:57

AW: TCP persistent
 
.. bekommst Du eine Fehlermeldung - in Deinem Programm oder in der entfernten Anwendung?

Der Client hat sivh auch mit dem Server verbunden bevor Du die Nachricht abschickst - oder?

Grüße
Klaus

jeng37 20. Aug 2015 19:04

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1312928)
.. bekommst Du eine Fehlermeldung - in Deinem Programm oder in der entfernten Anwendung?

Nein gar keine Fehlermeldung. Wenn ich einnen Break Point stetze steht auch die richtige bytefolge in Buf.
Sie kommt auch an, ich sehe das am flackern der led's.

Zitat:

Der Client hat sivh auch mit dem Server verbunden bevor Du die Nachricht abschickst - oder?
Ja die verbindung steht auch, ich sende zuerst einnen connect, danach einen login, und bekomme die variable v056 zurück. Damit weiss ich dass connect und login ok waren.

Es ist echt zum verzweifeln, weil es ja mit der socks komponente funst.
Ich brauche aber die Indy kompo wegen Android.

Klaus01 20. Aug 2015 19:11

AW: TCP persistent
 
Hast Du eine Möglichkeit die übertragenen Daten zu tracen (mit Wireshark z.B.).
Einmal mit socks und einmal mit indy versandt.

Vielleicht zeigen sich ja Unterschiede.

Grüße
Klaus

jeng37 20. Aug 2015 19:15

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1312930)
Hast Du eine Möglichkeit die übertragenen Daten zu tracen (mit Wireshark z.B.).
Einmal mit socks und einmal mit indy versandt.

Vielleicht zeigen sich ja Unterschiede.

Ja gute idee, das hab ich noch nicht versucht!
Danke,
Ich mach mich mal gleich ans werk.

jeng37 20. Aug 2015 19:29

AW: TCP persistent
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier das resultat.

Indy Dump:
bytefolge die ich sende: 04 01 02 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe
Und das modul schaltet nicht!!

Socks Dump:
bytfolge die ich sende: 04 01 02 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe
Da wird aber irgendwie noch zwei bytes angehängt!
Und zwar 0d 0a. CR/LF
Ergibt also : 04 01 02 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe 0d 0a
Und das modul schaltet!!

Soll/kann das mein problem sein?
Hab die zwei dumps mal angehängt.

Edit: Hab auch die zwei bytes in buf beigefügt und länge angepasst, schaltet trotzdem nicht.

Klaus01 20. Aug 2015 20:26

AW: TCP persistent
 
Bei dem Versand mit sock verwendest Du SendText, das wird wohl cr/LF anfügen.
Bei Indy sollte es etwas ähnliches geben.. writeLn z.b.

Grüße
Klaus

jeng37 20. Aug 2015 21:01

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1312937)
Bei dem Versand mit sock verwendest Du SendText, das wird wohl cr/LF anfügen.
Bei Indy sollte es etwas ähnliches geben.. writeLn z.b.

schaltet immer noch nicht.

Delphi-Quellcode:
procedure TFClient.BSendClick(Sender: TObject);
Var
    Port1on : String;
begin
 port1on := #$04#$01#$02#$23#$3c#$00#$0a#$01#$ff#$00#$00#$00#$00#$00#$00#$00#$fe;
 IdTCPClient1.IOHandler.Writeln(String(port1on), IndyTextEncoding_OSDefault);
 sleep(99); //<--- um einen break point zu setzen
Beim break point hat port1on: #4#1#2'#<'#0#$A#1'ÿ'#0#0#0#0#0#0#0'þ'
Edit: was richtig ist!

Klaus01 21. Aug 2015 04:55

AW: TCP persistent
 
Mache aus dem String ein AnsiString.
Bei den socks verwendest du auch AnsiStrings.

Grüße
Klaus

jeng37 21. Aug 2015 13:21

AW: TCP persistent
 
Zitat:

Zitat von Klaus01 (Beitrag 1312952)
Mache aus dem String ein AnsiString.
Bei den socks verwendest du auch AnsiStrings.


Delphi-Quellcode:

procedure TFClient.BSendClick(Sender: TObject);
Var
    Port1on : String;
       iSend: AnsiString;
           i: Integer;
begin
 port1on := #$04#$01#$02#$23#$3c#$00#$0a#$01#$ff#$00#$00#$00#$00#$00#$00#$00#$fe;
  SetLength(iSend, Length(port1on));
  for i := 0 to Length(port1on) do
  begin
    iSend[i] := AnsiChar(port1on[i]);
  end;
   IdTCPClient1.IOHandler.Writeln(iSend);
 sleep(99); //<--- um einen break point zu setzen
Hmm geht auch nicht... :wall:

Dejan Vu 22. Aug 2015 08:59

AW: TCP persistent
 
Was steht denn in iSend drin? Wieso ist Portion ein 'string' und 'iSend' ein AnsiString?

Bei einem String ist jedes Zeichen 2 Bytes lang und wenn Du nun so ein 2-Byte-Zeichen auf einen 'AnsiChar' castest, dann passt das nicht.

Also?

jeng37 22. Aug 2015 10:24

AW: TCP persistent
 
Zitat:

Zitat von Dejan Vu (Beitrag 1313061)
Was steht denn in iSend drin? Wieso ist Portion ein 'string' und 'iSend' ein AnsiString?

Bei einem String ist jedes Zeichen 2 Bytes lang und wenn Du nun so ein 2-Byte-Zeichen auf einen 'AnsiChar' castest, dann passt das nicht.

Also?

Hmm ich stehe auf dem schlauch...:oops:

mit port1on : AnsiString; geht es auch nicht.

Dejan Vu 22. Aug 2015 11:09

AW: TCP persistent
 
Funktionert denn
Delphi-Quellcode:
IdTcpClient1.IOHandler.WriteLn(port1On)
?

jeng37 22. Aug 2015 11:13

AW: TCP persistent
 
Zitat:

Zitat von Dejan Vu (Beitrag 1313069)
Funktionert denn
Delphi-Quellcode:
IdTcpClient1.IOHandler.WriteLn(port1On)
?

Ja hier die ausgabe von Wireshark:
Code:
0000003B 04 01 02 23 3c 00 0a 01  ff 00 00 00 00 00 00 00 ...#<... ........
0000004B fe 0d 0a
Ich habs auch so rum probiert und es klappt auch nicht.
Delphi-Quellcode:
  str := '\04\01\02#<\00\n\01\ff\00\00\00\00\00\00\00\fe';
 Data := AnsiString(str);
  IdTcpClient1.IOHandler.WriteLn(Data)

Klaus01 22. Aug 2015 20:04

AW: TCP persistent
 
.. versuche es mal so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  data: TidBytes;

begin
  idTCPClient1.Port := 49151;
  idTCPClient1.Host := '192.168.80.133';
  idTCPClient1.Connect;
  if idTCPClient1.Connected then
    begin
      setLength(data,17);
      data[0] := $04;
      data[1] := $01;
      data[2] := $02;
      data[3] := $23;
      data[4] := $3c;
      data[5] := $00;
      data[6] := $0a;
      data[7] := $01;
      data[8] := $ff;
      data[9] := $00;
      data[10] := $00;
      data[11] := $00;
      data[12] := $00;
      data[13] := $00;
      data[14] := $00;
      data[15] := $00;
      data[16] := $fe;

      idTCPClient1.IOHandler.Write(data);
      idTcpClient1.IOHandler.WriteLn();
      idTCPClient1.Disconnect;
    end;
end;
Am Ziel kommt dann das an:
Code:
0000000: 0401 0223 3c00 0a01 ff00 0000 0000 0000 
0000010: fe0d 0a
Grüße
Klaus

jeng37 24. Aug 2015 18:18

AW: TCP persistent
 
.. versuche es mal so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  data: TidBytes;

begin
  idTCPClient1.Port := 49151;
  idTCPClient1.Host := '192.168.80.133';
  idTCPClient1.Connect;
  if idTCPClient1.Connected then
    begin
      setLength(data,17);
      data[0] := $04;
      data[1] := $01;
      data[2] := $02;
      data[3] := $23;
      data[4] := $3c;
      data[5] := $00;
      data[6] := $0a;
      data[7] := $01;
      data[8] := $ff;
      data[9] := $00;
      data[10] := $00;
      data[11] := $00;
      data[12] := $00;
      data[13] := $00;
      data[14] := $00;
      data[15] := $00;
      data[16] := $fe;

      idTCPClient1.IOHandler.Write(data);
      idTcpClient1.IOHandler.WriteLn();
      idTCPClient1.Disconnect;
    end;
end;
Zitat:

Zitat von Klaus01 (Beitrag 1313089)
Am Ziel kommt dann das an:
Code:
0000000: 0401 0223 3c00 0a01 ff00 0000 0000 0000 
0000010: fe0d 0a
Grüße
Klaus

Erst mal Danke an Dich für deine Mühe!
Ich habs auch schon auf diese weise versucht, aber est will einfach nicht klappen.
Ich gebe es jetzt auf mit der Indy Kompo. Ich benutze die synapse, diese funktionniert auf anhieb!:dancer:
wie gesagt, Danke nochmals für deine und all denen anderen Ihre Hilfe!

Dejan Vu 25. Aug 2015 06:50

AW: TCP persistent
 
Und 'WriteLn' war richtig?

PS: Nicht, das Du jetzt für den Rest Deines Lebens denkst: 'Indy' sind Schrott, die funktionieren nicht. Das ist nämlich falsch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr.
Seite 1 von 2  1 2      

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