はじめに
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」とか接続確認用のコマンドを送って、応答返ってきたらコイツだ!とやるしか無いのかな。うーむ。