工作と競馬

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

カテゴリ:4.ソフトウェア > 4.8 AWS

概要

AWSのGreengrassを使い、遠隔でGPIOを操作しLEDの点滅ができた。


背景と目的

先日のGreengrass使い始めに続き、ドキュメントに沿っていろいろ試したところ、遠隔でエッジのLambda関数をトリガする方法もわかった。また、エッジのローカルリソース(ドライブや、シリアルポート、GPIOなど)にもアクセスできるとの記述がある。そこで、Raspberry PiのGPIOを遠隔で操作してみることにした。


詳細

0.参考資料

AWSドキュメント内の以下URLを参考にした。GPIOにアクセスできるとの旨が書いてある。

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/access-local-resources.html


1.Lambda関数

Lambda関数は、基本的にRaspberry Pi上でGPIOをいじるときと同じコード。

# coding:utf-8
import sys
import greengrasssdk
import RPi.GPIO as GPIO
import time
import platform
import os
import logging

# Create a Greengrass Core SDK client.
client = greengrasssdk.client('iot-data')

# GPIOの設定
GPIO_NUM = 4
GPIO.cleanup()
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_NUM, GPIO.OUT)

def function_handler(event, context):
    try:
        client.publish(topic='LRA/test', payload="Sent from AWS Greengrass Core.")
        GPIO.output(GPIO_NUM, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(GPIO_NUM, GPIO.LOW)
        time.sleep(1)
    except Exception as e:
        logging.error("Experiencing error :{}".format(e))
        client.publish(topic='LRA/test', payload="Experiencing error")
    return


2.リソースの設定

Greengrass>グループ>リソースで、/dev/gpionumというリソースに対して、Lambda関数がアクセスできるように設定した。

リソース


3.サブスクリプションの設定

以下2つを設定した。IoT Cloud側からLRA/test/triggerトピックに、送信することで、Lambdaが呼び出せる。

  • "LRA/test/trigger"トピックをIoT Cloud ⇒ Lambda関数で設定
  • "LRA/test"トピックをLambda関数 ⇒ IoTCloudで設定


4.テスト

以上の設定で、Greengrass CoreにLambdaをデプロイし、IoT Cloud側からLRA/test/triggerトピックにメッセージを送信した。ところ、GPIO4に接続したLEDが1秒間光り、"LRA/test"トピックに、Lambdaからのメッセージが来た。正しく、Lambdaが呼び出せている。


まとめ

AWSのGreengrassを使い、遠隔でGPIOを操作しLEDの点滅ができた。

概要

AWSのGreengrassを使ってエッジにLambdaをデプロイし、実行させてみた。


背景と目的

AWSのGreengrassを使ってみようと思っていながらしばらく時間がなくトライしていなかった。少し時間ができたので使ってみる。


詳細

0.参考

https://aws.amazon.com/jp/greengrass/features/

https://aws.amazon.com/jp/greengrass/faqs/

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/what-is-gg.html

基本的なやり方は、上記のURLを参考に進めた。


1.Raspberry Piの設定

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module1.html

上記URLにある手順に従って実施したのだが、私の環境の場合、Memory cgroupという項目でDisabledが出た。そこで、

https://www.raspberrypi.org/forums/viewtopic.php?t=203128

に従って、/boot/cmdline.txtに以下を追記して再起動。

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1


2.Greengrass Core SDKのインストール

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module2.html

上記URLに従って、作業を実施。

ただし、以下を追加で実施した。なぜかというと、はじめgreengrassdの起動がうまくいかず、トラブルシューティングを見ながら、権限の問題がありそうだったから。(ただし、これは本当に要るのか?はわからない。)

sudo chmod 755 /greengrass -R


3.Lambdaのデプロイ

https://docs.aws.amazon.com/ja_jp/greengrass/latest/developerguide/module3-I.html

次に、Lambda関数をデバイスにデプロイした。作業手順は上記URLに従っている。

コンソールのGreengrass groupで、正常に完了しましたという表示になればOK.


4.テスト

AWS IoTのコンソールで、テスト。

hello/worldトピックをサブスクライブした結果、定期的にエッジで実行されたLambda関数から、MQTTメッセージがパブリッシュされている。


b8b280c8

まとめ

AWSのGreengrassを使ってエッジにLambdaをデプロイし、実行させた。

  • FulfillmentのLambda呼び出しについて

私は、今us-east-1リージョンのLexを使っているが、日本リージョンのLamdbaが選択肢に表示されない。boto3のLexModelBuildingService.put_intentの引数fulfillmentActivityで日本リージョンのLambda関数を指定すると、エラーになる。

選択できるLambda関数は、どうやら同じリージョンだけのようだ。

(2018年6月28日現在)

概要

AWSのStep Functionsというサービスを使って、Lambda関数の処理完了⇒他のLambda関数を実行させてみた。


背景と目的

AWSで、あるLambda関数の処理完了に応じて、他のLambda関数を実行させる必要が出た。方法を調べて実装してみる。


詳細

0.やりたいこと

とりあえず、以下の簡単な2ステップができればよい。

  • Lambda関数1を実行
  • Lambda関数1から渡したパラメータを受け取り、Lambda関数2-1、2-2を並列で実行する

いろいろ調べたけど、Step Functionsがよさそうなので使用することにした。

参考にするのは、以下。


1.IAMロールの作成

参考1にあるとおり、IAMでRole TypeがLambdaのロールを作成。ポリシーは、何もアタッチしないが、後述する2のLambdaFunctionの内容によっては、必要であればアタッチしておく。


2.LambdaFunctionの作成

必要な3つの関数を作成。それぞれ、

  • test_step_functions_process1
  • test_step_functions_process2-1
  • test_step_functions_process2-2

とした。関数のロールには、1で作成したロールを割り当てる。コードは、お試しなので、test_step_functions_process1に渡したパラメータが、順にtest_step_functions_process2-1、test_step_functions_process2-2にわたるのが確認できるような感じにしてみた。

  • test_step_functions_process1
def lambda_handler(event, context):
    return {"process": "process1", "param1": event["param1"], "param2": event["param2"]}
  • test_step_functions_process2-1
def lambda_handler(event, context):
    return { "process": "process2-1", "output": event["param1"] }
  • test_step_functions_process2-2
def lambda_handler(event, context):
    return { "process": "process2-2", "output": event["param2"] }

3.StepFunctionsの編集

{
  "StartAt": "process1",
  "States": {
    "process1": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:{region}:{account-id}:function:test_step_functions_process1",
      "Next": "process2"
    },
    "process2": {
      "Type": "Parallel",
      "End": true,
      "Branches": [
        {
          "StartAt": "process2-1",
          "States": {
            "process2-1": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:{region}:{account-id}:function:test_step_functions_process2-1",
              "End": true
            }
          }
        },
        {
          "StartAt": "process2-2",
          "States": {
            "process2-2": {
              "Type": "Task",
              "Resource": "arn:aws:lambda:{region}:{account-id}:function:test_step_functions_process2-2",
              "End": true
            }
          }
        }
      ]
    }
  }
}

