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
【今回の環境】
- 開発環境:Windows 10
- ボード:ESP32-DevKitC-32D
- ESP-IDF v4.0.1
- Toolchain v8.2.0
- ESP-AWS-IoT SDK
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コンソールでは、以下を行います。
- モノの作成(鍵対と証明書の生成)
- ポリシーの作成
- 証明書へポリシーをアタッチ
- カスタムエンドポイントの確認
モノの作成
「モノの登録」へ進みます。
「単一のモノを作成する」へ。
モノに適当に名前を付けて次へ。
最も簡単な「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にメッセージを飛ばせたので、色々遊んでみようと思います。
Author And Source
この問題について(ESP32からAWS-IoTにつなぐ(Espressif社のSDKを利用)), 我々は、より多くの情報をここで見つけました https://qiita.com/hisashij/items/f0b5d0d53ed70aa59b12著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .