2016-08-30 5 views
0

私は以下のコードを使用して、ネットワーク上のコンピュータにOSCメッセージを送信しようとしています。私はoscというパッケージを使用しています。ノードのoscパッケージでOSCメッセージを送信できません。マシンのポートが開いているにもかかわらず、ポートクローズエラーです。

私はOSCサーバを実行するマシンにメッセージを送信し、OSCメッセージを送信しようとする場合は、以下のエラーを受け取ることができないよ:

Error: Uncaught, unspecified "error" event. (Can't send packets on a closed osc.Port object. Please open (or reopen) this Port by calling open().) 

コード

let osc = require('osc'); 

let oscUDP = new osc.UDPPort({ 
    remoteAddress: "192.168.1.5", 
    remotePort: 8004 
}); 

oscUDP.send({ 
    address: "/carrier/frequency", 
    args: 440 
}); 

oscUDP.open(); 

私が入れた場合の前にoscUDP.open()と呼びます。別のエラーが表示されます。

Error: send EINVAL 192.168.1.5:8004 
at Object.exports._errnoException (util.js:1007:11) 
at exports._exceptionWithHostPort (util.js:1030:20) 
at SendWrap.afterSend [as oncomplete] (dgram.js:402:11) 

OSXをOSX上でサーバーとして実行しています。上のコードは別のマシンにあります。私は、IPアドレスにnmapを実行すると、ポートが開いている:

osc --host 192.168.1.5:8004 /test 1 2 3 

だから、それは問題のISNを思わ:私はosc-cliを使用している場合

nmap 192.168.1.5 -p 8004 

Starting Nmap 6.40 (http://nmap.org) at 2016-08-30 08:22 BST 
Nmap scan report for 192.168.1.5 
Host is up (0.13s latency). 
PORT  STATE SERVICE 
8004/tcp open unknown 

は、メッセージがOSCサーバーを実行しているマシン上で受信され、 osc-cliを使用しているときにメッセージが送受信されるので、閉じたポートはまったくありません。

アイデア?

答えて

1

OSCデータのエンコードに使用されるa2r-osc以外のパッケージを必要とせずに、UDP経由でOSCデータを送信するのはかなり簡単だと思いました。

私が興味の誰包みソリューションを投稿している:私はかなり遅れてこれに来ている知っている、とあなたはあなたのために働く別のライブラリを見つけたように見える

const dgram = require('dgram'); 
const client = dgram.createSocket('udp4'); 
const osc = require('a2r-osc'); 

const HOST = '192.168.1.5'; 
const PORT = 8004; 

process.on('SIGINT', function() { 
    client.close(); 
}); 

let noteOn = function(note) { 
    return new osc.Message('/note/' + note, 'i', 1).toBuffer(); 
} 

let noteOff = function(note) { 
    return new osc.Message('/note/' + note, 'i', 0).toBuffer(); 
} 

let send = function(message) { 
    client.send(message, PORT, HOST, function(err, bytes) { 
    if(err) throw new Error(err); 
    }) 
} 

send(noteOn('c')); 
setTimeout(function() { 
    send(noteOff('c')); 
}, 1000); 
3

が、私この問題に直面している他の人には、応答が役立つかもしれないと考えました。私はあなたが使っていた元のライブラリであるosc.jsの開発者です。

  1. 読み取りのための機能を提供する低レベルAPIと型付き配列へ/からOSCメッセージと束を書き込む:

    まずオフは、背景情報として、osc.jsは、2つの異なる層に織り込まれます。

  2. などUDP、ウェブソケットなどのプロトコルを介して双方向通信を行うための簡単な方法を提供するプラットフォーム固有のトランスポート・オブジェクトのコレクションを提供し、より高いレベル、イベントベースのポートAPI、

あなたのコードの例では、あなたのUDPPortオブジェクトの準備が整う前にOSCメッセージを送信しようとしていました。 open()Portの場合、ソケットを開くなどの非同期操作を実行する必要があるかもしれません。その結果、ポートがすべて使用されるように設定されたときにイベント(aptly readyと呼ばれます)が発生します。 readyが起動するまでは、OSCパケットを送受信できません。

あなたはこの行は同期だったとあなたは直後にsend()を呼び出すことができることと仮定したようなので、あなたの元のコードの場合には、それが見えます:

代わり
oscUDP.open(); 

、あなただけのreadyをリッスンするために必要なイベントを送信してから、Portにメッセージを送信してください。このように:

oscUDP.on("ready", function() { 
    oscUDP.send({ 
     address: "/carrier/frequency", 
     args: 440 
    }); 
}); 

osc.js Node.js exampleはこのパターンを示しています。しかし、あなたの質問を見たときに、osc.js READMEのサンプルコードがこの点で少し曖昧であることに気付きました。この点に関して私はimproved the event documentationthe inline README sample codeをより明確にしています。混乱させて申し訳ありません。

あなたのような場合があります。上位APIが必要なものではない場合があります。 osc.jsには、OSCパケットを容易にエンコードするための関数(Uint8Array)があり、Node.jsバッファに変換することができます。だから、osc.jsのosc.writeMessage()関数を使うだけで、あなたのソリューションに似た何かを行うことができました。それは常に幸いにも、かなりよく記録されています。ここにあなたの例では、osc.js'低レベルAPIを使用するように変更、です:

とにかく
const dgram = require('dgram'); 
const client = dgram.createSocket('udp4'); 
const osc = require('osc'); 

const HOST = '192.168.1.5'; 
const PORT = 8004; 

process.on('SIGINT', function() { 
    client.close(); 
}); 

let oscNoteMessage = function(note, value) { 
    var message = osc.writeMessage({ 
     address: '/note/' + note, 
     args: [ 
      { 
       type: 'i', 
       value: value 
      } 
     ] 
    }); 

    return Buffer.from(message); 
} 

let noteOn = function(note) { 
    return oscNoteMessage(note, 1); 
} 

let noteOff = function(note) { 
    return oscNoteMessage(note, 0); 
} 

let send = function(message) { 
    client.send(message, PORT, HOST, function(err, bytes) { 
    if(err) throw new Error(err); 
    }) 
} 

send(noteOn('c')); 
setTimeout(function() { 
    send(noteOff('c')); 
}, 1000); 

、私はあなたのプロジェクトのために働く解決策を考え出すことができたうれしいです、と私は、この応答が役に立てば幸い同様の問題が発生する可能性のある他のユーザーもちろん、osc.js issue trackerの質問やファイル問題をお気軽にお聞かせください。

お世話になりましたことをお詫び申し上げます。

関連する問題