4.動作確認

最後にコンソールで実行して確認。実行時の入力は以下。

{
    "param1": "1",
   "param2": "2"
}

結果は、以下の通り、正しく実行された。

20180327130033

20180327130038


まとめ

AWSのStep Functionsの使い方が分かった。

概要

LambdaからAWS KMSの暗号化・復号化を試し、うまくいった。


背景と目的

DynamoDBに、暗号化した情報を保存する必要がでた。Lambdaで、暗号化/復号化処理をやって保存できるようにしてみる。


詳細

0.方法

の2つがあるが、1つ目は、SDK一式をまとめてLambdaで実行しようとしたらインポートエラー。ローカルで試すことはできるんだけど、SDKに含まれるcryptographyというモジュールが、環境ごとにコンパイルされたものが必要らしく、うまくいかなかった。(私の場合、Windowsでテスト、LambdaはLinux?)

なので、boto3でやることにした。(冷静に考えると2つ目でやるのが当たり前だが、Webで調べたら1つ目が先に出てきてしまったせいで、引っ張られてしまった。。。)


1.コーディング

こちらこちらを参考とした。

1.1 暗号化
import boto3
import base64

# KEYID
KEYID = "arn:aws:kms:{region}:{account-id}:key/{keyid}"

kms = boto3.client("kms")

