リレーションズ株式会社
久原政彦
Masahiko KUBARA
自己紹介
 久原政彦(Masahiko KUBARA)
リレーションズ株式会社
→この会場です!
 組み込みエンジニア
フロントエンジニア
 ステータス:明日引っ越し。
背景
 以前は、組み込みエンジニア
 ARMとBTと足裏圧力センサを使ってリハビリ支援
 RasPiで廃棄物計量監視
 最近は、webフロントエンジニア
 JavaScript/SPA
 bower, browserify, vue, gulp,,, 覚えることたくさん
 。○(電子工作をもっと楽しみたい…)
_人人人人人人人人人人人人_
> JavaScriptで電子工作 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
JavaScriptで電子工作…
 Tesselとかもあるけど…
 高いねん… 10000円とか…
 RasPiが安くて気軽!
 3,240円なら、まぁ壊しても安心
 GPIO直接叩ける
 通信もWi-FiドングルでOK
 「センサデータとか、処理結果とか、
うまく投げたいな。」
_人人人人人人人人人人人人人人人_
> いまMQTTが流行りだってよ! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
MQTTって何?
 メッセージングプロトコル。
 IoT、とくにセンサネットワーク向き
 ヘッダが軽い
 重要度管理ができる (QoS)
 最後のメッセージはいつでも取り出せる (Retain)
 遺言も残せる (Will)
 pub/subモデル
 データを好きなだけ投げて良い
 それを聞きたい人だけに、配送する
 プロトコルが軽いので、中継役が低スペでもOK
つくってみた
玄関に人が来たら知らせるシステム
 センサで人を検知して、アラームを鳴らす。
 つい先日、5Fを増床しました。
 誰かが来てもわからない。
 「お客さんキタヨ!!」→すぐ対応!
 「うろついてる人イルヨ」→すぐ対応!
システム概要
 ハードウェア
 Raspberry Pi
 アラーム:LED
 センサ :焦電センサ(SB412A @500)
 ソフトウェア
 Node.js
 mqtt.js MQTTが簡単に使える
 wiring-pi GPIOが簡単に使える
構成
RasPi
焦電センサ
Wi-Fi
test.mosquitto.org
RasPi
Wi-Fi
publisher subscriberbroker
RasPi
焦電センサ
Wi-Fi
mkubara/ir/9F
mkubara/ir/5F
mkubara/ir/9F
mkubara/ir/5F
publisher(センサ)
 初期設定
 RasPiのWi-Fiを設定
 Node.jsを入れておく
 センサ出力をGPIO11に繋ぐ
 npm i mqtt wiring-pi
 sudo node pub.js
// MQTTクライアントのセットアップ
var mqtt = require('mqtt');
, client = mqtt.connect
('mqtt://test.mosquitto.org');
// センサ入力の設定
var wpi = require('wiring-pi')
, sensor = 11;
wpi.setup('wpi');
wpi.pinMode(sensor, wpi.INPUT);
// 100msごとにセンサをチェック
// 反応があればpublishする
var state = 0;
setInterval(function(){
var detected = wpi.digitalRead(sensor);
if (state != detected){
client.publish('mkubara@github/ir/5F‘
, ''+detected);
state = detected;
}
}, 100);
subscriber(LED)
 初期設定
 RasPiのWi-Fiを設定
 Node.jsを入れておく
 LEDをGPIO10に繋げておく
 npm i mqtt wiring-pi
 sudo node sub.js
// MQTTクライアントのセットアップ
var mqtt = require('mqtt');
, client = mqtt.connect
('mqtt://test.mosquitto.org');
// センサ入力の設定
var wpi = require('wiring-pi')
, led = 10;
wpi.setup('wpi');
wpi.pinMode(led, wpi.OUTPUT);
// 焦電センサからの通知を購読する
var detected = 0;
client.subscribe('mkubara@github/ir/5F');
client.on('message',
function(topic, message){
detected = (message!='0' ? 1 :0);
});
// 定期的に表示を更新する
setInterval(function(){
wpi.digitalWrite(led, detected);
}, 100);
brokerはどうする?
 test.mosquitto.org
 テスト用。コネクションを定期的にリセット
 MQTT as a Service
 Sango(時雨堂) :メッセージ数で制限
 CloudMQTT(heroku):帯域幅で制限
 自前で立てる
 mosquitto
 クラウドサーバ、RasPiでもいい!
Demo…はライブ実行中ですね
やってみて
 すごい、楽。
 クライアントはTopicを指定してpub/subするだけでいい
○ 再送管理とか気にしない
○ APIとかいらない
 意外とJavaScript-OnlyでもOKだった
 webプログラマ側からどんどんアプローチできるかも
 webとgadgetが、簡単に繋がる!
 興味のある人、ぜひお友達になりましょう!
これからやりたいこと
MQTT-SN
 センサネットワーク
 ZigBee系を想定? XBee、TWE-Lite
BLEとかでもイケるとは思う
 TWE-Liteで超省電力ノード
 TWE-EH Solar
○ 無電源!: 環境発電で賄える
○ 鋭意製作中。
ブラウザからでもpub/subできる!
 mows.js
 WebsocketでMQTTできる
 クライアントもNode.jsで作る
 browserify
 angular, react, vue …
 gulp
 mows
いろいろなモノと連携…
 Slack
 チャットでpublish
 hubot
 センサをsubscribeしておいて、反応する
 MicroService
 センサデータを、意味のあるデータへ変換
 Google App Script
 カレンダーを見て、会議の終了アラートとか
MQTTでオフィスハック
おわり
補足用
MQTTってなんぞや? [MQTT 1/3]
 軽量プロトコル
 IoT向け
M2M用に作られたメッセージングプロトコル
 2バイト
ヘッダサイズ。 → 組み込み環境向き
(HTTPの1/10のデータ量で済む例も)
トピックベースで pub/sub [MQTT 2/3]
 トピックでまとめる
 pub/subモデル
 投げたいだけ投げる
 聞きたいだけ聴く 認証はTLSとかで
 Brokerが仲介
センサネットワーク向き [MQTT 3/3]
 Will
 接続が切れたら発行されるメッセージ。
これで電池が切れてもわかる!
 Retain
 最後のメッセージは取っておける。
いつ購読開始してもデータが受け取れる!
 QoS
 メッセージの重要度を決められる。
大事なデータだけは、絶対送る!

MQTTでオフィスハック with RasPi