スマートフォンであれば更新のお知らせなどにプッシュ通知を使うことができます。しかしそれ以外のデバイス(デスクトップやRaspberry PIなど)などのデバイスに対しては通知を送るのは困難です。
mBaaSからそういったデバイスに対してデータ更新があった旨通知を出したいと思ったことはないでしょうか。今回はスクリプトからMQTT(IoTデバイス用の相互通信用プロトコル)を使ってリアルタイム通知を実現してみます。
スクリプトについて
スクリプトはnode.jsのコードをmBaaSにアップロードしてサーバ内部で実行できる機能です。ロジックをサーバ側に隠蔽したい場合や、サーバを用意することなくロジックを実行できるようになります。
スクリプトでは各種ライブラリを使えますが、その一つとしてMQTTライブラリがあります。今回はこれを使います。
利用するサービス
MQTTではブローカーと呼ばれる中間サーバが必要になります。その中間サーバにデスクトップや各種デバイスから接続しておくことでmBaaSからのメッセージを受け取れるようになります。
今回はSangoを使っています。Sangoでは無料から使えるMQTTサーバを提供しています。
実際のコードについて
今回はデモなのでごく簡単なコードです。各種情報はSangoのダッシュボードで得られるものです。それぞれ自分のものと読み替えてください。
var mqtt = require('mqtt'); var userId = 'USER_ID'; var password = 'PASSWORD'; var server = 'lite.mqtt.shiguredo.jp:1883'; var channel = 'CHANNEL'; module.exports = function(req, res) { var client = mqtt.connect(`mqtt://${userId}:${password}@${server}`) client.on('connect', function () { client.subscribe(`${channel}#`) client.publish(channel, 'Hello from NCMB'); setTimeout(function() { res.status(200).json({}); }, 500); }) }
注意点としてはスクリプトの処理の最後でメッセージを送って(publishメソッド)res.jsonなどを実行してスクリプトを終わってしまうとメッセージが中断してしまってうまく届きません。数百ミリ秒は遅延させた方が良いようです。
受信したい側ではmessageを使って受け取ることができます。
client.on('message', function (topic, message) { console.log(message.toString()) })
このように実装することでデータストアの更新やユーザ登録などのタイミングでリアルタイム通知が送れるようになります。チャットのような使い方も考えられそうです。