| Autor |
Beitrag |
pchero
      
Beiträge: 17
|
Verfasst: Mi 12.08.09 15:16
Guten Nabend,
ich habe eine kleine Frage und zwar connecte ich mittels Socket auf ein Gerät und nun will ich einen Befehl in Hex Format an dieses Gerät schicken. Dieses Gerät antwortet denn auch darauf. Ist ja nichts anderen als mit Socket.ReceiveText das mitzulesen oder brauch ich dafür denn auch einen anderen Befehl?
Hab schon gesucht aber nicht zum Thema Hex Code über Delphi und Socket zu verschicken
Gruß
Zuletzt bearbeitet von pchero am Di 18.08.09 10:29, insgesamt 1-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 12.08.09 15:20
Moin!
pchero hat folgendes geschrieben : | | einen Befehl in Hex Format |
Was ist denn ein "Befehl in Hex Format"?  Meinst du Binärdaten? Diese könnte man hexadezimal darstellen, falls du das mit "Hex Format" meinst.
pchero hat folgendes geschrieben : | | Dieses Gerät antwortet denn auch darauf. Ist ja nichts anderen als mit Socket.ReceiveText das mitzulesen oder brauch ich dafür denn auch einen anderen Befehl? |
Sofern es sich um Binärdaten handelt: ja, das geht. Kuckst du.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Do 13.08.09 08:29
also mit Hex meinte ich ein TCP Paket wo der Datensatz
0b:03:f1(1011:11:11110001) aussieht. Dieses habe ich in Wireshark mitgelesen und dieses Paket mit dem Inhalt will ich selber aus Delphi heraus schicken.
Ich lese aber gleich auc nochmal deine pdf durch und schau ob ich da was finden kann was mir erlaubt den Binärcode zu schicken.
Gruß
p.s.
Also das Verschicken habe ich nun hinbekommen wusste nicht das in Delphi Hex mit $ gemacht wird ich hatte es mit 0x ausprobiert. Somit kann ich die Daten über Chr schicken lassen und in Wireshark erscheint das richtige Paket. Gibt es eine Möglichkeit das er Automatisch einen Hex Code in die EInzelnen Teile pakt und über das Chr jagt ?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.08.09 12:25
Moin!
Sorry, aber ich verstehe kein Wort.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Do 13.08.09 12:48
Also ich habe jetzt hinbekommen, das er mir das TCP Paket mit den Daten 0x0b 0x03 0xf1 abschickt.
Dies mache ich jetzt über drei Inputfelder
Delphi-Quelltext 1: 2:
| bin := Chr(strtoint(Hex1.Text))+Chr(strtoint(Hex2.Text))+Chr(strtoint(Hex3.Text)); ClientSocket1.Socket.SendText(bin); |
So nun ist meine Frage, ob man das auch alles in einen Inputfeld machen kann ? oder ob man immer zwangsweise das so in drei Felder trennen muss.
Gruß PcHeRo
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Do 13.08.09 16:14
geht mit einem
du nimmst einfach immer 2 zeichen aus einem string und fertig
also so:
Delphi-Quelltext 1:
| for i:=0 to length(S) do bin:=bin+chr(strtoint('$'+copy(s,i*2+1,2))); |
besser aber das ganze mit einem array zu machen...versuch mal mit deiner variante ne 00 zu senden...(chr(0) is textende)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 13.08.09 20:02
Moin!
Flamefire hat folgendes geschrieben : | | versuch mal mit deiner variante ne 00 zu senden...(chr(0) is textende) |
Wo ist das Problem? Delphi-Strings sind counter-based, nicht 0-terminiert.
Ansonsten gibt´s auch die Funktionen HexToBin() und BinToHex().
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Fr 14.08.09 12:12
Delphi-Quelltext 1:
| for i:=0 to length(S) do bin:=bin+chr(strtoint('$'+copy(s,i*2+1,2))); |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.BtnSendClick(Sender: TObject); var bin : string; i: integer; begin if (ClientSocket1.Active) then begin for i:=0 to length(Hex1.Text) do bin:=bin+chr(strtoint('$'+copy(Hex1.Text,i*2+1,2))); ClientSocket1.Socket.SendText(bin); Log.Lines.Add(bin); end else Log.Lines.Add('Nicht verbunden!'); end; |
sowas ähnliches hatte ich meine ich auch ausprobiert, als ich Überhaupt mit den Hex werten angefangen habe aber diese '$'+ mag er nicht er akzeptiert das denn nicht als hexwert.
also ich möchte z.B in eine Tedit eingeben 0xB9262 und genau diesen block schickt er als Hex ins Netzwerk. Mit drei einzelnen Inputfeldern klappt es ja auch aber ned im gesamten als eine Box.
Wobei es bei Delphi ja ein $ sein muss merkwürdigerweise.
hab auch schon gegoogelt aber auch einges gefunden aber iwie nichts was so richtig hinhaut.
Wenn ich den Hex wert oben über den StrtoInt jage mekert er mir am $ zeichen rum. Oder gibt mir einen Falschen Wert wieder.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var BinMessage: String; function Dump(const S: String): String; var i: Integer; begin Result := ''; for i := 1 to Length(S) do begin Result := Result +IntToHex(Ord(S[i]),2); if ((i mod 12) = 0) then Result := Result +#13#10; end; end; begin BinMessage := Socket.ReceiveText; Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+ Dump(BinMessage)); end; |
Bei den Rückgabewerte bekommt er auch iwas durcheinander.
so kommts zurück in
Wireshark:
0c031700d9
Konsole: 5 Zeichen gelesen:
30C17D94331
Ich bin Leider nicht so der profi wenn es um die ganzen Typen Umwandlungen geht und so =/. Aber ich gebe mein besten. Hauptsächlich is das der Code aus Narses Tutorials schonmal gleich vorweg
Gruß
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 14.08.09 12:43
Moin!
Vorab: IIRC hampelst du dabei mit D2009 rum (MAC-Thread), richtig? In diesem Fall sind alle String-Typen durch AnsiString zu ersetzen, sonst gibt´s Probleme mit dem Unicode-String!
pchero hat folgendes geschrieben : | | also ich möchte z.B in eine Tedit eingeben 0xB9262 und genau diesen block schickt er als Hex ins Netzwerk. |
Der Trick ist, das (für den Leser gedachte) Präfix "0x" oder auch "$" bei der Eingabe wegzulassen (der PC braucht´s eh nicht). Dann könnte das so klappen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.BtnSendClick(Sender: TObject); var hex,bin: String; i: Integer; begin if ClientSocket1.Active then begin bin := ''; hex := Hex1.Text; if Odd(Length(hex)) then hex := '0'+hex; for i := 1 to Length(hex) do bin := bin +Chr(StrToInt('$'+Copy(hex,i*2,2))); ClientSocket1.Socket.SendText(bin); Log.Lines.Add(Hex1.Text); end else Log.Lines.Add('Nicht verbunden!'); end; | cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
Zuletzt bearbeitet von Narses am Fr 14.08.09 14:13, insgesamt 1-mal bearbeitet
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Fr 14.08.09 13:12
| Zitat: | | Exception-Klasse EConvertError mit Meldung "'$" ist kein gültiger Integer-Wert' |
| Zitat: | | aber diese '$'+ mag er nicht |
Die Meldung hatte ich schon einge mal Als ich ausprobiert habe wie ich das noch hinbekommen könnte und ist meine ich auch die selbe die ich vorher auch hatte.
Ja genau der bin ich. Aber soweit ich es sehen kann setzte ich ja keine Stringsvorab. Somit kann ich auch kein Problem damit haben außer einmal das " $ " oder muss ich da auch einen Ansistring vorsetzen ?
Und das es mit der Rückgabe nicht klappt war mir klar  hatte es vergessen wieder rauszunehmen.
Gruß
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 14.08.09 13:14
Moin!
Ups, die Schleife läuft ja viel zu weit:
Delphi-Quelltext 1:
| for i := 1 to Length(hex) shr 1 do | cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Fr 14.08.09 13:37
Net schlimm Narses kann jedem mal passieren =) immerhin kansnt du mir lösungwege nennen und sitzt nicht wie ich mich halbwissen davor
Also hab eben deine Korrecktur noch mit reingenommen aber aus
0B03F1
wird
b03f01
also die gute Nachricht ist er erfindet die Werte schonmal nicht. Aber er mixt sie durch. Wobei ich da kein Muster erkenne wie er dies macht.
Gruß und schonmal sehr vielen dank für deine Hilfen Narses =)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 14.08.09 13:56
Moin!
Delphi-Quelltext 1: 2:
| for i := 0 to (Length(hex) -1) shr 1 do bin := bin +Chr(StrToInt('$'+Copy(hex,(i shl 1) +1,2))); | Was tue ich hier eigentlich  (ich hätte HexToBin() genommen  )
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Mo 17.08.09 09:18
Danke Narses das Sende klappt nun richtig =) ich habe eben mich nochmal mit deinem Tutorial beschäftigt und durchgelesen und so. Momentan häng ich an der Empfangsroutine von dir fest. Ja ich habe sie durchgelesen und versucht
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var BinMessage: String; function Dump(const S: String): String; var i: Integer; begin Result := ''; for i := 1 to Length(S) do begin Result := Result +IntToHex(Ord(S[i]),2); if ((i mod 12) = 0) then Result := Result +#13#10; end; end; begin BinMessage := Socket.ReceiveText; Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+ Dump(BinMessage)); end; |
Und es sieht noch so von dir aus kopiet aus, da ich nicht die Stelle finde, die die Reihenfolge ändert. Also das Datenpaket was ich in Wireshark mitsniffe wird anders in der Box dargestellt. Und zwar auch wieder das einfach nur ein paar Zeichen vertauscht sind.
Gruß PcHeRo
und vielen dank an Narses für seine Hilfe =)=)
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 17.08.09 09:49
Narses hat folgendes geschrieben : | IIRC hampelst du dabei mit D2009 rum (MAC-Thread), richtig? In diesem Fall sind alle String-Typen durch AnsiString zu ersetzen, sonst gibt´s Probleme mit dem Unicode-String!  |
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Mo 17.08.09 10:18
das hatte ich auch schon gemacht, einmal alle Strings zu ansistring umgeändert aber dann kommt das bei raus:
Quelltext 1: 2: 3: 4: 5:
| 0B03F1 35 Zeichen gelesen: 484161616101000000000000 0000000000C6000000000000 0000000000000000000000 |
Also noch weiter vom eigentlich weg. =(
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var BinMessage: Ansistring; function Dump(const S: ansistring): ansistring; var i: Integer; begin Result := ''; for i := 1 to Length(S) do begin Result := Result +IntToHex(Ord(S[i]),2); if ((i mod 12) = 0) then Result := Result +#13#10; end; end; begin BinMessage := Socket.ReceiveText; Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+ Dump(BinMessage)); end; |
Gruß PcHeRo
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 17.08.09 11:04
Moin!
Tja, hier stellt sich jetzt zunächst die Frage: Was sollte denn eigentlich dabei rauskommen (zweifelsfrei)? Ich vermute, du testest direkt am offenen Herzen (also mit diesem "Gerät", was auch immer das ist).
Mach mal zum Test eine Verbindung zwischen zwei Delphi-Programmen. Wie sieht das da aus?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Mo 17.08.09 11:29
also es soll rauskommen:
Quelltext
Es kommt bei raus:
Quelltext
Das was dabei richtig rauskommen soll, lese ich immer mit Wireshark mit. Daher weiß ich auch, das dies oben Falsch ist, was er mir ausgibt.
Die Gesamte Communcation läuft über Hex ab  . Dies wird in ein TCP Paket gepackt und dahin gesendet. Das Gerät schickt ein TCP Paket zurück, auch mit HEX Werten, wo drinne steht wie es ihm geht und all solche Status-sachen.
Das mit den zwischen 2 PC probier ich gleich mal aus.
Gruß PcHeRo
|
|
Flamefire
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Mo 17.08.09 14:03
wie sendest du?
als string (also nicht ansistring)?
dann versuch das ganze mal als string zu empfangen und sag, was er ausgibt.
es sieht nämlich so aus, als wären da die endianformate und stringteile vermischt...
Gesendet:
0C03 1700 D9
empfangen:
030C 0017 00D9 4331
also: die 4331 kommt weil 2x "00" fehlt-->2 bytes zu viel gelesen
und durch falsche endianess wird aus 0C03 dann halt 030C
|
|
pchero 
      
Beiträge: 17
|
Verfasst: Mo 17.08.09 14:37
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| procedure TForm1.BtnSendClick(Sender: TObject); var hex,bin: String; i: Integer; begin if ClientSocket1.Active then begin bin := ''; hex := Hex1.Text; if Odd(Length(hex)) then hex := '0'+hex; for i := 0 to (Length(hex) -1) shr 1 do bin := bin +Chr(StrToInt('$'+Copy(hex,(i shl 1) +1,2))); ClientSocket1.Socket.SendText(bin); Log.Lines.Add(hex); end else Log.Lines.Add('Nicht verbunden!'); end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket); var BinMessage: ansistring; function Dump(const S: ansistring): ansistring; var i: Integer; begin Result := ''; for i := 1 to Length(S) do begin Result := ansistring(Result +IntToHex(Ord(S[i]),2)); if ((i mod 12) = 0) then Result := ansistring(Result +#13#10); end; end; begin BinMessage := ansistring(Socket.ReceiveText); Log.Lines.Add(IntToStr(Length(BinMessage))+' Zeichen gelesen: '+#13#10+ Dump(BinMessage)); end; |
so hatte ich es schon ausprobiert, also den Tipp von Narses gefolgt. Hat aber nicht geholfen. Also habe ich wieder alles mit Ansi weggenommen
Wenn ich es NUR als String empfange kommen nur Striche ? Ist ja auch logisch oder wie meinst du das Flamefire? Ich sende im im Unicode Format glaube ich. Aber das macht für das Gerät meine ich keinen Unterschied wie es antwortet. Ich lese wie gesagt immer in Wireshark mit, da ich sonst die Fehler ja nicht sehen würde und weiß daher auch wenn was Falsches ausgegeben wird oder zurück kommt.
Die Erklärung Flamefire klingt gut. Aber weißt du woher sowas kommen kann? Wieso gibt es in Delphi keine Funktion das ich jetzt einfach das Paket was zurückkommt ausgeben kann. Also eine den Socket.ReceiveText ausgeben lassen kann ? Ohne viel daran rumzubasteln? In wireshark geht das doch auch so leicht.
Oder habe ich deins als String Empfangen falsch umgesetzt ?
Delphi-Quelltext 1: 2:
| BinMessage := string(Socket.ReceiveText); /Auch ansistring probiert da kam aber iwas mit HAaa| oder so Log.Lines.Add(BinMessage); |
Gruß PcHeRo
|
|