AWS IoTとM5StickCでMQTT通信してみる
こんにちは。ネクストビートでエンジニアとして働いている窪山です。
普段の業務ではおもに保育士バンク!でAndroid/iOSアプリの機能開発と保守をしています。
さて、本ブログの過去記事でもご紹介しましたが、弊社の開発部では「夕学講座」という施策をおこなっています。
業務時間内にエンジニア同士で学び合おう!「夕学講座」のご紹介
私はこの夕学の時間を使って、自宅の水槽を遠隔モニタリングするリモートアクアリウムというIoTプロトタイプの開発に取り組んでいます。本記事ではそこで得た知見をアウトプットできればと思います。
はじめに
IoTプロトタイプ開発の初歩として、デバイスとクラウド間の通信を試してみようと思います。
デバイスにはM5StickC、クラウドにはAWS IoTを使い、IoTではメジャーなMQTT(Message Queue Telemetry Transport)を使った双方向通信の実現を目指します。
AWS IoT
AWS IoTは様々なIoTデバイス(モノ)とAWSの各種サービスとをつなげるゲートウェイの役割を果たします。
MQTTにも対応しており、MQTT v3.1.1に準拠したメッセージブローカーが実装されています。独自仕様となっている部分もあるので、詳しくはAWS IoT開発者ガイドを参照してください。
AWS IoTのセットアップは以下の流れで行います。
- モノの作成
- 証明書の作成
- ポリシーの作成
それでは、実際にやってみます。
1. モノの作成
サイドメニューから管理 > モノを選択します。
モノが未作成の場合は上記のように「まだモノがありません」と表示されますので、モノの登録を押して作成画面を開きます。
AWS IoT モノを作成するという画面に切り替わるので、単一のモノを作成するを選択します。
タイプやグループがありますが、今回はシンプルに名前だけを定義します。
名前欄に「m5stickc」と入力します。この名前は後述するM5StickCに書き込むスケッチでも記述する必要があります。
次へを押すと証明書の追加画面に切り替わります。
2. 証明書の作成
ここからは証明書の作成です。
今回は「1-Click 証明書作成」を行いますので証明書を作成を押します。
モノと証明書がセットで作成されます。
ここで作成された証明書およびキーはクライアント(M5StickC)の認証に使用します。プライベートキーとパブリックキーはここでしかダウンロードできないので、忘れずにダウンロードしておく必要があります。
また、画面上にも記載されていますがAWS IoT のルート CAも必要になります。リンクを押すと別タブが開き、そのページ内にRSA 2048 bit key: Amazon Root CA 1というリンクがあるので、リンク先で表示された文字列を控えておきます。
ダウンロードが完了したら証明書を有効化します。左下の有効化を押します。ボタンが無効化に切り替わればOKです。
以上でモノと証明書の作成は完了です。
3. ポリシーの作成
続いてポリシーを作成します。ポリシーはAWS IoTにモノがアクセスする際のルールを定義するもので、JSON形式で定義することができます。
サイドメニューから安全性 > ポリシーを選択します。
ポリシーの作成を押して作成画面を開きます。
ポリシーの構文はリソースに対してアクションを許可/拒否するという構成になっています。
まず名前を入力し、ポリシーの定義を記述していきます。記述方法はアドバンスモードとベーシックモードの2種類が用意されています。
アドバンスモードはステートメント単位でフォームに入力するモードです。対してベーシックモードはJSONを直接記述するモードです。2つのモードは自由に切り替えることができます。
今回は下記のようなポリシーを定義しました。
アカウント関連の情報はマスクしていますが、簡単に解説します。
- iot:Connectがあるステートメントは接続に関する定義です。
ここでは接続を許可する条件として、AWSアカウントで作成したm5Stickcという名称のモノか、証明書情報が設定されているかをチェックしています。 - iot:PublishがあるステートメントではMQTTでPublishする対象のトピックを定義しています。
- iot:SubscribeがあるステートメントはMQTTでSubscribe可能なトピックを定義しています。
- iot:ReceiveがあるステートメントはAWS IoT Core からメッセージを受信する際の権限について定義しています。
詳細な解説については AWS IoT Core ポリシーアクション を参照してください。
最後にポリシーを証明書にアタッチします。
サイドメニューの安全性から証明書を選択し、先ほどモノに追加した証明書を選択します。
詳細画面のアクションからポリシーのアタッチができますので、先ほど作成したポリシーをアタッチします。
以上でAWS IoT側の準備は完了です。
M5StickC
M5StickCはSoC(System on Chip)にESP32-Picoというチップを採用したIoTデバイス開発ツールです。
GPIO(汎用入出力ポート)やGrove(seeed studioが開発している汎用モジュール規格)といった各種インタフェースを備えており、LCDディスプレイ付きでなおかつWiFiやBluetoothも使用可能というプロトタイピングにはうってつけのデバイスです。
開発環境はいくつかありますが、今回はArduino IDEを使います。
※開発環境の構築については本記事では割愛します。
作成したスケッチは以下のとおりです。MQTTクライアントとしてPubSubClientを導入しています。また、受信したJSONを解析するためにArduionJsonを導入しています。
WiFiアクセスポイントやAWSのエンドポイントには環境に沿った値を記述します。また、AWS IoTで作成した各種証明書の値を記述する必要があります。
このスケッチは以下のように動作します。
- WiFiに接続する
- MQTT接続を確立する
- topic01/fromCloudをSubscribeする
- topic01/fromCloudでstartという文字列を受信すると topic01/fromDeviceに対してインクリメントした値を5秒間隔でPublishする
- topic01/fromCloudでstopという文字列を受信するとPublishを停止する
動作確認
それでは実際に動かしてみましょう。
Arduino IDEからM5Stickcにスケッチを書き込みます。シリアルコンソールには下記のように出力されます。
WiFiに接続しtopic01/fromCloudにSubscribeできました。
それでは次にAWS IoTのコンソールからトピックに対してメッセージを発行してみます。
サイドメニューのテストを選択するとテスト用のMQTTクライアントが起動します。
右下にある発行という部分でトピックをtopic01/fromCloudに、メッセージの内容をstartと記述してトピックに発行を押します。
M5StickC側のシリアルコンソールを確認してみます。
Subscribeしているtopic01/fromCloudからstartという文字列を受け取りtopic01/fromDeviceにインクリメントした値のPublishを開始しています。
それではAWS IoT側のMQTTクライアントで受け取れているかを確認してみます。
さきほど開いていたMQTTクライアントに戻り、トピックのサブスクリプションにtopic01/fromDeviceと記述してトピックへのサブスクライブを押します。
左側にトピックが増えるので、選択すると下記のようにM5StickC側から送信した値が受け取れていることを確認できます。
最後に、AWS IoT側のMQTTクライアントからtopic01/fromCloudにstopという文字列を発行します。
M5Stick側のシリアルコンソールを確認し、Publishが停止していることを確認し、AWS IoT側でも新たな値が送られてこないことを確認します。
動作確認は以上となります。
まとめ
本記事ではIoTプロトタイプ開発の初歩として、デバイスとクラウドの通信をAWS IoTとM5StickCを使って確認してみた内容をまとめてみました。
M5StickCは様々なセンサーや拡張デバイスを接続することができますし、AWS IoTはLambdaやS3といった他のAWSサービスと連携することができます。
やりたいことはまだまだありますが、夕学の時間を有効活用してさらにIoTに関する知見を深め、理想のリモートアクアリウムの実現を目指したいと思います。
それでは、ここまで読んでいただいてありがとうござました!