LeapMotionのWebSocketへのリモートホストからの接続

指の動きを認識する未来感あふれるジェスチャーデバイスのLeapMotionですが、
現時点(2014年5月)においては、Windows/MacOSX/Linuxがサポートされています。
でも、サポートされていないAndroidでも使いたいよねっていう話です。

Leap Motionが配布しているパッケージには、
leapdというデーモンが同梱されており、これがWebSocket Serverの動きをします。
これを使うと、ws://localhost:6437に接続する事でJSON形式でデータを受け取る事ができます。
この辺りは以下のサイトが参考になります。

それで、この仕組みを使って簡単にやろうとすると、
Leap Motion -(USB2.0)- PC(Win/Mac/Linux) -(WebSocket)- Android
ということになります。
以前はこれで大丈夫だったんですが、Leap Motion Software v1.2からはそのままだと上手く行きません。
実はv1.2にセキュリティ対策の一環で、リモートホストから直接WebSocketサーバに接続する事はできなくなりました。
※当然と言えば当然ですが・・・
v1.2のβ版のアナウンスの所にこっそり書いてあります

それではどうするかということですが、上記アナウンスにちょこっと書いてあるとおり、
config.jsonを変更することで、以前と同様の動作をするようになります。

■ ファイルの在処
config.jsonの場所はプラットフォーム毎に異なります

  • Linux: ~/.Leap\ Motion/config.json
  • Mac: ~/Library/Application\ Support/Leap\ Motion/config.json
  • Windows: %AppData%\Leap Motion\config.json

■ 設定内容
以下の設定を追加
“websockets_allow_remote”: true

■ デーモンの再起動
config.jsonを変更した後は、デーモンを再起動する必要があります。これもまたプラットフォーム毎に異なります。
Leap Core Serviceの手動再起動

・Windowsの場合
Administrator権限で以下のコマンドを実行
net stop LeapService
net start LeapService

・MacOSXの場合
以下のコマンドを実行
sudo launchctl unload /Library/LaunchDaemons/com.leapmotion.leapd.plist
sudo launchctl load /Library/LaunchDaemons/com.leapmotion.leapd.plist

ということで、直接リモートホストからWebSocketに接続できるようになりますが、
上記以外にポートを空けておく必要があります。
MacOSXの場合は、[システム環境設定] > [セキュリティとプライバシー] > [ファイアウォール]のファイアウォールオプションから
Leap Motion.appに外部からの接続許可を与えてあげればOKですね。

※FWの設定だけではポートが開かない場合がありました。その場合は以下を行うと良さそうです。
■ ipfwの設定
以下のコマンドで、ipfwを使ってポートを開放します
sudo ipfw add 1000 allow tcp from any to any dst-port 6437
実際に上手く設定できたかどうかは、
sudo ipfw list
で確認できます。以下のような感じになっていればOK。
01000 allow tcp from any to any dst-port 6437
65535 allow ip from any to any

■ Airspaceでの認証
どうも上記ipfwの設定だけではだめで、Airspaceの認証も必要なようです。
Airspaceを立ち上げてログインすればOKです。
その後、leapdを再起動するとリモートホストからつながるようになりました。