環境モニタを作ろう with ESP32 DEV Module 〜 No5. ESP32からAWS-IoTへデータをPublish #aws-iot

ここまででできたこと

  1. 環境モニタを作ろう with ESP32 DEV Module 〜 No1. まずは動かして見よう
  2. 環境モニタを作ろう with ESP32 DEV Module 〜 No2. 温度湿度センサーをつけよう
  3. 環境モニタを作ろう with ESP32 DEV Module 〜 No3. wifiに接続して、https通信を試してみよう
  4. 環境モニタを作ろう with ESP32 DEV Module 〜 No4. 温度と湿度データをクラウドに入れたい!AWS-IoTを使ってみよう #aws-iot

前回は、MacからMQTTでAWS-IoTにPublishしたのですが、今回はESP32からPublishしてみましょう。

AWS-IoT設定(CLI編)

前回のおさらいも兼ねて、今回はAWS-IoTを使う準備を、AWS-CLIでやってみます。

モノの登録

aws iot create-thing --thing-name "ueda-office"

{
 "thingName": "ueda-office",
 "thingArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxx:thing/ueda-office"
}
aws iot list-things
{
 "things": [
 {
 "thingName": "ueda-office",
 "attributes": {},
 "version": 1
 }
 ]
}

証明書の作成

aws iot create-keys-and-certificate --set-as-active --public-key-outfile public.pem --private-key-outfile private.pem --certificate-pem-outfile cert.pem

{
 "certificateArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxxxx:cert/xxxxxxx",
 "certificateId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
 "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgIUXUvBEB1Gr3oFFp+6RD\n-----END CERTIFICATE-----\n",
 "keyPair": {
 "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz\n-----END PUBLIC KEY-----\n",
 "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAzgqh3cIPaIDhClTDcCRm\n-----END RSA PRIVATE KEY-----\n"
 }
}

プライベートキー、パブリックキー、クライアント証明書の3ファイルが出力されます。
ルート証明書は前回取得したものを使います。

ポリシーの作成

vi policy.json
{
    "Version": "2012-10-17", 
    "Statement": [{
        "Effect": "Allow",
        "Action":["iot:*"],
        "Resource": ["*"]
    }]
}
aws iot create-policy --policy-name awsiot-ueda-policy --policy-document file://policy.json
{
    "policyName": "awsiot-ueda-policy",
    "policyArn": "arn:aws:iot:ap-northeast-1:xxxxxxxxxxx:policy/awsiot-ueda-policy",
    "policyDocument": "{\n    \"Version\": \"2012-10-17\", \n    \"Statement\": [{\n        \"Effect\": \"Allow\",\n        \"Action\":[\"iot:*\"],\n        \"Resource\": [\"*\"]\n    }]\n}\n",
    "policyVersionId": "1"
}

証明書にモノとポリシーを割り当てる

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

証明書を作成した時に出力された「certificateArn」と、作成したポリシーの名前を使います

aws iot attach-principal-policy --principal "arn:aws:iot:ap-northeast-1:xxxxxx:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" --policy-name "awsiot-ueda-policy"

証明書にモノをアタッチ

aws iot attach-thing-principal --thing-name "ueda-office" --principal "arn:aws:iot:ap-northeast-1:xxxxxxxx:cert/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

AWS IoTエンドポイントの確認

aws iot describe-endpoint
{
"endpointAddress": "xxxxxxxxxxx.iot.ap-northeast-1.amazonaws.com"
}

準備完了です。

ESP32からPublish

ということで、ちょっと調べてみると、すでに試されて記事にされている方がいたので、そのまま写経させていただきました。

ESP32でAWS IoTに繋いでThing Shadowを弄る – コーヒーサーバは香炉である 

なので、詳細はそちらを見ていただいた方が早いかもですが、メモとして残しておきます。

ESP32から使うライブラリ

Wifi接続やHTTPS接続については第3回のところで試しているので、おさらいしておいてください。

ESP32から使うMQTTクライアントとして、PubSubClientを利用します。

PubSubClientはArduinoIDEのLibraryManagerでインストールして、デフォルトのメッセージの長さの定義を変更しておきます。(デフォルトは128バイト)

#define MQTT_MAX_PACKET_SIZE 128
 ↓
#define MQTT_MAX_PACKET_SIZE 1024

実装

実装コードについては、以下のサイトで詳しく解説付きなので、こちらを読んでいたければです。

ESP32でAWS IoTに繋いでThing Shadowを弄る – コーヒーサーバは香炉である 

コードの中の以下の箇所を書き換えれば動きます。

  • WiFi接続情報
  • 証明書と秘密鍵
  • デバイス名
  • AWS IoTエンドポイント

シリアルモニタでも確認できますが、AWSのコンソールのシャドウステータスも見てみると、ステータスの値が更新されていくので、確認することができます。

さて、これで、値をPublishできたので、次回はこれをAWSの他のリソースに格納するようにしてみましょう!