Posted at
NIFTYDay 8

Wio Node SDKをWebSocket対応した

More than 1 year has passed since last update.

※この記事はNIFTY Advent Calendar 8日目の記事です。

前回の記事のFuture WorkだったWebSocket接続に対応しました。

これで、センサーの値の変化をリアルタイムで検知して、イベントを発火することができるようになりました!

リポジトリ:https://github.com/fuku2015/wio_node

(Wio Nodeそのものについてや、基本的な導入方法については、先に前回の記事をご覧ください。=> Wio NodeのSDKをNode.jsで書いてみた )


使い方

WebSocketはセンサーそれぞれではなく、Wio Node本体と一本のコネクションをはるので、モジュールのインスタンスからconnectWSメソッドを生やします。

引数として、メッセージ受信時のハンドラを設定します。

"use strict"

const token = "YOUR_TOKEN";

const Wio = require("./lib/wio_node");
const wio = new Wio(token);

wio.connectWS(function(err, res){
if(err) console.log(err);
console.log(res);
});

これで、メッセージが届くたびに、ハンドラが実行されます。

メッセージフォーマットは以下の通りです。

{event: "EVENT_NAME", port: PORT_NUMBER} // PORT_NUMBER -> 0 or 1

生のフォーマットだとJSON形式でもないし、ポート情報も0/1とかPORT0/PORT1とかじゃなかったので、大分使い勝手が良くなったハズ。


活用例

片方のセンサーの値の変化によって、もう片方のセンサーの値をリアルタイムに書き換えるような処理も簡単に書けるようになりました!(APIでサポートしてそうですが、実はされてない。)

以下のサンプルでは、PORT0にLED、PORT1にボタンやタッチセンサーを接続すると、プッシュやタッチするたびにLEDがON/OFFするようになっています。

■ Wio Linkの設定

PORT0: GenericDigitalOutput

PORT1: GenericDigitalInput

"use strict"

const token = "YOUR_TOKEN";

const Wio = require("./lib/wio_node");
const wio = new Wio(token);
const digiOut = new wio.GenericDOut(0);

var onoff = 0;
wio.connectWS(function(err, res){
if(err) console.log(err);
if(res.event === "input_rise" && res.port === 1){
onoff = 1 - onoff;
}
digiOut.send(onoff);
});

これはあくまで一例です。

他のサービスやシステムと組みあわせて、人感センサーが反応したらプッシュ通知でアラートがくるとか、温度センサーが一定以下になったら暖房が入るなどといった使い方ももちろんできます。

(SDK使って作ってみた系の記事も追って書くつもりです。)


感想

書き出す前はもう少しめんどくさい使い勝手になるかと思ってましたが、意外とシンプルでいい感じになりました。

リアルタイムに値の変化を取れると、やっぱり動いてる感があってテンション上がりますね!

APIたたくよりもこっちのほうを先に実装すべきだった気がします。

WebSocket接続ができた勢いでnpm公開をしそうになりましたが、検索して出てきたモジュールがこのクオリティだったら、自分ならそっ閉じするなぁと思ったので、イケてるコードとまではいかなくても、せめてテストとかバリデーションとかをちゃんとやってからにしようと思います。

(npmで使えないとなかなか使ってもらえないので、年内にさっさとやろう…。)

明日は@uochanさんです!お楽しみに!