JavaScript Hexadezimalwerte in einem http-Request übergeben

Wiskat

Mitglied
Hallo erstmal 🙂

ich soll eine Daikin Klimasteuerung über einen HTTP-Request ansteuern. Leider bin ich auf dem Gebiet ein totaler Anfänger, dementsprechend komm ich seit Tagen nicht wirklich voran. Angaben wie "application/octet-stream" sind vorgegeben.

Zum Steuern der Anlage muss ich einen Hexadezimalwert, denn ich über ein JavaScript ermittel, versenden. Dieser Hexwert ist 112 Zeichen --> 56 byte groß. Allerdings finde ich keine Möglichkeit die Daten direkt als Byte zu versenden, sodass sie nicht erneut codiert werden. Die Daten werden bisher immer als Ascii-Zeichen versendet, da ich sie ja auch als "string" deklariere, und dementsprechend erneut in Hexwerte codiert. Ist soweit ja auch völlig logisch. Die Frage ist nur, wie ich diese Werte denn direkt als Hexwerte übertragen kann?

Ich hab schon so einiges ausprobiert: "0x" vor jedem Byte, % vor jedem Byte etc. Nichts hat mir wirklich geholfen.


Hier mal die stark vereinfachte Version des Skriptes:
Java:
var value = "3800000010270000010000000000000000000000000000000000000000000000040000000100000000000000000000000000000000000000";
url = "http://172.16.4.220:80/cmd/";
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");   
WinHttpReq.open("POST", url, false);
WinHttpReq.setRequestHeader("Content-length", "56");
WinHttpReq.setRequestHeader("Content-type", "application/octet-stream");
WinHttpReq.send(value);

Kann mir einer von euch vielleicht weiterhelfen?
Danke,
Thomas

PS: Sorry ich seh gerade ich bin im falschen Unterforum 😳! Ich müsste eigentlich hierhin: Für Verirrte - Fragen zu JavaScript! Vielleicht wäre ein Mod so nett und verschiebt diesen Thread.
 
Zuletzt bearbeitet von einem Moderator:
Nicht genau das was du suchst, aber vielleicht hilft es.

Core JavaScript Reference 1.5:

Java:
var javaString = new java.lang.String("Hello world!");
var byteArray = javaString.getBytes();
byteArray[0] // returns 72
byteArray[1] // returns 101

Was mir noch unklar ist, in welcher Form bekommst die Daten?
 
Nur ein Schuss ins blaue.
Java:
	var src = 'data:application/octet-stream;base64,' +
		'MzgwMDAwMDAxMDI3MDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw' +
		'MDAwMDA0MDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMA==';

Diese dataurl sollte deinem value in base64 encoded entsprechen. Ohne das getestet zu haben sollte der Webserver anhand dieser informationen eigentlich wieder deinen hex Wert decodieren können.
Wenn man jetzt das anstelle der "value" variable versendet... käme auf einen Versuch an.
 
@faetzminator: Also um die Heizungsanlage zu steuern, muss dem Gerät über einen HTTP-Request Hexwerte übergeben werden. Die benötigen Hexwerte errechne ich über einen Skript, sodass ich am Ende einen Hexstring, wie z.B. "380000000027001". Die ersten 2 Byte sind in diesem Fall die CommandID, danach folgen Temperaturwerte, Betriebsstatus usw. Sodass ich letztendlich einen 56Byte langen String erhalte.
Dieser String muss jetzt genau in dieser Form dem Gerät zugesendet werden. Der Hexwert wird aber als normaler ASCII Zeichensatz behandelt und dementsprechend erneut in Hexwerten umgewandelt, sodass das Gerät nichts mehr damit anfangen kann.
Daher meine Frage, wie ich die Werte direkt als Hexwerte übermitteln kann, ohne erneut codiert zu werden.


@MarderFahrer: Klappt leider nicht, Daten werden trotzdem nochmal codiert, sodass sie unbrauchbar werden.


@chalkbag: Ich hab es jetzt Ähnlich versucht. Ich geh einfach hin und übersetze meinen Hexwert eins-zu-eins in einem ASCII-Zeichensatz. Zum Beispiel den ersten Byte "38" ersetze ich durch "8". Beim codieren wird er nun in wieder in 38 im Header angezeigt. Eigentlich total easy, weshalb ich da noch nicht eher drauf gekommen bin :-/

Ein Problem bleibt jedoch bestehen: Wie kann ich als ASCII-Zeichen "NULL" darstellen? Ich hab es versucht indem ich einfach zwei Anführungszeichen sende --> ""
Leider ohne Erfolg, auch mit "unescape" hat es leider nicht funktioniert. Die anderen Werte kann ich alle über die Tastenkombi "ALT" + *** darstellen (z.B. 02h = ALT+002), nur bei "NULL" stellt der dementsprechend auch nichts dar.

Hier mal eine Zeichentabelle: ASCII-Tabelle
 
[c]parseInt(yourNum, 16);[/c] wandelt einen int in einen Hexstring um. Jetzt musst du nur noch Zeichen für Zeichen (ASCII Code) reinschmeissen und du solltest kriegen, was du willst.
 
Hmm ich hab mich vielleicht echt bescheiden ausgedrückt :autsch:

Ich versuch es nochmal zu erklären, sorry:
Ich hab bereits einen Hexadezimalwert! Mein generierter String ist der Hexadezimalwert den ich übermitteln muss! Das Problem ist, dass dieser Hexwert beim HTTP-Request als ASCII-Code behandelt wird und dementsprechend nochmal als Hexadezimalwert codiert wird. Somit ist der Code für das Gerät unbrauchbar.

Variante A:
Ich suche eine Möglichkeit den Wert direkt als Hexadezimalwert zu übergeben, ohne das der HTTP-Request ihn erneut codieren möchte.

--------------
Oder eine andere Möglichkeit ist Variante B mit einem anderen Problem:
Ich wandele meinen vorhandenen Hexadezimalwert in einen ASCII Code um, bevor ich den HTTP Request starte. Ich übergebe dann meinen ASCII Code und beim HTTP Request wird der String dann zurück in einen Hexadezimalwert geschrieben. Somit hätte ich das was ich wollte, nämlich das die Werte als Hexadezimalwerte zum Gerät gelangen.
Allerdings muss ich einige Nullzeichen übermitteln, die sich in meinem String befinden, aber ich bekomme das Nullzeichen einfach nicht übermittelt...
Ich hab es schon mit \0 ausprobiert --> value = '\0'.
Problem ist das der ASCII-Zeichensatz \ ebenfalls beinhaltet und somit bei Zeichen \ und 0 in 5c und 30 codiert.. Schreibe ich es ohne Anführungszeichen value = \0 wird das Script erst gar nicht ausgeführt. Oder gibt es da noch einen anderen Trick?

Mit "unescape" o.Ä. habe ich es auch schon versucht. Alles ohne Erfolg. Bei allen Werten ist das kein Problem nur "null" stellt er nicht entsprechend da.

Ich überwache mit Wireshark meine NW-Karte.
Schreibe ich z.B.:
var value = String.fromCharCode(0);
(...)
WinHttpReq.send("8" + value);

Zeigt er mir zuerst noch die 8 als "38" an, was ja korrekt ist. Aber darauf folgt nicht mehr, aber es sollte ja noch die "00" folgen.

Ich hoffe ihr könnt mein Problem nachvollziehen und mir vielleicht weiterhelfen, auch wenn ich es schwer beschreiben kann 🙁
 

Zurück
Oben