Node-REDでAWS IoT Coreを使ってみた
はじめに
データアナリティクス事業本部の藤川です。
microSDカードの単価が下がり、5枚、10枚セットで販売されるようになりました。大変ありがたいことですが、増え続けるmicroSDカードの管理方法はちょっと問題です。
microSDカードはサイズが小さいため、ラベルを貼り付けるスペースもありません。また、シリアル番号のような識別情報が書き込まれていないようです。どうにか簡単に管理できる方法はないかと考えあぐねていました。
そして、たどり着いたのは、AWS IoT Core
の証明書ファイルです。これを利用できないものかと思い、試してみました。
ただ証明書ファイルを作成するだけでは面白くありません。Raspberry PiをMQTT client
として活用する準備を兼ねて、AWS IoT Core
で発行した証明書ファイルをRaspberry Piに入れて、Node-RED
で使用する方法をご紹介したいと思います。
ゴール
準備
- Raspberry Pi本体
- 8GB以上のmicroSDカード
設定方法
AWS IoT Coreで証明書を発行
- AWS IoT Coreで証明書を発行します。こちらのブログのRaspberry PiとAWS IoTでLチカを参考にしてください。次の4ステップです。
- 作成した証明書をRaspberry Pi本体にアップロードします。アップロード先について、特に決まりはありません。私は、microSDカードの管理も兼ねて、証明書ファイルを
/boot/certs
ディレクトリに置くようにしています。こちらのブログが参考になります。sudo mkdir /boot/certs
/boot/certs
ディレクトリにアップロードする証明書ファイルは、このモノの証明書
とプライベートキー
のみで構いません。パブリックキー
はここでは不要です。証明書の種類 表示されているファイル名 実際にダウンロードされるファイル名 今回、使用する? このモノの証明書 *.cert.pem *-certificate.pem.crt 使用 パブリックキー *.public.key *-public.pem.key 不要 プライベートキー *.private.key *-private.pem.key 使用 AWS IoTのルートCA ※なし AmazonRootCA1.pem 使用 AWS IoTのルートCA
は、ここからRSA2048ビットキー: Amazon Root CA 1
ファイルをダウンロードします。次のコマンドを実行してください。cd /boot/certs sudo wget https://www.amazontrust.com/repository/AmazonRootCA1.pem -O AmazonRootCA1.pem
- 次のファイル構成になっていれば問題ありません。
/boot/certs - *-certificate.pem.crt - *-private.pem.key - AmazonRootCA1.pem
Node-REDをインストール
※参考:Raspberry Piで実行する : Node-RED日本ユーザ会
- Raspberry PiにSSH接続します。
Node-RED
のインストーラをダウンロードし、実行します。bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
Running Node-RED install for user pi at /home/pi on raspbian This can take 20-30 minutes on the slower Pi versions - please wait. Stop Node-RED ✔ Remove old version of Node-RED ✔ Remove old version of Node.js ✔ Install Node.js LTS ✔ Node v12.18.2 Npm 6.14.7 Clean npm cache ✔ Install Node-RED core ✔ 1.1.2 Move global nodes to local ✔ Install extra Pi nodes ✔ Npm rebuild existing nodes ✔ Add shortcut commands ✔ Update systemd script ✔ Any errors will be logged to /var/log/nodered-install.log
All done. You can now start Node-RED with the command node-red-start or using the icon under Menu / Programming / Node-RED Then point your browser to localhost:1880 or http://{your_pi_ip-address}:1880 Started Thu Jun 21 12:34:44 UTC 2018 - Finished Thu Jun 21 12:48:37 UTC 2018
Node-RED
を起動します。sudo systemctl start nodered.service
- ブラウザで
Node-RED
にアクセスします。デフォルトのポート番号は1880
です。 -
問題なければ、システム起動時に自動起動するよう設定します。
sudo systemctl enable nodered.service
Node-REDのMQTTノードをインストール
- Raspberry PiにSSH接続します。
node-red-contrib-aws-iot
モジュール(node-red-contrib-aws-iot - npm)をインストールします。cd ~/.node-red npm install node-red-contrib-aws-iot
Node-RED
を再起動します。sudo systemctl restart nodered
Node-RED
にアクセスします。-
パレットに次のノードが追加されていることを確認します。
aws-iot-in
ノードaws-iot-out
ノードaws-iot-broker
ノード
Node-REDにAWS IoT Coreを設定
Node-RED
で、次のノードをフローにドロップします。aws-iot-in
ノードaws-iot-out
ノードinject
ノードdebug
ノード
aws-iot-in
ノードとdebug
ノード、inject
ノードとaws-iot-out
ノードをそれぞれ接続します。-
aws-iot-in
ノードをダブルクリックして開きます。 aws-iot-broker
ノードの編集画面で、Server
項目の右側にある鉛筆アイコンをクリックします。-
Connection
タブにAWS IoT Core
の設定を入力します。aws-iot-broker
ノードの設定項目AWS IoT Core
の設定項目設定値 Server カスタムエンドポイント <*-ats>.iot.ap-northeast-1.amazonaws.com Port ※指定なし 8883 Client ID モノの名前 <モノの名前> Keep alive time(s) ※指定なし 60 -
Security
タブに証明書ファイルへのパスを入力します。項目 値 Key Path /boot/certs/*-private.pem.key Cert Path /boot/certs/*-certificate.pem.crt CA Path /boot/certs/AmazonRootCA1.pem -
追加
ボタンをクリックします。 -
aws-iot-in
ノードの編集画面に戻り、次の値を入力します。Server
項目には、aws-iot-broker
ノードで設定した値が入力されています。項目 値 Server <Client ID>@<Server> Topic data/<モノの名前> Name <モノの名前> -
完了
ボタンをクリックします。 aws-iot-out
ノードをダブルクリックして開きます。-
aws-iot-out
ノードの編集画面で、次の値を入力します。Server
項目には、aws-iot-broker
ノードで設定した値が入力されています。項目 値 Server <Client ID>@<Server> Topic data/<モノの名前> Name <モノの名前> -
完了
ボタンをクリックします。 デプロイ
ボタンをクリックします。
動作確認
AWS IoT Core側の作業
- このブログにある通信テストをしてみるを参考に動作確認します。
AWSマネジメントコンソール
でAWS IoT Core
を開きます。テスト
を開きます。MQTTクライアント
でトピック
にdata/<モノの名前>
と入力します。トピックへのサブスクライブ
ボタンをクリックします。トピックへの発行
ページに画面遷移します。-
メッセージウィンドウに表示されている次のJSONデータを適当に編集します。
{ "message": "Hello from AWS IoT console" }
トピックに発行
ボタンをクリックします。Node-RED
のデバッグウィンドウに、送信したJSONデータが表示されたことを確認します。- 次に、
inject
ノードの左側のボタンをクリックします。 Node-RED
のデバッグウィンドウに、タイムスタンプ(13桁の数値)が表示されたことを確認します。トピックへの発行
ページにも、タイムスタンプ(13桁の数値)が表示されたことを確認します。- これで完了です。
さいごに
証明書ファイルを入れることで、microSDカードを識別できるようになり、管理し易くなりました。
また、Raspberry Piをエッジデバイスとして登録し、簡単にMQTTクライアントとして使用できるようになりました。
IFTTTやZapierのようなハブサービスと連携し、ローコードかつローコストでIoTを楽しむ準備ができました。
様々なアイディアをご紹介して参りたいと思います。