CloudMQTTを使ってRaspberry PIをクラウドに接続する

#はじめに

　Raspberry PIやESP-WROOM-02などをネットに接続して、外出先からムフムフしたい、IoTしたい、という方が多くなったと感じます。そこでMQTTを使ったデバイスのIoT化について、簡単ですが説明しようと思い立ちました。
　Qiitaへの投稿は初めてです。読みにくい、情報が足りない、など拙い部分がありますが、生暖かい目で見ていただければ幸いです。

　MQTTは、IoT向けにメッセージ電文を極力軽量化したPub/Sub型メッセージキューイングシステムです。
　本説明におけるシステム構成を以下の図で示します。
![s1.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/f0ea5351-24aa-b8a4-b76e-e7279995f890.png)

スマホ←→CloudMQTT(Broker)←→CloudServer(Heroku)
　　　　　　　　　　　　　　←→Raspberry PI
と、各々の間でデータをやり取りする方法を説明します。

#手順概要
　大きく３つに分けて説明します。

1. Internet上にあるCloudMQTTの設定（インスタンス設定）
    - message送信、受信テスト
    - MQTTのWebsocket画面から topic “test” にAAAAA、BBBBの2回送信
2. Internet上にあるCloudServer(Heroku)にてNode-RED起動 subscribe
3. 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までです。

![s2.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/5b44d4bc-df90-3e21-8b24-537a9decad58.png)

### 名前、利用するリージョン、支払い方法の設定
　図に示す箇所に入力します。無料プランを選んでいます。
![s3.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/5b4795f3-7d5d-6fde-114f-20cd5edd1d77.png)

### インスタンスを確認
　publish/subscribeする場合に必要な情報をメモしておきます。

- 下記の画面で表示されていない下部分に、アカウント毎に接続要否を設定できます。
![s4.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/e0930d74-5842-aa26-7ee2-62ef1b363f54.png)

### MQTT over websocketsを使って試してみる 
　デフォルトで使用できるWebsocketクライアント画面から実行してみます。

- 当画面から２回メッセージを送信しています。
- 他のpublisherから１回メッセージが到着しています。

![s5.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/eebaf6b3-39f8-24e9-050b-347b2427ad18.png)

#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の設定」と同じのため、そちらで説明します。

![s6.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/a1d01d61-c3ca-109b-c9ee-d500c27b4f39.png)

#3. LAN内のRaspberry PIの設定
　Raspberry PIの標準OSであるRaspbian(Jessie)はNode-REDがプレインストールされています。入っていない場合は、www.nodered.orgサイトのdocument配下にあるraspberry piの説明を見てインストールして下さい。

### Publisher,Subscriberの設定
　Publisher,SubscriberともにServer名入力欄の横の鉛筆マークをクリックすることで詳細なダイアログが出てきます。図は詳細なダイアログを使ってMQTTの設定を行っています。

![s8.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/d08c3fd0-e0cd-bb70-b3d8-6f49930d366b.png)
<Connectionタブ>

![s9.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/a0429457-ecd3-235d-becd-ab71c76fe9ee.png)
<Securityタブ>

### Raspberry PI上でpublish/subscribe
　図はRaspberry PI上のNode-RED画面です。

- Raspberry PIはLAN上にあります。つまり、publisherかsubscriberであればNATを通過できるためファイアーウォールに穴を空けなくても良いということです。
- もちろん、LAN側をbrokerにしてInternet側からアクセスするためにはファイアウォールに穴を空ける必要が出てきます。なお、素のNode-REDにはbroker機能（ノード）はありません。

![s7.PNG](https://qiita-image-store.s3.amazonaws.com/0/155377/47e3d8ac-9f82-5dcc-5ea8-cd8d4ad03c64.png)


# 注意
　セキュリティに細心の注意を払いましょう。

- WebsocketでCloudMQTTに接続する場合は、CloudMQTTのサンプルHTMLを見ると分かりますが、ID、Pass、Key、URL、PORTがベタ書きで丸見えなので、セキュリティに注意が必要です（認証／認可できたユーザにだけhttpsでHTMLを送るなどの対策が必要）。
- 通信はSSL/TLSを使用しましょう。
- http:、ws: 、mqtt:で来たらブロックするかhttps等にリダイレクトする処理をいれましょう。

　細心の注意が必要とはいえ、LAN側にWebServerを立ち上げ、Internet上からアクセスさせる（ファイアーウォールに穴を空ける）ことに比べれば多少かもしれませんが難易度は下がります。Webアプリを作る人にとって常識的な、アプリセキュリティの作法を守ることで通常のWebアプリと同様に開発できます。

　それでは皆さんIoTライフをお楽しみ下さい。