Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点红色:创建服务器并共享输入_Node.js_Sockets_Node Red - Fatal编程技术网

Node.js 节点红色:创建服务器并共享输入

Node.js 节点红色:创建服务器并共享输入,node.js,sockets,node-red,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('udp

我正在尝试为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);
我不知道如何将套接字接收到的消息传递给数量可变的处理节点,即多个处理节点应在服务器实例上共享

==编辑以获得更清晰的信息=====

我想开发一组新的节点:

一个服务器节点:

  • 使用创建UDP侦听套接字
  • 管理套接字连接(关闭事件、错误等)
  • 接收具有一到多个不同数据通道的数据包
一对多处理节点

  • 处理节点应共享服务器节点已建立的相同连接
  • 处理节点应处理服务器发出的消息
  • 节点Red flow可能会使用与服务器数据包中的通道数量相同的处理节点
要引用配置节点上的节点红色文档,请执行以下操作:

配置节点的一个常见用途是表示到服务器的共享连接 远程系统。在该实例中,配置节点也可能是 负责创建连接并将其提供给用户 使用配置节点的节点。在这种情况下,配置节点应该 还可以处理关闭事件,以便在节点停止时断开连接


据我所知,我通过
this.serverConfig=RED.nodes.getNode(this.server)使连接可用但我无法确定如何将此连接接收到的数据传递到使用此连接的节点。

节点不知道它连接到哪个节点

从第一个节点可以做的最好的事情是有两个输出,并向其中一个发送数字,向另一个发送模拟

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

例如

具有接收消息的节点需要为
input

e、 g

所有这些都记录在红色节点上


另一个选项是,如果
udpServer
节点是一个配置节点,那么您需要实现自己的侦听器,最好的选择是看起来像核心中的MQTT节点,例如池连接

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

从第一个节点可以做的最好的事情是有两个输出,并向其中一个发送数字,向另一个发送模拟

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

例如

具有接收消息的节点需要为
input

e、 g

所有这些都记录在红色节点上


另一个选项是,如果
udpServer
节点是config节点,那么您需要实现自己的侦听器,最好的选择是在核心中使用类似MQTT节点的连接池示例

非常感谢您的回答。我想我对我最初的问题不够精确,因为我想实现一些不同的目标。为了更清楚(我希望如此),我已经编辑了我的初始问题,以便适合我描述的第二个选项,您应该查看核心节点中的MQTT节点。非常感谢您的回答。我想我对我最初的问题不够精确,因为我想实现一些不同的目标。为了更清楚(我希望如此),我已经编辑了我的初始问题,以便适合我描述的第二个选项,您应该查看核心节点中的MQTT节点
//this sends output to just the first output
node.sent([msg,null]);

//this sends output to just the second output
node.send([null,msg]);
node.on('input', function(msg) {
   ...
});