Node-Red:创建服务器并共享输入

时间:2016-07-15 18:50:40

标签: node.js sockets node-red

我正在尝试为Node-Red创建一个新节点。基本上它是一个udp监听套接字,它应该通过一个配置节点建立,并且应该将所有传入的消息传递给专用节点进行处理。 这是我的基本要素:

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

对于处理节点:

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

我无法弄清楚如何将套接字接收的消息传递给可变数量的处理节点,即多个处理节点应在服务器实例上共享。

====编辑更清晰=====

我想开发一组新的节点:

一个服务器节点:

  • 使用config-node创建UDP侦听套接字
  • 管理套接字连接(关闭事件,错误等)
  • 接收包含一对多不同数据通道的数据包

一到多个处理节点

  • 处理节点应共享服务器节点已建立的相同连接
  • 处理节点应处理服务器正在发出的消息
  • 可能Node-Red流程将使用与服务器数据包中的通道一样多的处理节点

引用config-nodes上的Node-Red文档:

  

配置节点的一个常见用途是表示与a的共享连接   远程系统。在那种情况下,配置节点也可以是   负责创建连接并使其可用   使用配置节点的节点。在这种情况下,配置节点应该   还处理关闭事件以在节点停止时断开连接。

据我所知,我通过this.serverConfig = RED.nodes.getNode(this.server);建立了连接,但我无法弄清楚如何将此连接接收的数据传递给使用此连接的节点。

1 个答案:

答案 0 :(得分:2)

节点不知道它连接到下游的节点。

从第一个节点可以做的最好的事情就是有两个输出,并将数字发送到一个输出,而模拟发送到另一个输出。

您可以通过将数组传递给node.send()函数来完成此操作。

E.g。

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

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

接收消息的节点需要为input

添加侦听器

e.g。

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

所有这些都在Node-RED page

上有详细记录

另一个选择是如果udpServer节点是 config 节点,那么你需要实现自己的监听器,最好的办法是看看核心中的MQTT节点,例如汇集连接