#はじめに
Raspberry PIやESP-WROOM-02などをネットに接続して、外出先からムフムフしたい、IoTしたい、という方が多くなったと感じます。そこでMQTTを使ったデバイスのIoT化について、簡単ですが説明しようと思い立ちました。
Qiitaへの投稿は初めてです。読みにくい、情報が足りない、など拙い部分がありますが、生暖かい目で見ていただければ幸いです。
MQTTは、IoT向けにメッセージ電文を極力軽量化したPub/Sub型メッセージキューイングシステムです。
本説明におけるシステム構成を以下の図で示します。
スマホ←→CloudMQTT(Broker)←→CloudServer(Heroku)
←→Raspberry PI
と、各々の間でデータをやり取りする方法を説明します。
#手順概要
大きく3つに分けて説明します。
- Internet上にあるCloudMQTTの設定(インスタンス設定)
- message送信、受信テスト
- MQTTのWebsocket画面から topic “test” にAAAAA、BBBBの2回送信
- Internet上にあるCloudServer(Heroku)にてNode-RED起動 subscribe
- LAN上にあるRaspberry PIにてNode-RED起動 publish/subscribe
- message送信、受信テスト
- Raspberry PI上のNode-REDからタイムスタンプ値を1回送信
#1. CloudMQTTの設定
クラウド上で0円から使用できるCloudMQTTを例に設定例を示します。CloudMQTTのアカウント取得方法は、「CloudMQTT」で検索して下さい。e-mailアドレスがあれば作成できます。
CloudMQTT上でbroker作成
CloudMQTTでは複数のbrokerインスタンスが作成できます。
- Control PanelでCreateボタンを押しbrokerを作成します。
- 無料プランでも複数個設定できます。1インスタンスの同時接続は10までです。
名前、利用するリージョン、支払い方法の設定
インスタンスを確認
publish/subscribeする場合に必要な情報をメモしておきます。
MQTT over websocketsを使って試してみる
デフォルトで使用できるWebsocketクライアント画面から実行してみます。
- 当画面から2回メッセージを送信しています。
- 他のpublisherから1回メッセージが到着しています。
#2. CloudServerの設定
Herokuを使用していますが、Herokuの加入や設定は省略します。
Node-REDを悩み無く使うにはBlueMIXが最適だと思いますが、クレジットを登録することがイヤだったためHerokuをゴニョゴニョして使っています。
※HerokuでNode-RED環境を作る場合は、Heroku buttonというワンクリックインストールが利用できます。ただし、中で使用しているaddinのためクレジットの登録(課金されません。0円です)が必要です。「Heroku Node-RED」で検索してみてください。
- Heroku上のNode-RED画面です。
- subscriberノードにてメッセージを受信してデバック画面に表示しています。
- MQTTノードの設定は「3. LAN内のRaspberry PIの設定」と同じのため、そちらで説明します。
#3. LAN内のRaspberry PIの設定
Raspberry PIの標準OSであるRaspbian(Jessie)はNode-REDがプレインストールされています。入っていない場合は、www.nodered.orgサイトのdocument配下にあるraspberry piの説明を見てインストールして下さい。
Publisher,Subscriberの設定
Publisher,SubscriberともにServer名入力欄の横の鉛筆マークをクリックすることで詳細なダイアログが出てきます。図は詳細なダイアログを使ってMQTTの設定を行っています。
Raspberry PI上でpublish/subscribe
図はRaspberry PI上のNode-RED画面です。
- Raspberry PIはLAN上にあります。つまり、publisherかsubscriberであればNATを通過できるためファイアーウォールに穴を空けなくても良いということです。
- もちろん、LAN側をbrokerにしてInternet側からアクセスするためにはファイアウォールに穴を空ける必要が出てきます。なお、素のNode-REDにはbroker機能(ノード)はありません。
注意
セキュリティに細心の注意を払いましょう。
- WebsocketでCloudMQTTに接続する場合は、CloudMQTTのサンプルHTMLを見ると分かりますが、ID、Pass、Key、URL、PORTがベタ書きで丸見えなので、セキュリティに注意が必要です(認証/認可できたユーザにだけhttpsでHTMLを送るなどの対策が必要)。
- 通信はSSL/TLSを使用しましょう。
- http:、ws: 、mqtt:で来たらブロックするかhttps等にリダイレクトする処理をいれましょう。
細心の注意が必要とはいえ、LAN側にWebServerを立ち上げ、Internet上からアクセスさせる(ファイアーウォールに穴を空ける)ことに比べれば多少かもしれませんが難易度は下がります。Webアプリを作る人にとって常識的な、アプリセキュリティの作法を守ることで通常のWebアプリと同様に開発できます。
それでは皆さんIoTライフをお楽しみ下さい。