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.
    • paul53
      paul53 last edited by

      @sveni_lee:

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

        richtig… das Problem ist das der xml code in teilen gesendet wird und nicht vollständig übergeben wird...

        ~~![](</s><URL url=)https://i.imgur.com/LFkxKiN.jpg" />

        ~~![](</s><URL url=)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...~~~~

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

          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 ?

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

            nein, die anderen haben diesen header nicht… der isr aber wichtig für die weiterverarbeitung müsste also am Anfang des Paketes bestehen bleiben...

            ~~![](</s><URL url=)https://i.imgur.com/sTO0PT2.jpg" />

            ~~![](</s><URL url=)https://i.imgur.com/jryLouz.jpg" />

            ~~![](</s><URL url=)https://i.imgur.com/E80eKKM.jpg" />

            ![](</s><URL url=)https://i.imgur.com/YKPAKSY.jpg" />~~~~~~

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

              Sind das keine Header bis zum Byte 0x41 : "|" (senkrechter Strich) ? Müssten die nicht rausgefiltert werden ?

              Wo erscheint das LF ?

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

                das ist richtig…

                ~~![](</s><URL url=)https://i.imgur.com/SaV0DU6.jpg" />

                Wireshark sagt mir das der "Datenteil" immer erst mit byte 66 startet…

                ![](</s><URL url=)https://i.imgur.com/wzzsRhF.jpg" />~~

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

                  Werden die ersten 66 Zeichen auch an die Funktion übergeben ?

                  on('data', function (data) {
                  

                  Oder sind sie an der Stelle schon ausgefiltert ?

                  1 Reply Last reply Reply Quote 0
                  • 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
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            795
                                            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