# 暗号化したいテキスト
my_plaintext = u'こんにちは'
    
# 暗号化
resp = kms.encrypt(
    KeyId = KEYID,
    Plaintext = my_plaintext
)
my_ciphertext = resp["CiphertextBlob"]

# base64エンコードする
txt = base64.b64encode(my_ciphertext)

base64エンコードしているのは、DynamoDBに保存する際に、文字列型として保存するため。

1.2 復号化
# まず、base64でコードする(DynamoDB保存用にエンコードされている前提)
my_ciphertext = base64.b64decode(item["test"])

# 復号化
resp = kms.decrypt(
    CiphertextBlob = my_ciphertext
)
decrypted_plaintext = resp["Plaintext"]

# 復号化されたものは、unicode文字列なので、適宜変換
decrypted_plaintext = decrypted_plaintext.decode("utf-8")

2.テスト

上記の暗号化、復号化を

print "decrypted_plaintext = " + decrypted_plaintext

として実行したところ、正しく動作した。

decrypted_plaintext = こんにちは

DynamoDBには、暗号化&base64エンコードされた文字列が保存された。


まとめ

LambdaからAWS KMSの暗号化・復号化を試し、うまくいった。

概要

クラウド側の実装を行い、Google Homeにしゃべりかけて照明スイッチを操作するシステムが完成した。


背景と目的

前回に引き続き、クラウド側の実装を行い、システムとして仕上げる。


詳細

1.構想

クラウドとしては、

  • IFTTTでGoogleアシスタントチャンネルをトリガ、Webhooksチャンネルをアクションとする
  • Webhooksチャンネルでは、AWSのAPI Gatewayで作ったエンドポイントをたたく
  • API GatewayからLambda関数を呼び出す
  • Lambdaで、リクエスト内容に応じて、AWS IoTにトピックをパブリッシュする

という構成にする。こうすれば、Google Homeに話しかけることでAWS IoTへトピックがパブリッシュされ、サブスクライブ中のESP32にデータが届き、サーボモータが動くはずだ。


2.IFTTT

以前作成したのと同様に、アプレットを作成する。詳細は省くが、だいたい以下のようなイメージ。OK, Google。電気つけて。と言うと、AWS側のエンドポイントをたたければよい。

20180208224053

20180208224314


3.AWS

3.1 API Gateway

詳細は省くが、POSTでJSONを受け取るエンドポイントを用意。

3.2 Lambda

詳細は省略するが、API Gatewayが受け取ったイベント引数のJSONを処理して、AWS IoTサーバにトピックをパブリッシュするというイメージ。

# coding: utf-8

import boto3

TOPIC = 'ESP32がサブスクライブしているトピック名'

client = boto3.client('iot-data')

def lambda_handler(event, context):

    resp = client.publish(
        topic=TOPIC,
        qos=0,
        payload=event["operation"]
    )
    
    return 'Hello from Lambda'
3.3 AWS IoT

デバイスを1つ用意し、ESP32を接続する。(第2回での実装時に実施済み)

ここまでで、デバイスハードウェア、デバイスソフトウェア、クラウドとすべてのシステム要素が完成。


4.動作確認

以下の動画(若干音量が小さいので上げてください)のように、Google Homeにしゃべりかけてみたところ、電気が消えた!というわけで成功!シャキッ!という結構喧しい音がするのは愛嬌。


まとめ

市販品には絶対にあり得ないシステム構成だが、Google Homeで制御できる家電が増えてうれしい。

概要

ESP-WROOM-32のソフトウェアを作成し、インターネット経由でサーボモータが動かせるようにした。


背景と目的

前回のハードウェア製作に続き、ESP32のソフトウェアを作成する。


詳細

1.仕様

  • ESP-WROOM-32のPWMにて、サーボモータSG92Rをコントロール
  • ESP-WROOM-32をAWS IoTと接続し、あるトピックをサブスクライブ
  • 受信したペイロードに応じて、サーボモータを動かす


