NEWS
Problem mit Konvertierung von Buffer()
-
Da "Buffer" alles mögliche enthalten können wäre ich mit logging von "buf" vorsichtig weil Du nicht weisst wie er das ausgibt. Ich kann mir gut vrostellen das er das erste Zeichen als ASCII erkennt und deswegen von Text ausgeht.
am besten
> buf.toString('hex');
nutzen:
-
Alles schon probiert. Ich sitze heute bereits ungelogen 9 Std. an dem einen Problem.
Ich lasse Wireshark mitlaufen und im Debug vom ioBroker Log alles ausgeben.
Egal, wie ich es kodiere, es kommt NIE das raus, was ich möchte.
Ich prüfe sogar, ob der String utf ist
if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))
-
Warm sollten es denn Strings sein? da ist 0x05 und 0x00 dabei, das sind keine sinnvollen Zeichen … Damit ist ein Vergleich auf "String"-Ebene sehr schwierig
-
Es sollen keine Strings sein.
Das Gerät auf der anderen Seite reagiert und sendet Hexadezimale Werte.
Ich sende 16 00 00 ohne Probleme.
Beim Wert: "41 05 00 01 55 25 02 82" moniert er einzig das Byte 82. Lasse ich das weg, wird der ganze Wert korrekt übertragen. (Es fehlt halt leider nur die 82)
die 82 konvertiert er in "ef bf bd".
Kurzum: Grundsätzlich funktioniert es. Nur komischerweise wandelt er in diesem Beispiel die 82 in "ef bf bd" um.
Was eben auch komisch ist, dass das Script "160000" als utf8 erkennt, "4105000155250282" aber eben nicht. Gleiche Datei. Ich stehe mittlerweile auch total auf dem Schlauch, weil der Kopf raucht
-
Was willst Du mit UTF-8? Das ist eine String kodierung und du sagtst es sind keine "Strings". Also was genau tust Du mit den Daten?
Also ein
var data = '4105000155250282'; var buf = new Buffer(data, 'hex'); adapter.log.debug(buf.toString('hex');
Müsste genau die Ausgabe geben wie dein EIngabestring
-
Nach Recherche im Internet hat die Node.js Buffer Funktion teilweise Probleme damit, wenn man die Daten in einer falschen Kodierung übermittelt.
Das konnte ich soweit auch reproduzieren. Und ja sogesehen hast du recht, dass ich die Daten als String an Buffer übergebe. So soll es nach der Funktionsdokumentation auch sein.
var buf = Buffer.from('160000', 'hex');
if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))
–> ergibt true --> die Daten werden korrekt übertragen [ 16 00 00 steht in Wireshark ]
var buf = Buffer.from('4105000155250282', 'hex');
if(!buf.equals(Buffer.from(buf.toString('utf8'), 'utf8')))
–> ergibt false --> die Daten werden fehlerhaft übertragen [ 41 05 00 01 55 25 02 ef bf bd steht in Wireshark ] erwartet wird aber 41 05 00 01 55 25 02 82
Meine Konkrete Frage ist einfache, wieso in dem Fall die 82 falsch umgewandelt und übertragen wird. Ich denke, es hat mit der Kodierung zu tun (deshalb eben auch der Hinweis darauf). Vielleicht liege ich hier auch total daneben.
-
Wie sieht denn der code aus der das raussendet? Und warum sendest DU nicht den "Binären" Buffer (also das was du dort als Hex vorgibst) direkt raus? Warum machst Du Dinge mit utf-8? Du willst die bytes so raussenden wie du sie im Buffer hast. Ergo: Nichts rumkonvertieren sondern den Buffer so wie Du Ihn hier erstellst senden. Du brauchst keine UTF-8 konvertierungen zu machen!!
Warum er sowa macht ist recht einfach:
"82" ist 130 dezimal. UTF-8 ist nur bis 127 dezomal identisch. Alles höhere wird mittels Zusatzbytes kodiert. In dem Fall kodiert er damit die "82" in in Summe 3 Bytes. Nach UTF-8 kodierlogik korrekt, daher: Lass das UTF-8 kodiere wenn Du die reinen Bytes haben willst!
-
Ich würde es gerne so lassen.
var data = '4105000155250282';
var buf = new Buffer(data, 'hex');
War erst mein Code zu Anfang. Ich meine, es ging auch mal kurz. Aber auch da bekomme ich leider immer nur "41 05 00 01 55 25 02 ef bf bd" im Wireshark.
EDIT, sorry deine erste Frage vergessen zu beantworten.
Es läuft über eine Telnet Sitzung. Das dürfte aber vermutlich egal sein, denn das buffer object ist ja bereits vorher falsch.
-
Dein code den Du hier zeigst zeigt nur wie der Buffer initialisiert wird. Wie versendest Du ihn?
Wenn Du sagst das Wireshark was hat dann musst Du das irgendwie ausgeben. Sag jetzt bitte nicht das Du eine Text-Telnet Session hast und dort dann per "console.log" deinen Buffer ausgibst?!
Das kann dann nicht tun weil 0x82 kein ASCII ist und daher wahrscheinlich deine Telnet Session eine kodierung braucht. Warum telnet und nicht ein TCP Socket?!
-
Moin, dein Beitrag hat mich zum Umdenken gebracht. Dafür vielen Dank.
Nach dem Wechsel von Telnet auf TCP habe ich die Probleme in den Griff bekommen und habe nun die ersten Werte zurückerhalten.
Das ist übrigens daraus entstanden: http://forum.iobroker.net/viewtopic.php?f=30&t=8803