AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Daten aus TClientSocket verarbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

Daten aus TClientSocket verarbeiten

Ein Thema von js747a · begonnen am 19. Jan 2021 · letzter Beitrag vom 20. Jan 2021
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Daten aus TClientSocket verarbeiten

  Alt 19. Jan 2021, 20:39
.. Deine IP Adresse ist in der Zentral hinterlegt worden?
Lauscht Du auf Port 15730 TCP oder UDP.
Laut Text schickt die Zentrale UDP Pakete.

Für die 13 Byte wäre ein Record zum Schreiben und Lsene vielleicht besser?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
js747a

Registriert seit: 11. Aug 2008
Ort: Nord hessen
43 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Daten aus TClientSocket verarbeiten

  Alt 19. Jan 2021, 21:07
Meine IP Adresse ist in der Zentral hinterlegt worden
Ich Lausche Du auf Port 15730 TCP

Laut Text schickt die Zentrale UDP Pakete. Aber mann kan auch über TCP zenden. Die zentrale reagiert ja.

Wie könnte ich das über UDP machen.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 06:13
Guten Morgen,

für UDP Daten gibt es TIdUdpClient und TIdUdpServer.
Ob etwas auf Deinem Port 15730 ankommt, kannst Du auch mit Hilfe von Wireshark feststellen.
Dort kannst Du dann auch sehen, ob die Daten auf TCP oder UDP daher kommen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#4

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 06:43
Meine IP Adresse ist in der Zentral hinterlegt worden
Ich Lausche Du auf Port 15730 TCP
Du schreibst aber etwas von CS2ClientSocketSendRead. Wenn du auf dem Port lauschen möchtest, brauchst du aber einen TServerSocket oder eben die Indy Alternative TIdTcpServer bzw. TIdUdpServer.

Wenn du das nicht kommerziell machst, wäre auch ein Update auf eine aktuelle Delphiversion (Delphi Community Edition) sinnvoll, auch wenn die Funktionalität auch mit Delphi 7 klappen würde. Aber warum ein neues Projekt mit einer so alten Delphiversion beginnen?
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
js747a

Registriert seit: 11. Aug 2008
Ort: Nord hessen
43 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 16:13
Ich habe schon mal Delpi 10.3 installiert und ausprobiert. Da ich in Meinem Programm zur steuerung auch andere Zentralen habe brauch ich auch einen Comport zugriff.
Das habe ich mit Delphi 10.3 versucht aber die Daten die ich dort bekam waren nicht wie in Delphi 7.
Etwas mit der veränderung der Variabelen ab Delphi 9 glaub ich. AnsiString und AnsiChar


https://www.delphipraxis.net/204574-...ml#post1466719

Deshab bin ich wieder zu Delphi 7 zurück.

Ich verwende ein TClientSocket und damit kann ich nachrichten schicken die von der zentrale erkannt werden.
Die Zentrale musste mir dieselbe nachricht, nur 1 Byte verändert wieder zuruck schicken. Ich sehe aber keine Antwort.


###Meine Senden Procedure
Var i : Integer;
mySendingString : String;
myDLC : Byte; //Anzahl der Datenbytes im CAN-Paket, 1 Byte
myPrio : Byte; //Priorität des befehls
myResponseBit : Byte; // wenn wir als PC-Programm senden, ist dieses Bit immer 0
myStartWord : SmallInt; // die Kombination aus Prio, Command und Responsebit
myUID : Integer; // Zieladresse des Objektes auf dem CAN, 32 Bits
myHash : SmallInt; // unser Hash, 16 Bits
myCommand : Byte; // unser Befehl, 8 Bits
mySubCommand : Byte; // unser Unterbefehl, 8 Bits
myDataBytes : Array[0..7] of Byte; // array[0..7] of Byte,

begin
myPrio := 0; // Byte - wir haben keine Priorität immer 0
myCommand := 0; // Byte - 0x00 = 0 Systembefehl
mySubCommand := 1; // Power ON - System Go (0x01)
myHash := 18193; // SmallInt - wie im Beispiel, kann aber auch &h0300 sein (als Minimum)
myDLC := 5; // Byte
myUID := 0; // Integer - UID = 0 bedeutet: sende den Befehl an alle
for i := 0 to 7 do myDataBytes[i] := 0; //Märklins Doku zählt auch von D0 .. D7

