使用Node.js和OSC.js在LAN上的机器之间发送OSC

时间:2017-03-18 16:19:33

标签: node.js lan osc

是否有人创建了一个工作设置,其中使用Node.js在LAN上的计算机之间发送OSC?理想情况下,使用Colin Clark的osc.js软件包吗?

我认为应该是一个非常简单的例子,除了它不起作用 - 我得到一个EADDRNOTAVAIL错误,这意味着远程地址不可用。但是,我可以成功ping另一台笔记本电脑。

以下是代码和错误,供参考:

发送密码(笔记本电脑为192.168.0.5):

var osc = require("osc");

var udp = new osc.UDPPort({
    localAddress: "127.0.0.1", // shouldn't matter here
    localPort: 5000, // not receiving, but here's a port anyway
    remoteAddress: "192.168.0.7", // the other laptop
    remotePort: 9999 // the port to send to
});

udp.open();

udp.on("ready", function () {

    console.log("ready");
    setInterval(function () {
        udp.send({
            address: "/sending/every/second",
            args: [1, 2, 3]
        })
    }, 1000);
});

接收代码(在笔记本电脑上为192.168.0.7):

var osc = require("osc");
var udp = new osc.UDPPort({
    localAddress: "192.168.0.7",
    localPort: 9999
});

udp.open();

udp.on("ready", function () {
    console.log("receiver is ready");
});

udp.on("message", function(message, timetag, info) {
   console.log(message); 
});

以下是运行发送代码时出现的错误:

ready
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: send EADDRNOTAVAIL 192.168.0.7:9999
    at Object.exports._errnoException (util.js:907:11)
    at exports._exceptionWithHostPort (util.js:930:20)
    at SendWrap.afterSend [as oncomplete] (dgram.js:345:11)

1 个答案:

答案 0 :(得分:2)

问题是您用来发送OSC消息的osc.UDPPort将其localAddress绑定到环回地址,该地址仅限于本地计算机中的连接。因此,您的发件人无法找到您的收件人。

解决方案是将发件人的localAddress绑定到适当的网络接口。如果您的192.168.0.5 IP地址稳定,并且在将笔记本电脑连接到另一个网络时(例如,对于演出或图库安装),您不必担心它会发生变化,那么您可以使用它。否则,您可能希望使用mDNS名称(" foo.local")或"所有接口"地址,0.0.0.0。

对您的"发件人代码进行此更改"我在网络上尝试时为我工作:

var osc = require("osc");

var udp = new osc.UDPPort({
    localAddress: "0.0.0.0", // Totally does matter here :)
    localPort: 5000,
    remoteAddress: "192.168.0.7", // the other laptop
    remotePort: 9999 // the port to send to
});

udp.open();

udp.on("ready", function () {
    console.log("ready");
    setInterval(function () {
        udp.send({
            address: "/sending/every/second",
            args: [1, 2, 3]
        })
    }, 1000);
});

作为旁注,osc.js的行为确实与常规Node.js UDP套接字不同,因为如果省略本地地址,Node将默认为0.0.0.0。但是,如果省略osc.UDPPortlocalAddress将始终绑定到127.0.0.1(在最初实现osc.js时,这对我来说似乎有点安全,但我可以看到它可能会让人感到困惑)。

此问题也是discussed on the osc.js issue tracker,我将更新文档以防止您在此处遇到的混淆。祝你的项目好运!