2.ソフトウェア

2.1 esp-idfをアップデート

本筋とは関係ないが、久しぶりESP-IDFを使うので、こちらに従い最新版にアップデート。

cd esp\esp-idf
git pull
git submodule update --init --recursive
2.2 プロジェクトを作成

今回は、AWS IoTと、サーボモータを使うので、esp-idfのサンプルであるesp-idf\examples\protocols\aws_iot\subscribe_publishを基本として、arduino-esp32をコンポーネントとして組み込み、サーボライブラリを使ってサーボモータを駆動する。

cd esp\iot_servo_switch
mkdir components
git clone https:// github.com/espressif/arduino-esp32.git arduino
cd arduino
git submodule update --init --recursive
cd ../main/certs

certsフォルダには、AWS IoTデバイスのaws-root-ca.pem、certificate.pem.crt、private.pem.keyの3つを格納。(ただし、subscribe_publishサンプルをそのまま使う場合のファイル配置である)


2.3 ソースコードを編集

arduino-esp32を使えるようにするため、こちらに従ってcppソース化。サーボモータ駆動用のPWM制御モジュールを使うので、esp32-hal-ledc.hをインクルード。ledcSetup、ledcAttachPinで、PWM制御用GPIOポートを初期化。

// main.cpp

// arduino-esp32関連
#include "Arduino.h"
#include "WiFi.h"

// サーボモータ関連
#include "esp32-hal-ledc.h"

// -------------------------
// 省略
// -------------------------

extern "C" void app_main()
{
    // Arduino初期化
    initArduino();
    
    // Wi-Fiの初期化
    initialise_wifi();

    // サーボ用PWMの設定
    ledcSetup(1, 50, 16); // channel 1, 50 Hz, 16-bit depth
    ledcAttachPin(18, 1); // GPIO18に割り当て
    ledcWrite(1, deg2pw(90, 16));

#ifdef CONFIG_MBEDTLS_DEBUG
    const size_t stack_size = 36*1024;
#else
    const size_t stack_size = 36*1024;
#endif
    xTaskCreatePinnedToCore(&aws_iot_task, "aws_iot_task", stack_size, NULL, 5, NULL, 1);
}

なお、deg2pwは、角度[deg]を与えてパルス幅に変換する作業用関数。

// 角度をパルス幅に変換
int deg2pw(int deg, int bit)
{
    double ms = ((double) deg - 90.0) * 0.95 / 90.0 + 1.45;
    return (int) (ms / 20.0 * pow(2, bit));
}

そして、サブスクライブ時のコールバック関数iot_subscribe_callback_handlerを編集。ペイロードを解析し、内容に応じてPWM信号の幅を変えて、実装の詳細は割愛するが、イメージとしては以下のように、ペイロードがONなら正方向、OFFなら逆方向にサーボモータ軸を一定角度回して戻す。この動作により、軸に付けたホーンの先が、ボタンをたたくような動作になる。

void iot_subscribe_callback_handler(AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen,
                                    IoT_Publish_Message_Params *params, void *pData) {

    // ペイロードの解析
    const char op1[10] = "ON";
    const char op0[10] = "OFF";
    char s[10] = {'\0'};
    snprintf(s, (int) (params->payloadLen + 1), "%s", (const char *)params->payload);

    // 動かす
    if (strcmp(s, op1) == 0) {
        // ONなら点灯
        ledcWrite(1, deg2pw(140, 16)); // 正方向に回す
    } else if (strcmp(s, op0) == 0) {
        // OFFなら消灯
        ledcWrite(1, deg2pw(40, 16)); // 逆方向に回す
    } else {
        // それ以外は何もしない
    }
    // 一定期間待つ
    vTaskDelay(200 / portTICK_RATE_MS);
    // 戻す
    ledcWrite(1, deg2pw(90, 16));

}
2.4 make menuconfig

menuconfigでいくつか設定を行う。

  • AWS IoTのエンドポイント設定

以前の記事のとおり、AWS IoTのエンドポイントの設定をする

  • arduino-esp32の設定

"Autostart Arduino setup and loop on boot"を選択なしとする


2.5 書き込み

以下で書き込み。

