Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Js wie in "Puffer" schreiben

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Js wie in "Puffer" schreiben

    This topic has been deleted. Only users with topic management privileges can see it.
    • AlCalzone
      AlCalzone Developer last edited by

      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).

      1 Reply Last reply Reply Quote 0
      • S
        sveni_lee last edited by

        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);
        
        1 Reply Last reply Reply Quote 0
        • S
          sveni_lee last edited by

          @AlCalzone:

          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

          1 Reply Last reply Reply Quote 0
          • paul53
            paul53 last edited by

            Wo hast Du diesen Code her ? Ich verstehe ihn nicht :oops:

            1 Reply Last reply Reply Quote 0
            • paul53
              paul53 last edited by

              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.

              1 Reply Last reply Reply Quote 0
              • S
                sveni_lee last edited by

                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...

                1 Reply Last reply Reply Quote 0
                • S
                  sveni_lee last edited by

                  @paul53:

                  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...

                  1 Reply Last reply Reply Quote 0
                  • paul53
                    paul53 last edited by

                    @sveni_lee:

                    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 Ansatz

                    var 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
                       }
                    });     
                    
                    
                    1 Reply Last reply Reply Quote 0
                    • S
                      sveni_lee last edited by

                      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> 
                      
                      1 Reply Last reply Reply Quote 0
                      • S
                        sveni_lee last edited by

                        @paul53:

                        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...

                        1 Reply Last reply Reply Quote 0
                        • paul53
                          paul53 last edited by

                          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.

                          1 Reply Last reply Reply Quote 0
                          • S
                            sveni_lee last edited by

                            @paul53:

                            Ist result deklariert ?

                            var result;
                            

                            die originale funktion sieht ja so aus: `

                                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);
                                                }
                                        }
                                });
                            

                            dort ist result auch nicht extra deklriert…

                            ` > 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. `

                            function iscp_to_command(iscp_message) {
                                /*
                                  Transform a low-level ISCP message to a high-level command
                                */
                                var command = iscp_message.slice(0, 3),
                                    value = iscp_message.slice(3),
                                    result = {};
                            
                                Object.keys(COMMANDS).forEach(function (zone) {
                            
                                    if (typeof COMMANDS[zone][command] !== 'undefined') {
                            
                                        var zone_cmd = COMMANDS[zone][command];
                            
                                        result.command = zone_cmd.name;
                            	    result.zone = zone;
                                        if (typeof zone_cmd.values[value] !== 'undefined') {
                            
                                            result.argument = zone_cmd.values[value].name;
                            
                                        } else if (typeof VALUE_MAPPINGS[zone][command].INTRANGES !== 'undefined' && /^[0-9a-fA-F]+$/.test(value)) {
                            
                                            // It's a range so we need to convert args from hex to decimal
                                            result.argument = parseInt(value, 16);
                                        }
                                    }
                                });
                            
                                return result;
                            }
                            
                            1 Reply Last reply Reply Quote 0
                            • paul53
                              paul53 last edited by

                              Das scheint wenig (oder nichts) mit den XML-Daten zu tun zu haben.

                              1 Reply Last reply Reply Quote 0
                              • paul53
                                paul53 last edited by

                                Funktioniert der Adapter https://www.npmjs.com/package/iobroker.onkyo nicht ?

                                1 Reply Last reply Reply Quote 0
                                • S
                                  sveni_lee last edited by

                                  Funktionieren tut er schon nur kann er nicht alle Befehle bzw. Antworten verarbeiten. Genau darum geht es mir ja… ich brauche die XML Geschichte...

                                  Gesendet von iPhone mit Tapatalk Pro

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    sveni_lee last edited by

                                    @paul53:

                                    Funktioniert der Adapter https://www.npmjs.com/package/iobroker.onkyo nicht ? `

                                    so… ich versuchs dann mal weiter...

                                    den Adapter bzw. den Onkyo-vis benutze ich ja... aber diese beiden greifen auf node eiscp.js zurück. das heist die Kommunikation läuft über dieses

                                    node js Modul und das ist leider nicht up to date.

                                    ich versuche grad mal die eiscp.js zu debuggen. was ist mir aufgefallen:

                                    • ich denke das es funktioniert nicht weil die Daten nicht in so ankomme wie erwartet. mein Debug sieht nun so aus:
                                    ````
                                    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
                                        */
                                    	self.emit('debug', util.format('DEBUG (iscp_to_command) raw HEX "%s"', packet));
                                    	self.emit('debug', util.format('DEBUG (iscp_to_command) raw ASCII "%s"', packet.toString('ascii', 18, packet.length - 3)));
                                        return packet.toString('ascii', 18, packet.length - 3); //return packet.toString('ascii', 18, packet.length - 3);
                                    ````
                                    Ergebniss:
                                    ```
                                    `2018-06-27 08:43:40.544  - [34mdebug[39m: onkyo-vis.0 DEBUG (iscp_to_command) raw HEX "ISCP     v   !1NRI<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><netservicelist count="15"><netservice id="0e" value="1" name="TuneIn" account="Enter your Username" password="Enter your Password"><netservice id="04" value="0" name="Pandora Internet Radio" account="Enter your email address." password="Enter your password."><netservice id="05" value="0" name="Rhapsody" account="Enter your username." password="Enter your password."><netservice id="03" value="0" name="SiriusXM Internet Radio" account="Enter your user name." password="Enter your password."><netservice id="06" value="1" name="Last.fm Internet Radio" account="Enter your user name." password="Enter your password."><netservice id="08" value="0" name="Slacker Personal Radio" account="Enter your email address." password="Enter your password."><netservice id="0a" value="1" name="Spotify" account="Enter your Username" password="Enter your Password"><netservice id="0b" value="1" name="AUPEO! PERSONAL RADIO" account="Enter your user name." password="Enter your password."><netservice id="0d" value="0" name="e-onkyo music"><netservice id="0c" value="0" name="radiko.jp"><netservice id="10" value="1" name="simfy" account="Username or email address." p"/2018-06-27/08:43:40.545/-/[34mdebug[39m:/onkyo-vis.0/debug/(iscp_to_command)/raw/ascii/"nri<?xml/version="1.0" encoding="utf-8" ?=""><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><netservicelist count="15"><netservice id="0e" value="1" name="TuneIn" account="Enter your Username" password="Enter your Password"><netservice id="04" value="0" name="Pandora Internet Radio" account="Enter your email address." password="Enter your password."><netservice id="05" value="0" name="Rhapsody" account="Enter your username." password="Enter your password."><netservice id="03" value="0" name="SiriusXM Internet Radio" account="Enter your user name." password="Enter your password."><netservice id="06" value="1" name="Last.fm Internet Radio" account="Enter your user name." password="Enter your password."><netservice id="08" value="0" name="Slacker Personal Radio" account="Enter your email address." password="Enter your password."><netservice id="0a" value="1" name="Spotify" account="Enter your Username" password="Enter your Password"><netservice id="0b" value="1" name="AUPEO! PERSONAL RADIO" account="Enter your user name." password="Enter your password."><netservice id="0d" value="0" name="e-onkyo music"><netservice id="0c" value="0" name="radiko.jp"><netservice id="10" value="1" name="simfy" account="Username or email address." <e="">[/code]</netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservicelist></device></response></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservice></netservicelist></device></response>`
                                    
                                    Also kommen das _~~[i]~~/n[/i]_ wohl gar nicht an...
                                    ```
                                    

                                    <list type="2">~~~~* mir ist aufgefallen das komischer Weise die 5 Pakete die vom Onkyo gesendet werden als 2 Pakete empfangen werden. Ich kann aber im ersten Paket keinen unterschied zu den anderen sehen...

                                    1 Reply Last reply Reply Quote 0
                                    • S
                                      sveni_lee last edited by

                                      nach sehr langem debuggen von node eiscp.js habe ich nun einen weg gefunden die Daten auszufiltern…

                                      	on('data', function (data) {
                                      
                                      		if(first) {
                                      			xml = eiscp_packet_extract(data);
                                      			first = false;
                                      			var result = iscp_to_command(xml);
                                      			result.iscp_command = xml;
                                      			result.host  = config.host;
                                      			result.port  = config.port;
                                      			result.model = config.model;
                                      
                                      		} 
                                      		else {  
                                      			xml = xml + data.toString('ascii', 18); // evtl. data.toString() ?
                                      			self.emit('debug', util.format("DEBUG (XML) command %s", xml));
                                      
                                      			var result = iscp_to_command(xml);
                                      			result.iscp_command = xml;
                                      			result.host  = config.host;
                                      			result.port  = config.port;
                                      			result.model = config.model;
                                      
                                      			if(xml.indexOf('') != -1) {
                                      				self.emit('data', result);
                                      				first = true
                                      
                                      				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);
                                      					}	
                                      				}
                                      
                                      			}
                                      		}   
                                      
                                      		if(result.command !== 'receiver-information' | result.command !== 'net-usb-list-info-allitems') {
                                      			first = true;
                                      
                                      			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);
                                      				}
                                      			} 
                                      		}	
                                      	});
                                      

                                      da es nur zwei commands gibt, die eine xml als Anwort erhalten sollte das eigendlich funktionionieren.

                                      das ist sicher nicht der eleganteste Weg aber so komme ich auf jedenfall erst einmal weiter… (hoffe) ich

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      724
                                      Online

                                      31.7k
                                      Users

                                      79.9k
                                      Topics

                                      1.3m
                                      Posts

                                      4
                                      36
                                      1761
                                      Loading More Posts
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                      The ioBroker Community 2014-2023
                                      logo