Androidのメモとか

ポキオの日記です。今日も遅延してない。

Node.jsのSSDPライブラリを使ってSonosのスピーカーを見つけてみる

S・S・D・P!

ポキオ Node.js SSDP Sonos

Sonosのスピーカーを見つけるよー

ひょんなことから我が家にやってきたSonosのスピーカー「One」。

www.youtube.com

この前のポキオ・カープールでもお伝えしましたが、

  • SonosはWi-Fiでつながるスピーカー
  • SSDPで機器発見できる
  • コマンドなどもSSDPで投げられるらしい

こんな感じの、エンジニアリングし甲斐がありそうなガジェットでもあるわけです。今回はNode.jsのSSDPライブラリを使って、まずはSonosのスピーカーを見つけてみようと思います。

いざコーディング

今回は、node-ssdpというライブラリを使ってみました。

www.npmjs.com

まずは、愚直にプロジェクトを作って、モジュールをインストールしていきます。

$ mkdir ssdp-test
$ cd ssdp-test/
$ npm init -y
$ npm install node-ssdp

おもむろに、index.jsと名付けた本体のスクリプトをこんな感じで作っていきます。

var ssdp = require('node-ssdp').Client
var client = new ssdp({})

client.on('response', function inResponse(headers, code, rinfo) {
    console.log('%d\n%s\n%s', code, JSON.stringify(headers, null, '  '), JSON.stringify(rinfo, null, '  '))
})

setInterval(function () {
    client.search('upnp:rootdevice')
}, 5000)

5秒おきにSSDPの機器探索のコマンドを投げていますが、対象はupnp:rootdeviceとして、ルートデバイスのみを探索します。

実行!

実行してみますー。

$ node index.js

すると・・・

200
{
  "CACHE-CONTROL": "max-age = 1800",
  "EXT": "",
  "LOCATION": "http://xx.xx.xx.xx:1400/xml/device_description.xml",
  "SERVER": "Linux UPnP/1.0 Sonos/54.2-72031 (ZPS13)",
  "ST": "upnp:rootdevice",
  "USN": "uuid:RINCON_xxxxx::upnp:rootdevice",
  "X-RINCON-HOUSEHOLD": "Sonos_xxxxx",
  "X-RINCON-BOOTSEQ": "2",
  "X-RINCON-WIFIMODE": "1",
  "X-RINCON-VARIANT": "2",
  "HOUSEHOLD.SMARTSPEAKER.AUDIO": "Sonos_xxxxxx"
}
{
  "address": "xx.xx.xx.xx",
  "family": "IPv4",
  "port": xxxxx,
  "size": 445
}

おー!Sonosっぽいのが見つかりましたー。

ちゃんとSSDPできてるっぽいですねー。

[asin:B07HSBKTFH:detail]

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。