2016-07-15 8 views
0

Ich versuche, einen neuen Knoten für Node-Red zu erstellen. Grundsätzlich ist es eine UDP-Abhörbuchse, die über einen Konfig-Knoten aufgebaut werden soll und die alle eingehenden Nachrichten zur Verarbeitung an dedizierte Knoten weiterleiten soll. Diese ist die grundlegende, was ich habe:Node-Red: Create Server und Freigabe der Eingabe

function udpServer(n) { 
    RED.nodes.createNode(this, n); 
    this.addr = n.host; 
    this.port = n.port; 

    var node = this; 

    var socket = dgram.createSocket('udp4'); 

    socket.on('listening', function() { 
     var address = socket.address(); 
     logInfo('UDP Server listening on ' + address.address + ":" + address.port); 
    }); 

    socket.on('message', function (message, remote) { 
     var bb = new ByteBuffer.fromBinary(message,1,0); 
     var CoEdata = decodeCoE(bb); 
     if (CoEdata.type == 'digital') { //handle digital output 
      // pass to digital handling node 
     } 
     else if (CoEdata.type == 'analogue'){ //handle analogue output 
      // pass to analogue handling node 
     } 
    });  

    socket.on("error", function (err) { 
     logError("Socket error: " + err); 
     socket.close();   
    }); 

    socket.bind({ 
     address: node.addr, 
     port: node.port, 
     exclusive: true 
    }); 

    node.on("close", function(done) { 
     socket.close(); 
    }); 
} 
RED.nodes.registerType("myServernode", udpServer); 

Für den Verarbeitungsknoten:

function ProcessAnalog(n) { 
    RED.nodes.createNode(this, n); 
    var node = this; 
    this.serverConfig = RED.nodes.getNode(this.server); 

    this.channel = n.channel; 

    // how do I get the server's message here? 

} 
RED.nodes.registerType("process-analogue-in", ProcessAnalog); 

Ich kann nicht herausfinden, wie die Nachrichten zu übergeben, die die Buchse an einer variablen Anzahl von Verarbeitungsknoten empfängt dh mehrere Verarbeitungsknoten müssen sich auf der Serverinstanz teilen.

==== EDIT für mehr Klarheit =====

Ich möchte einen neuen Satz von Knoten entwickeln:

Ein Server Knoten:

  • Verwendet ein config-node Erstellen eines UDP-Abhörsockets
  • Verwalten der Socket-Verbindung (Schließen von Ereignissen, Fehlern usw.)
  • Empfangen ives Datenpakete mit einer zu vielen Kanälen verschiedenen Daten

Eine zu vielen Verarbeitungsknoten

  • Die Verarbeitungsknoten werden die gleiche Verbindung teilen, dass der Server-Knoten
  • etabliert
  • Die Verarbeitungsknoten soll die Nachrichten behandeln, die der Server ausgibt
  • Möglicherweise würde der Node-Red-Fluss so viele verarbeitende Knoten verwenden, wie es Kanäle im Datenpaket des Servers gibt

die Node-Red-Dokumentation auf config-Knoten zu zitieren:

Eine häufige Verwendung von Konfigurations Knoten ist eine gemeinsame Verbindung zu einem Remote-System darzustellen. In diesem Fall kann der Konfig-Knoten auch sein, verantwortlich für , der die Verbindung erstellt und sie für die Knoten verfügbar macht, die den Konfig-Knoten verwenden. In solchen Fällen sollte der Konfigurationsknoten auch das Schließereignis behandeln, um die Verbindung zu trennen, wenn der Knoten gestoppt wird.

Soweit ich das verstanden, mache ich die Verbindung zur Verfügung über this.serverConfig = RED.nodes.getNode(this.server); aber ich kann nicht herausfinden, wie Daten zu übergeben, das von dieser Verbindung empfangen wird, an den Knoten, der diese Verbindung verwendet.

Antwort

2

Ein Knoten hat keine Kenntnis davon, mit welchen Knoten er an den Downstream angeschlossen ist.

Das Beste, was Sie vom ersten Knoten aus tun können, ist, 2 Ausgänge zu haben und digital zu eins und analog zum anderen zu senden.

Sie würden dies tun, indem Sie ein Array an die node.send()-Funktion übergeben.

z.

//this sends output to just the first output 
node.sent([msg,null]); 

//this sends output to just the second output 
node.send([null,msg]); 

Knoten, die messagess erhalten, muss ein Listener für input

zum Beispiel hinzufügen

node.on('input', function(msg) { 
    ... 
}); 

All dies auch auf dem Node-RED page

Die andere Option, wenn der Knoten ein Config ist dokumentiert udpServer ist Knoten, dann müssen Sie Ihre eigenen Hörern beste Wette implementieren ist etwas wie die MQTT-Knoten im Kern für Beispiele von Pooling-Verbindungen aussehen

+0

Vielen Dank für Ihre Antwort. Ich denke, ich war bei meiner anfänglichen Frage nicht präzise genug, um etwas anderes zu erreichen. Ich habe edit meine erste Frage für mehr Klarheit (ich hoffe) – Tom

+0

Also das passt die zweite Option, die ich beschrieben, sollten Sie auf die MQTT-Knoten in den Kernknoten https://github.com/node-red/node-red/ Blob/Master/Knoten/Kern/Io/10-mqtt.js – hardillb