M5StickC with ENV HatでAWS IoTにPublishしCloudWatch Logs Insightsで可視化

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回の続きとなります。
https://www.skyarch.net/blog/?p=18370

よくある話で、温度、湿度、気圧をAWS IoTに投げ可視化するのですが
最近高頻度でUpdateされ、便利になって大好きなCloudWatch Logs Insightsを使ってみます。

出来たもの

電源を入れると、Wifi接続 ⇢ AWS IoTへ接続 ⇢ センサ値をPublishと進み、AWS IoTのテスト画面にて受信できた事を確認できるという動画です。

  • 温度・湿度・気圧を画面内に表示
  • 温度・湿度・気圧をAWS IoTにPublish
  • Aボタンを押下すると (離した際に)LED状態が変化します。 (将来用に前回のソースコードそのまま)

可視化

CloudWatch Logs Insightsを利用し簡易的に可視化しています。
温度、湿度の1分毎平均値をプロット

目次

手順の概要

  1. AWS IoTで モノ/証明書/ポリシーを作成し適切な関連にAttach (AWS CLIにて実施)
  2. コード書く/転送
  3. AWS IoTで データ受信確認
  4. AWS IoTのルールでCloudWatch Logsへ書き出し
  5. CloudWatch Logs Insightsでクエリを書き可視化

M5StickCで利用するライブラリ等

他にMQTT通信できるライブラリは無いものかと
Aruduino IDEのライブラリマネージャーから探してみましたが
Betaだったり、あまり人気が無かったりという事で結局人気が一番ある下記ライブラリを利用しました。

制限事項として、PublishはQoS 0のみ、Subscribe QoS 0 or 1、メッセージサイズが標準ではとても小さい(128Byte)等色々あります。

PubSubClient
https://pubsubclient.knolleary.net/

Githubページ - 制限事項が色々と記載されています
https://github.com/knolleary/pubsubclient

参考にさせて頂いた記事

ESP32でAWS IoTに繋いでThing Shadowを弄る
https://blog.maripo.org/2017/07/esp32-aws-iot/

ESP32〜AWS IoTでMQTT通信して詰んだ話【ClientID】
https://qiita.com/rockguitar67/items/4f028500d520dbf14be1

【macOS】デバイスとAWS IoTとの接続設定を行うスクリプトをかいたった:証明書の設定からThing登録まで行う
https://dev.classmethod.jp/articles/aws-iot-connect-device-script/

実行環境

MacOS上で実施しました。

手順

1. AWS IoTで モノ/証明書/ポリシーを作成し適切な関連にAttach (AWS CLIにて実施)

注記

  • 下記コマンドを流して行くと、カレントディレクトリにAWS IoTにて作成された証明書/鍵ファイルが保存されます。
  • ポリシーは全許可のテスト用のもののため、ご利用は計画的に

モノを作成

ポリシーを作成 (テスト用全許可ポリシーのため要注意)

証明書と鍵を作成

こちらの結果(ARN表記で出力される証明書)を下記コマンド(Policyと証明書を紐付け/モノと証明書を紐付け)にて利用する

Policyと証明書を紐付け

モノと証明書を紐付け

AWS IoT エンドポイントを取得

2. コード書く/転送

下記の [] 括弧部分をご自身の物に書き換える必要があります。

rootCA

AWS IoTの開発者ドキュメント内に記載のリンクから取得します。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/server-authentication.html#server-authentication-certs

clientCert/clientPrivateKey

上記CLIコマンドを実行した結果作成される3ファイルのうち2ファイルを利用します。

  • [DEVICE_NAME]-certificate.pem.crt
  • [DEVICE_NAME]-private.pem.key

コード

500msec毎にデータをAWSIoTへ送信しております

3. AWS IoTで データ受信確認

AWS IoTサービスの左メニュー、テストを選択後
トピックのサブスクリプションに、ソースコード中の pubTopic と合わせたTopic名を入力し [トピックへのサブスクライブ] を押下します。
デバイスが正常に通信できれば、500msec 毎に送信されたデータが流れるように表示されます。

4. AWS IoTのルールでCloudWatch Logsへ書き出し

IoTルールでCloudWatch Logsへの吐き出しを作成します。

Topic名が適切に指定されていればロギングされる事を確認できるはずです。

5. CloudWatch Logs Insightsでクエリを書き可視化

CloudWatch Insights を開きクエリとして下記を入力します。

上記クエリを実行すると、下記結果を得ることができます。
可視化した結果をダッシュボードに追加できるため色々と表現出来そうです。

ログ集約された結果

可視化した結果

はまった点

一通りサービス理解をしていたつもりでしたが、当初デバイスからプログラムを実行した結果下記エラーが出てハマりました...
Wifiには接続されるが、mqttClient.state() = -2 を返す状態

証明書エラーだなと、色々見直したが問題なかったのでモノ・証明書の作り直し、証明書をシリアルコンソールに表示し、一語一句違わないか等を見ましたが問題無し
ふとAWS IoTの証明書ドキュメントを読むと、"エンドポイントの種類" にて、新しい証明書の場合エンドポイントが異なるよという事でした (トホホ...)

上記CLIコマンドで、describe-endpoint する際に --endpoint-type iot:Data-ATS というオプション付きでないと新しいエンドポイントが返却されないようです。
(AWSIoTの設定画面でエンドポイントを確認すると、-ats 付きですね)

AWS IoT Core は、iot:Data と iot:Data-ATS の 2 つの異なるデータエンドポイントタイプをサポートしています。iot:Data エンドポイントは、VerVeriSign Class 3 Public Primary G5 Root CA 証明書によって署名された証明書を提供します。iot:Data-ATS エンドポイントは、Amazon Trust Services CA によって署名されたサーバー証明書を提供します。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/server-authentication.html#server-authentication-certs

Debug実施方法

Debugレベルを上げる

ツール ⇢ Core Debug Level を上げる

Debugログを確認する

ツール ⇢ シリアルモニタ で確認する (右下の通信速度を合わせないと文字化けするので注意)

まとめ

次回はPub/Subに対応させ、Shadowと戯れてみようと思います。

実施してみました
https://www.skyarch.net/blog/?p=18513

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023, 2024 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。