make flash monitor


3.動作確認

以下が、サーボモータの先のホーンの動き。ボタンをたたけそうな感じがする。


まとめ

ESP32のソフトウェアが作成できた。次回は、クラウド側の設定を行う。

概要

Google Home、ESP-WROOM-32、サーボモータを使って、部屋の照明のスイッチを遠隔で無理やり動かすシステムを作る。第1回として、仕組みのハードウェア製作を行った。


背景と目的

以前、IRKitを使って、テレビやエアコンの電源をインターネット経由で操作できるようにしたが、照明も操作できるようにしたくなったので、やってみる。今回は、第1回としてハードウェアの製作を行う。


詳細

0.対象の照明

私の家の照明は、紐を引っ張っるか、壁にスイッチで点灯/消灯の操作をするタイプだ。なので、IRKitが使えない。なので、かなり強引だが、サーボモータで無理やりスイッチをたたくことにする。


1.回路

ネットにつながって、サーボモータが制御できれば良いので、ESP-WROOM-32と、小型サーボモータSG92Rを組み合わせることにした。設計した回路図は、以下。ESP32のGPIOは3.3Vなので、レベル変換をしてSG92Rの制御端子を駆動する。

回路図


2.機構

以下の写真の通り、ユニバーサル基板にサーボモータとESP32を固定して、基板の4隅に金具を折って作った爪を付けた。サーボモータの固定には、ロックタイを使用。これでも十分な強度だ。

DSC_0236

この爪をスイッチパネルと壁の隙間に差し込んで、固定できた。

DSC_0238


まとめ

ハードウェアが完成。次回は、ESP32側のソフトウェアを作成する。

概要

AWS CodeCommitでリポジトリの作成、clone、pull、pushなどの基本的な操作方法を覚えた。


背景と目的

今まで、AWS上で動くとあるアプリケーションを一人で作ってきたのだが、複数人で開発することになった。コードの管理を確実に行うために、AWS CodeCommitを使ってみることにした。今回は、とりあえずリポジトリの作成、clone、pull、pushなどの基本操作方法を習得する。


詳細

0.条件

  • Windows10
  • Gitインストール済み
  • AWS CLIインストール済み(ユーザー認証情報も設定済み)


1.リポジトリの作成

まず、リポジトリを作成。ここでは、CodeCommitTestという名前のリポジトリを作成してみる。

20171024000742

作成されると、以下のような画面になる。

20171024000947

また、簡単な手順の説明画面が表示される。ここからドキュメントを追っていけば一応最後までたどり着ける。

20171024000915


2.IAMポリシーのアタッチ

IAMにて、グループでもユーザーでもよいが、以下のとおり3つのポリシーをアタッチ。

IAM


3.HTTPS Git 認証情報の生成とダウンロード

IAM>ユーザー>認証情報タブの最下部に、"AWS CodeCommit の HTTPS Git 認証情報"という項目がある。生成ボタンを押すと、ユーザー名とパスワードが表示され、またそれが書かれたファイルがダウンロードできる。

20171024003334

20171024003400


4.Gitへの認証情報の設定

参考に従い、以下を実行。

git config --global credential.helper "!aws codecommit credential-helper $@"
git config --global credential.UseHttpPath true


5.ローカルへクローニングしてみる

基本的に、参考の方法に従う。あと、一般的なgitの使い方

cd "ローカルのクローニングしたいディレクトリ"
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/CodeCommitTest CodeCommitTest

ユーザー名とパスワードを入力するウインドウが表示されるので、3で取得したユーザー名とパスワードを入力すればよい。

ちなみに、もしごちゃごちゃやって、操作ミスしたりしておかしなユーザー名/パスワードが保存されてしまったら、Windowsの場合、

コントロール パネル\ユーザー アカウント\資格情報マネージャー

から、該当するパスワード情報を削除すればよい。


6.ローカルからプッシュしてみる

bird.txtというファイルがローカルリポジトリに追加されたとして、以下を実行してみる。

git status
git add bird.txt
git commit -m "bird.txtを追加するよ"
git push origin master

コンソールを見ると、ちゃんと変更がなされている。

20171024122528