myStartWord := ( ((myPrio SHL 12) + (myCommand SHL 1) + (myResponseBit AND 1)) AND 255 );
myDataBytes[0] := ((myUID SHR 24) AND 255); // Big Endian encoding
myDataBytes[1] := ((myUID SHR 16) AND 255);
myDataBytes[2] := ((myUID SHR 8) AND 255);
myDataBytes[3] := (myUID AND 255);
myDataBytes[4] := mySubCommand;

mySendingString := Chr((myStartWord SHR 8) AND 255) + Chr(myStartWord AND 255);
mySendingString := mySendingString + Chr((myHash SHR 8) AND 255) + Chr(myHash AND 255);
mySendingString := mySendingString + Chr(myDLC AND 255);
for i := 0 to 7 do mySendingString := mySendingString + Chr(myDataBytes[i] AND 255);

ClientSocket1.Socket.SendText(mySendingString );
###

Antwort in
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
Begin
CS2MeldungenMemo.lines.add('Empfangen : ' + Socket.ReceiveText);
End;

Die Antwort sollte immer Ursprünglicher Befehl mit gesetztem Response Bit sein.

Wie zerlege ich die antwort wieder in Bytes.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 16:24
.. in Delphi 10.3 sind Character 2 Byte groß (UniCode).
Die Strings die Du nun verschickst enthalten das doppelte der 13 Bytes.
Verabschiede Dich bitte von Strings bei der Datenübertragung (auf dem Layer 4)-
da wird in der Regel mit Bytes gearbeitet.

Wie schon mal angemerkt, versuche es mal mit einem Datenrecord.

Grüße
Klaus
Klaus

Geändert von Klaus01 (20. Jan 2021 um 16:28 Uhr)
  Mit Zitat antworten Zitat
js747a

Registriert seit: 11. Aug 2008
Ort: Nord hessen
43 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 19:31
Danke ich muss mir das noch mal ansehen.
Im Moment kann ich die Antwort in Bytes umwandeln und anzeigen.

Gruß John
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#8

AW: Daten aus TClientSocket verarbeiten

  Alt 20. Jan 2021, 20:02
Hier mal ein Beispiel mit Indy und ohne dieses ganze String-Gehampel:
Delphi-Quellcode:
procedure TFormX.SendCommand(
  const APrio: Byte; //Priorität des befehls
  const ACommand: Byte; // unser Befehl, 8 Bits
  const ASubCommand: Byte; // unser Unterbefehl, 8 Bits
  const AHash: SmallInt; // unser Hash, 16 Bits
  const ADLC: Byte; //Anzahl der Datenbytes im CAN-Paket, 1 Byte
  const AUID: Integer; // Zieladresse des Objektes auf dem CAN, 32 Bits
  const AResponseBit: Byte); // wenn wir als PC-Programm senden, ist dieses Bit immer 0
var
  StartWord: SmallInt; // die Kombination aus Prio, Command und Responsebit
  CommandBytes: TIdBytes;
begin
  SetLength(CommandBytes, 13);
  StartWord := ( ((APrio SHL 12) + (ACommand SHL 1) + (AResponseBit AND 1)) AND 255 );
  CommandBytes[0] := (StartWord SHR 8) AND 255;
  CommandBytes[1] := StartWord AND 255;
  CommandBytes[2] := (AHash SHR 8) AND 255;
  CommandBytes[3] := AHash AND 255;
  CommandBytes[4] := ADLC AND 255;
  CommandBytes[5] := ((AUID SHR 24) AND 255); // Big Endian encoding
  CommandBytes[6] := ((AUID SHR 16) AND 255);
  CommandBytes[7] := ((AUID SHR 8) AND 255);
  CommandBytes[8] := (AUID AND 255);
  CommandBytes[9] := ASubCommand;
  CommandBytes[10] := 0;
  CommandBytes[11] := 0;
  CommandBytes[12] := 0;

  IdTCPClient.IOHandler.Write(CommandBytes);
end;

// Aufruf:
  SendCommand(0, // Byte - wir haben keine Priorität immer 0
    0, // Byte - 0x00 = 0 Systembefehl
    1, // Power ON - System Go (0x01)
    18193, // SmallInt - wie im Beispiel, kann aber auch &h0300 sein (als Minimum)
    5, // Byte
    0, // Integer - UID = 0 bedeutet: sende den Befehl an alle
    0);
Sebastian Jänicke
AppCentral
  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 06:46 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