![]() |
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... |
AW: TCP persistent
Und wenn Du zu jedem Befehl das Login mitschickst?
Sherlock |
AW: TCP persistent
Zitat:
|
AW: TCP persistent
Guten Morgen,
hast Du keine Doku zu dem Protokoll? Da sollte doch etwas drin stehen. Grüße Klaus |
AW: TCP persistent
Guten Morgen,
Zitat:
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. |
AW: TCP persistent
Zitat:
Sherlock |
AW: TCP persistent
Zitat:
|
AW: TCP persistent
Lass mich raten...
KNX? |
AW: TCP persistent
Zitat:
Es ist AnB. |
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? |
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 |
AW: TCP persistent
Zitat:
|
AW: TCP persistent
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
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 |
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.
|
AW: TCP persistent
Zitat:
|
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 |
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. |
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:
Wie bekomme ich dieses in eine prozedur zum senden bzw emfpangen wobei man IDTo wechseln kann ?{ 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) } mfg Jeng |
AW: TCP persistent
Hallo,
vom Prinzip könnte man es so auffassen:
Code:
Der Header könnte so aussehen:
<Header><Data><Trailer>
Delphi-Quellcode:
data ist dann ein byteArray ( Array of Byte, Größe Lng-1)
header = record
STX : Byte; // ansiChar IdTo: Byte; IdFrom: Byte; Lng: Byte; end; 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 |
AW: TCP persistent
Danke Klaus,
Ich versuch's mal auf diese weise! mfg Jeng |
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:
Hier dann die Indy version mit IdTcpClient. (funktionniert leider nicht)
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;
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; |
AW: TCP persistent
Dieses funktionniert leider auch nicht!
Was mache ich Falsch?
Delphi-Quellcode:
obwohl im buf die richtige bytefolge gesendet wird. :wall:
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 |
AW: TCP persistent
.. und wie schaut es mit
Delphi-Quellcode:
aus?
idTCPClient1.IOHandler.Write(buf,17);
Grüße Klaus |
AW: TCP persistent
Zitat:
|
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 |
AW: TCP persistent
Zitat:
Sie kommt auch an, ich sehe das am flackern der led's. Zitat:
Es ist echt zum verzweifeln, weil es ja mit der socks komponente funst. Ich brauche aber die Indy kompo wegen Android. |
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 |
AW: TCP persistent
Zitat:
Danke, Ich mach mich mal gleich ans werk. |
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. |
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 |
AW: TCP persistent
Zitat:
Delphi-Quellcode:
Beim break point hat port1on: #4#1#2'#<'#0#$A#1'ÿ'#0#0#0#0#0#0#0'þ'
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 Edit: was richtig ist! |
AW: TCP persistent
Mache aus dem String ein AnsiString.
Bei den socks verwendest du auch AnsiStrings. Grüße Klaus |
AW: TCP persistent
Zitat:
Delphi-Quellcode:
Hmm geht auch nicht... :wall: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 |
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? |
AW: TCP persistent
Zitat:
mit port1on : AnsiString; geht es auch nicht. |
AW: TCP persistent
Funktionert denn
Delphi-Quellcode:
?
IdTcpClient1.IOHandler.WriteLn(port1On)
|
AW: TCP persistent
Zitat:
Code:
Ich habs auch so rum probiert und es klappt auch nicht.
0000003B 04 01 02 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 ...#<... ........
0000004B fe 0d 0a
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) |
AW: TCP persistent
.. versuche es mal so:
Delphi-Quellcode:
Am Ziel kommt dann das an:
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;
Code:
Grüße
0000000: 0401 0223 3c00 0a01 ff00 0000 0000 0000
0000010: fe0d 0a Klaus |
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:
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! |
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. |
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