NEWS
Js wie in "Puffer" schreiben
-
Wenn es sich tatsächlich um Strings handelt, dann ist der Puffer ein String, der als Leerstring initialisiert wird, und an den man die Stringbruchstücke solange anhängt, bis ein LF enthalten ist. Der Hex-Dump zeigt allerdings etliche Steuerzeichen innerhalb der Daten.
-
die Antworten die ich erwarte sehen dann so aus…
NRI<response status="ok"><device id="TX-NR525"><brand>ONKYO</brand><category>AV Receiver</category><year>2013</year><model>TX-NR525</model><destination>xx</destination><firmwareversion>1060-9110-0000-</firmwareversion></device></response>
-
die Antworten die ich erwarte sehen dann so aus… `
Das ist unvollständiger XML-Code.NRI <response status="ok"><device id="TX-NR525"><brand>ONKYO</brand> <category>AV Receiver</category> <year>2013</year> <model>TX-NR525</model> <destination>xx</destination> <firmwareversion>1060-9110-0000-</firmwareversion></device></response>
-
richtig… das Problem ist das der xml code in teilen gesendet wird und nicht vollständig übergeben wird...
~~https://i.imgur.com/LFkxKiN.jpg" />
~~https://i.imgur.com/qLyVEPv.jpg" />
der komplette xml-code setzt sich den Paketen 920,921,922,923 und 924 zusammen…
darum möchte ich die enzelnen Teile wieder zusammensetzen um den kompletten und brauchbaren xml code zu bekommen...~~~~
-
Das Packet 920 enthält einen Header, der mit "!1NRI" endet. Haben die anderen Packete auch diesen Header ? Der müsste dann erst ausgefiltert werden, bevor man die XML-Teile verkettet.
Wie sieht das letzte Packet aus ?
-
nein, die anderen haben diesen header nicht… der isr aber wichtig für die weiterverarbeitung müsste also am Anfang des Paketes bestehen bleiben...
~~https://i.imgur.com/sTO0PT2.jpg" />
~~https://i.imgur.com/jryLouz.jpg" />
~~https://i.imgur.com/E80eKKM.jpg" />
https://i.imgur.com/YKPAKSY.jpg" />~~~~~~ -
Sind das keine Header bis zum Byte 0x41 : "|" (senkrechter Strich) ? Müssten die nicht rausgefiltert werden ?
Wo erscheint das LF ?
-
das ist richtig…
~~https://i.imgur.com/SaV0DU6.jpg" />
Wireshark sagt mir das der "Datenteil" immer erst mit byte 66 startet…
https://i.imgur.com/wzzsRhF.jpg" />~~ -
Werden die ersten 66 Zeichen auch an die Funktion übergeben ?
on('data', function (data) {
Oder sind sie an der Stelle schon ausgefiltert ?
-
Ich gehe nicht davon aus, dass du die TCP-Header ebenfalls empfängst. Wireshark zeigt dir das gesamte Datenpaket an, das übers Netzwerk geht, Anwendungen sehen i.d.R. nur den Inhalt des TCP-Pakets (in deinem Fall vermutlich ab Byte 66).
-
die sind an der stelle schon ausgefiltert…
die werden hier ausgefiltert:
function eiscp_packet_extract(packet) { /* Exracts message from eISCP packet Strip first 18 bytes and last 3 since that's only the header and end characters */ return packet.toString('ascii', 18, packet.length - 3);
-
Ich gehe nicht davon aus, dass du die TCP-Header ebenfalls empfängst. Wireshark zeigt dir das gesamte Datenpaket an, das übers Netzwerk geht, Anwendungen sehen i.d.R. nur den Inhalt des TCP-Pakets (in deinem Fall vermutlich ab Byte 66). `
dann sind das also nur die 18 bytes die noch ausgfiltert werden
-
Wo hast Du diesen Code her ? Ich verstehe ihn nicht :oops:
-
Hier sollen die ersten 18 Zeichen nach dem TCP-Header ausgefiltert werden, so dass das Ergebnis mit "NRI<" beginnt. Das darf aber nur beim ersten Packet erfolgen, wie die Hexdumps zeigen.
-
wenn der Onkyo daten sendet wird diese funktion aufgerufen…
on('data', function (data) { var iscp_message = eiscp_packet_extract(data), result = iscp_to_command(iscp_message); result.iscp_command = iscp_message; result.host = config.host; result.port = config.port; result.model = config.model; self.emit('debug', util.format("DEBUG (received_data) Received data from %s:%s - %j", config.host, config.port, result)); self.emit('data', result); // If the command is supported we emit it as well if (typeof result.command !== 'undefined') { if (Array.isArray(result.command)) { result.command.forEach(function (cmd) { self.emit(cmd, result.argument); }); } else { self.emit(result.command, result.argument); } } }); };
hier wird das "Datenpaket übergeben zum "entpacken"…
var iscp_message = eiscp_packet_extract(data)
und das ist dann diese Funktion
function eiscp_packet_extract(packet) { /* Exracts message from eISCP packet Strip first 18 bytes and last 3 since that's only the header and end characters */ return packet.toString('ascii', 18, packet.length - 3); }
das ganze ist eiscp node.js… das Problem ist das der code nicht mehr gepflegt wird und bisher nicht dafür ausgelegt ist diese Daten (xml) zu verarbeiten... diese sind aber notwendig um mein Project der Steurung des Onkyo umzusetzen...
-
Hier sollen die ersten 18 Zeichen nach dem TCP-Header ausgefiltert werden, so dass das Ergebnis mit "NRI<" beginnt. Das darf aber nur beim ersten Packet erfolgen, wie die Hexdumps zeigen. `
richtig…darum möchte ich ja in einen Puffer schreiben bis das "schlußbyte" 0A kommt, dann das komplette paket übergeben...
wenn nun schon ein 0A im ersten paket kommt (bei kuruen nachrichten vom Onkyo) würde es sofort übergeben...
so mein Plan...
-
das ganze ist eiscp node.js `
Bist Du sicher, dass eISCP der richtige Ansatz ist ? Es wird XML-Code geliefert.
@sveni_lee:darum möchte ich ja in einen Puffer schreiben bis das "schlußbyte" 0A kommt, dann das komplette paket übergeben… `
Da zwischen 1. und den weiteren Packeten unterschieden werden muss (wegen der ersten 18 Byte), vielleicht folgender Ansatzvar xml = ''; // Puffer var first = true; // Indikator erstes Packet on('data', function (data) { if(first) { xml = eiscp_packet_extract(data); first = false; } else { xml = xml + data; // evtl. data.toString('utf8', 0, data.length - 3) ? } if(xml.indexOf('\n') != -1) { first = true; ... hier die Auswertung des XML-Codes } });
-
das scheint leider noch nicht so zu funktionieren…
wenn ich das so einbaue:
on('data', function (data) { if(first) { xml = eiscp_packet_extract(data); first = false; } else { xml = xml + data // evtl. data.toString() ? } if(xml.indexOf('\n') != -1) { first = true; result = iscp_to_command(xml); result.iscp_command = xml; result.host = config.host; result.port = config.port; result.model = config.model; self.emit('debug', util.format("DEBUG (received_data) Received data from %s:%s - %j", config.host, config.port, result)); self.emit('data', result); // If the command is supported we emit it as well if (typeof result.command !== 'undefined') { if (Array.isArray(result.command)) { result.command.forEach(function (cmd) { self.emit(cmd, result.argument); }); } else { self.emit(result.command, result.argument); } } } });
bekomme ich
2018-06-26 15:47:55.178 - ^[[34mdebug^[[39m: onkyo-vis.0 DEBUG (sent_command) Sent command to 192.168.1.177:60128 - NRIQSTN 2018-06-26 15:47:55.220 - ^[[31merror^[[39m: onkyo-vis.0 uncaught exception: result is not defined 2018-06-26 15:47:55.220 - ^[[31merror^[[39m: onkyo-vis.0 ReferenceError: result is not defined at Socket. <anonymous>(/opt/iobroker/node_modules/iobroker.onkyo-vis/node_modules/eiscp/eiscp.js:385:16) at emitOne (events.js:96:13) at Socket.emit (events.js:188:7) at readableAddChunk (_stream_readable.js:176:18) at Socket.Readable.push (_stream_readable.js:134:10) at TCP.onread (net.js:559:20)</anonymous>
-
Bist Du sicher, dass eISCP der richtige Ansatz ist ? Es wird XML-Code geliefert. `
mittlerweile nicht mehr so sehr… ich bin mir nur nicht sicher ob ich das als js-script hinbekomme...
-
Ist result deklariert ?
var result;
Wie sieht die Funktion iscp_to_command(xml) aus ?
Nach Aufruf der Funktion werden Zugriffe auf Objekt-Eigenschaften gemacht. Dazu müsste XML in ein Javascript-Objekt gewandelt werden. Dafür gibt es das NPM-Modul https://www.npmjs.com/package/xml2js.