凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Node.js で SSDP したり TCP/IP で Socket 通信したりする

はじめに

iRemocon の発見や操作を node.js から行いたいな、と思って調べてみました。

SSDP

インストールするには、

$ npm install ssdp

で OK のようです。ただ、mac だとうまく行かなかったので mercurial 経由で直接入れました。

$ mkdir node_modules
$ cd node_modules
$ hg clone https://bitbucket.org/Xedecimal/node-ssdp
$ mv node-ssdp ssdp

以下のようにすると ssdp:all で機器発見できます。

コード
var SSDP   = require('ssdp').SSDP
  , client = new SSDP()
;

client.on('response', function (msg, rinfo) {
	console.log(msg.toString());
	console.log(rinfo);
	console.log('\n\n');
});

client.search('ssdp:all');
結果
HTTP/1.1 200 OK
DATE: Sun, 30 Sep 2012 15:09:38 GMT
LOCATION: http://192.168.0.7:58888/
EXT:
SERVER: Linux/2.6 UPnP/1.0 nasne/1.0
X-AV-Server-Info:av="5.0"; hn=""; cn="Sony Computer Entertainment Inc.";mn="nasne";mv="1.0";
USN:uuid:1C14A083-0001-1010-8000-0025DC5A4141::upnp:rootdevice
CACHE-CONTROL:max-age=1800
ST: upnp:rootdevice


{ address: '192.168.0.7', family: 'IPv4', port: 1900, size: 344 }

(以下ズラーッと)

nasne さんの応答の例を出すとこんな感じです。
ちなみに、iRemocon からは応答返ってきませんでした…。やっぱり法人向けにしか公開していないのか。。

TCP/IP

iRemocon への接続に関してはマニュアルに以下のように書いてあります。

IRM-01Lへの接続は以下のポート番号に対してTCP/IPのSocket通信で行います。

過去に、boost::asio を使って C++ で書いてみましたが、Node.js では以下のようになります。

コード
var net = require('net');

var client = net.createConnection(51013, '192.168.0.2', function() {
	console.log('client connected');
	client.write('*is;1\r\n');
});
client.on('data', function(data) {
	console.log(data.toString());
	client.end();
});
client.on('end', function() {
	console.log('client disconnected');
});
結果
client connected
i
s;ok


client disconnected

なんか i と s に改行挟まれてますが。。これで、iRemocon に学習させた 1 番の赤外線信号を発信させることができます。

おわりに

iRemocon を発見するにはどうしたら良いんですかね。。
ping で全部見てまわって、応答がある奴に「*au\r\n」とか接続確認用のコマンドを送って、応答返ってきたらコイツだ!とやるしか無いのかな。うーむ。