MQTTでオフィスハック with RasPi

Preview:

Citation preview

リレーションズ株式会社

久原政彦

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.orgRasPi

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

メッセージの重要度を決められる。大事なデータだけは、絶対送る!

Recommended