まとめ

AWS CodeCommitを使ってみた。とりあえず、基本的な使い方はOK.そのうち、トリガを設定して、ファイルが更新されたら通知したり、何かアクションできるようにすれば、より実用的だ。

概要

ESP-WROOM-32で、AWS IoTにデータをパブリッシュしてみた。


背景と目的

ESP-IDFのサンプルには、AWS IoTとの通信プログラムがある。ESP32でセンサ等の測定値を素早くクラウド上に送信するのにちょうどよさそうだ。そこで、サンプルを使ってAWS IoTにデータ送信してみる。


詳細

1.やること

今回は、ESP-IDFのサンプルexamples/protocols/aws-iot/subscribe_publishをそのまま動かす。1秒ごとにパブリッシュするという動作をする。README.mdに一通りやり方が書いてあるのでそれを参考に進める。


2.AWS IoTでThingを作成

AWSのコンソールで、動作確認用にThingを作成。Thing名はESP32Testとした。また、Security>Create certificate ボタンにて、certificateを作成し、xxx.private.pem.keyとxxx.certificate.pem.crtをダウンロードした。また、aws-root-caファイルもダウンロードしてサンプルにあるaws-root-ca.pemと置き換えた。それと、以下の2つを忘れないようにする必要がある。

  • certificateをActivateする。
  • certificateにpolicyをアタッチする。ポリシーは、以下で十分。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Connect",
        "iot:Receive"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}

これで、Thingの準備はOK。


3.Private KeyとCertificateの組み込み

組み込み方法は、ここによれば2通りがあるが、今回は、"Option 1: Embedded Key & Cert into App Binary"という方法に従う。

このサンプルのmainというフォルダの下にさらにcertsというフォルダがあるので、そこで2.でダウンロードした2つのファイルをそれぞれprivate.pem.key、certificate.pem.crtという名前に変更して配置する。

これで、必要なファイルの組み込みができた。


4.AWS IoTとの通信に必要な設定の記述

subscribe_publish_sample.cを開き、いくつか編集していく。

4.1 WiFiの設定

本筋と関係はないが、忘れないように。ESP32をWiFiに接続しないと始まらないので、56,57行目のSSIDとパスワード設定を忘れない。

#define EXAMPLE_WIFI_SSID "SSID名"
#define EXAMPLE_WIFI_PASS "パスワード"
4.2 トピックの設定

248行目のTOPICという定数を編集すればよい。ここでは、"test_topic/esp32"をそのまま使う。

4.3 送信したいデータを設定

そして、送信したいデータは、cPayloadという文字配列が用意されており258行目のsprintf文で文字を書き込んでいるので適宜編集する。ここでは、"Hello from SDK : {経過秒数}"という表記をそのまま使う。

sprintf(cPayload, "%s", "送信したい文字列など");

ここまでで、ソースコードの編集は完了。


5.ビルド設定とビルド

make menuconfigにて、AWS IoTに関わる2つの設定を行う。

  • Component config > Amazon Web Services IoT Platform > AWS IoT Endpoint Hostnameを選択し、2.で作成したThingのコンソール > Interactに表示されているHTTPS Endpoint名(xyz.iot.{リージョン名}.amazonaws.com)を書き込む。(なお、この設定はesp-idf/components/aws-iot/include/aws-iot-config.hに直接書き込んでもできるらしいが、ライブラリを直接編集するのも微妙なので、ここではやらない)
  • Example Configuration > AWS IoT Client IDに使用するThing名(ここではESP32Test)を指定する。

そして、make flashでビルド&書き込みをする。

20170516212557

図5.1 エンドポイントを設定


6.動作確認

シリアルコンソールのログは、以下の通り。1秒ごとにパブリッシュされている。

20170516220930

図6.1 パブリッシュしている様子

また、AWS IoTコンソールのTestメニューにて、"test_topic/esp32"トピックをサブスクライブしてみると、データが到着している。

20170516220923

図6.2 パブリッシュされたのが到着した様子

というわけで、正しく動作させることができた。


まとめ

ESP-WROOM-32で、AWS IoTにデータをパブリッシュできた。

このページのトップヘ