ESP32からAWS-IoTにつなぐ(Espressif社のSDKを利用)


はじめに

以前にAWSのページに載っていたチュートリアルに沿ってESP32からAWS-IoTに接続してみましたが、この仕組みをその後どう使いこなせば良いのか自分の知識ではわからず、途方に暮れてしまいました。
ESP32にAmazon FreeRTOSを入れてAWS-IoTにつなぐ(CentOS利用)

そこで、別の方法でAWS-IoTにつないでみることにしました。参考にしたのは、ESP32の公式SDKであるESP-IDFのPrograming Guideにある、こちらのページ。
ESP-IDF Programming Guide - Cloud Frameworks

【今回の環境】

ESP-IDFの導入

まず開発環境のPCにESP-IDFを入れます。こちらのページを参考にして、サンプルの実行まで進めました。
ESP32 を買って、 Windows 10 に開発環境(ESP-IDF)を構築し、ビルドして、書き込んで、Lチカを確認するまでの記録。

フォルダ構成はこうしてみました。

C:\IoT\
 └ ESP-IDF\
    ├ ESP-IDF-v4.0.1\
    ├ Tools\
    └ Projects\

ESP-AWS-IoTのダウンロード

上記、ESP-IDF Programming GuideのAWS IoTのリンクを叩くと、こちらのページに案内してくれます。
GitHub - esp-aws-iot

適当な場所に移動してから、そこに書かれている通りに実行して必要なものをダウンロード。

cd C:\IoT\ESP-IDF\Projects
git clone --recursive https://github.com/espressif/esp-aws-iot

すると、以下の場所に二つのサンプルがありました。サンプルの使い方は、esp-aws-iot\examples\README.mdに書かれています。

C:\IoT\
 └ ESP-IDF\
    └ Projects\
       └ esp-aws-iot\
          └ examples\
             ├ subscribe_publish\
             └ thing_shadow\

subscribe_publishはAWS-IoTへMQTTでメッセージを飛ばすだけの簡単なもの。メインのソースコードもシンプルなので自分で色々カスタマイズできそう。今回はこちらを使ってみます。

AWS-IoTで「モノ」を登録する

README.mdを見ると、まず以下を参考にAWS IoTのコンソールでデバイスの設定をしなさいとあります。
AWS IoT Core の開始方法

AWS IoTコンソールでは、以下を行います。

  • モノの作成(鍵対と証明書の生成)
  • ポリシーの作成
  • 証明書へポリシーをアタッチ
  • カスタムエンドポイントの確認

モノの作成

AWS IoTのコンソールで、「管理」-「モノ」を開いて、

「モノの登録」へ進みます。

「単一のモノを作成する」へ。

モノに適当に名前を付けて次へ。

最も簡単な「1-Click 証明書作成」を選択。

モノに埋め込むための鍵対と証明書が生成されました。AWS-IoTへ接続した際にモノを識別するために使われます。生成された3つのデータをダウンロードし、「有効化」をクリック。続いて「ポリシーをアタッチ」へ。

ところが、最初は勝手にポリシーができていたような気がするのですが、自分で一度消してしまったので改めて作ります。

ポリシーの作成

「安全性」-「ポリシー」の画面から、「ポリシーの作成」へ進みます。

このサンプルプログラムでは以下を行っているようでしたので、

  • aws_iot_mqtt_connect()
  • aws_iot_mqtt_subscribe()
  • aws_iot_mqtt_publish()

ポリシーには以下を設定しておきます。

項目 項目 項目
アクション iot:Connect リソースARN * 効果 許可
アクション iot:Subscribe リソースARN * 効果 許可
アクション iot:Publish リソースARN * 効果 許可

このポリシーの設定と証明書へのアタッチを適切に行っておかないと、後で実行してAWS IoTへ接続した際にERROR -12 (NETWORK_SSL_READ_ERROR) が発生します(後述のシリアルポートに表示されます)。自分は何度かはまりました。エラーコードの意味は以下に載ってます。
aws_iot_error.h File Reference

ポリシーを証明書にアタッチ

先ほど作成した証明書に、いま作ったポリシーをアタッチします。

「安全性」-「証明書」の画面で、証明書を選択し、「アクション」の中から「ポリシーをアタッチ」を選択。

カスタムエンドポイントの確認

最後に、「設定」のページを開いて、カスタムエンドポイント(モノの通信先)をメモっておきます。後で使います。

これでAWS IoT側の設定はいったん終了。

サンプルのビルド&書込み

モノの秘密鍵と証明書を設置

ESP-IDFのコンソールを開き、まず今回使うsubscribe_publishを適当な場所へコピー。

cd C:\IoT\ESP-IDF\Projects\esp-aws-iot
xcopy /i /e examples\subscribe_publish projects\subscribe_publish

先ほどAWS-IoTコンソールからダウンロードしたもののうち、秘密鍵と証明書を以下の名前で保存しておきます。

projects\subscribe_publish\main\certs\private.pem.key
projects\subscribe_publish\main\certs\certificate.pem.crt

ビルド前の初期設定

コピーしたsubscribe_publishの場所へ移動して、初期設定を行います。

cd C:\IoT\ESP-IDF\Projects\esp-aws-iot\projects\subscribe_publish
idf.py menuconfig

設定が必要な項目は以下の通り。保存して終了します。

場所 設定値
Example Configuration -> WiFi SSID 利用するWiFiの情報を設定
Example Configuration -> WiFi Password 利用するWiFiの情報を設定
Example Configuration -> AWS IoT Client ID モノを識別する何らかの値を入れれば良い
Amazon Web Services IoT Platform -> AWS IoT Endpoint Hostname AWS IoTのカスタムエンドポイント

ビルド&書込み

ビルドして書込みます。自分の環境ではCOM3でした。

idf.py build
idf.py -p COM3 flash

動作確認

シリアルポートで確認

TeraTermでシリアルポートに接続し、通信速度を115,200に、データを8bitから7bitに変更。
うまくいくと、WiFi接続した後にこんなメッセージが出てきます。

AWS IoTコンソールで確認

AWS IoTコンソールの「テスト」を開きます。
このサンプルはtest_topic/esp32というトピックでメッセージを飛ばしているので、「トピックのサブスクリプション」欄にtest_topic/#と入れて「サブスクライブ」すると、以下のようにメッセージを確認できます。

ひとまずAWS IoTにメッセージを飛ばせたので、色々遊んでみようと思います。