はじめに
これからAWSIoT初めてみようという方向けに自分の振り返り(3年振り…)も含めて残します。
今回はこんな感じで「message」にpublishするだけです。

環境
・M5Stack-Core2
※今回のサンプルは別にM5StackでなくてもESP32であれば動くのですが、これから色々iotっぽいことするのには液晶やタッチスイッチなどがついたこちらが楽です。電子工作ちょっと。。という方におすすめです。
・AWS-IoT(本記事は2023/1/7に書いているのでもしかしたらUIが変わっているかもしれません)
・Arduino IDE 2.0.3
前提
AWSのアカウントは事前に作成済みであること
AWS IoT側の設定
コンソールからIot-Coreを選んでください

ポリシーの作成
まずはモノに割り当てるポリシーを作成します。

今回は単純に接続するだけなので全てを許可するポリシーを作成します。

モノの作成
メニューのモノからモノの作成を選択します

1つのモノを作成を選択し次へ

モノの名前をセットし、クラシックシャドウを選択

シャドウの中身を以下のように変更(今回の検証用)して次へ

新しい証明書を自動生成を選択し、次へ

先ほど作ったポリシーを選択してモノの作成へ

デバイス証明書とプライベートキーファイルをダウンロードして詳細はこちらへ

遷移先で以下を右クリックでリンク先を保存でRootCA証明書をダウンロード
※理由は不明ですがrootCAがlegacy以外だとエラーになったのでこちらを選択しています。

M5Stackに書き込むコード
コード全文
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
const char* ssid = "SSID";//お使いのSSIDを入れてください
const char* password = "pas"; //お使いのパスワードを入れてください。
//AWS Iotのエンドポイント
const char* server = "AWS Iotから調べてください。";
//MQTTなので8883
const int port = 8883;
//publishTopic
char *pubTopic = "$aws/things/作成したモノの名前/shadow/update";
//SubscribeTopic
char *subTopic = "$aws/things/作成したモノの名前/shadow/update/delta";
//ルートCA証明書(レガシーVerSign)
const char* test_root_ca = \
"-----BEGIN CERTIFICATE-----\n" \
//レガシー証明書の中身を入れてください
"-----END CERTIFICATE-----\n";
// デバイス証明書 certificate.pem.crt
const char* test_client_key = \
"-----BEGIN CERTIFICATE-----\n" \
// デバイス証明書の中身を入れてください
"-----END CERTIFICATE-----;\n";
//プライベートキーファイル private.pem.key
const char* test_client_cert = \
"-----BEGIN RSA PRIVATE KEY-----\n" \
//プライベートキーファイルを入れてください。
"-----END RSA PRIVATE KEY-----\n" ;
//WiFiClient
WiFiClientSecure client;
//PubSubClient
PubSubClient mqttClient(client);
//AWSIotへの接続
void connectAWSIoT() {
//接続できるまで継続
while (!mqttClient.connected()) {
//接続するモノの名称を指定
if (mqttClient.connect("作成したモノの名前を入れてください")) {
Serial.println("AWS 作成したモノの名前 Connected.");
//AWS Iotは1 or 0 しか対応していない
int qos = 0;
//Subscribeトピックとqos設定
mqttClient.subscribe(subTopic, qos);
Serial.println("Subscribed.");
} else {
///失敗したらリトライ
Serial.print("Failed. Error state=");
Serial.print(mqttClient.state());
// 5秒後にリトライ
delay(5000);
}
}
}
void setup() {
//初期設定
Serial.begin(115200);
delay(100);
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
//WiFiに接続
WiFi.begin(ssid, password);
// WiFiに接続できるまでリトライ
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
// wait 1 second for re-trying
delay(1000);
}
Serial.print("Connected to ");
Serial.println(ssid);
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
//ローカルIPを一応出す
Serial.println(WiFi.localIP());
//MQTTのクライアントに証明書を設定
client.setCACert(test_root_ca);
client.setCertificate(test_client_key);
client.setPrivateKey(test_client_cert);
//AWSIotにMQTTで接続する設定
mqttClient.setServer(server, port);
//SubscribeでMQTTメッセージを受信した時のコールバック設定
mqttClient.setCallback(mqttCallback);
//AWSIoTに接続
connectAWSIoT();
}
//以下は追加したコード
long messageSentAt = 0;
int Value = 0;
int dummyValue = 0;
char pubMessage[128];
void mqttCallback (char* topic, byte* payload, unsigned int length) {
//受信データはとりあえずprintしておく
Serial.print("Received. topic=");
Serial.println(topic);
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.print("\n");
}
void mqttLoop() {
if (!mqttClient.connected()) {
connectAWSIoT();
}
mqttClient.loop();
//5秒毎にmessageにPublish
long now = millis();
if (now - messageSentAt > 5000) {
messageSentAt = now;
sprintf(pubMessage, "{\"state\":{\"reported\":{\"message\": \"%d\"}}}", dummyValue++);
Serial.print("Publishing message to topic ");
Serial.println(pubTopic);
Serial.println(pubMessage);
mqttClient.publish(pubTopic, pubMessage);
Serial.println("Published.");
}
}
void loop() {
// do nothing
mqttLoop();
}
設定する箇所1:SSIDとパスワード
使うWifi環境に応じて入力してください。
const char* ssid = "SSID";//お使いのSSIDを入れてください
const char* password = "pas"; //お使いのパスワードを入れてください。
設定する箇所2:AWS Iotのエンドポイント
AWS-Iotのコンソールの設定からデバイスデータエンドポイントを調べて以下に入れてください。

//AWS Iotのエンドポイント
const char* server = "AWS Iotから調べてください。";
設定する箇所3:証明書
モノを作成するときにダウンロードした証明書をテキストエディタで開き書き込んでください。
//ルートCA証明書(レガシーVerSign)
const char* test_root_ca = \
"-----BEGIN CERTIFICATE-----\n" \
//レガシー証明書の中身を入れてください
"-----END CERTIFICATE-----\n";
// デバイス証明書 certificate.pem.crt
const char* test_client_key = \
"-----BEGIN CERTIFICATE-----\n" \
// デバイス証明書の中身を入れてください
"-----END CERTIFICATE-----;\n";
//プライベートキーファイル private.pem.key
const char* test_client_cert = \
"-----BEGIN RSA PRIVATE KEY-----\n" \
//プライベートキーファイルを入れてください。
"-----END RSA PRIVATE KEY-----\n" ;
私の環境だとこんな感じです。※デバイス証明書の場合

設定する箇所4:モノの名称
作成したモノの名称を入れてください。
if (mqttClient.connect("作成したモノの名前を入れてください")) {
Serial.println("AWS 作成したモノの名前 Connected.");
これで準備は完了です。
実行!!
以下のようなログが出れば完了です。
...............................................................................Attempting to connect to SSID: HR01a-F2A288
...Connected to 接続するSSID
WiFi connected
IP address:
192.168.128.141
AWS M5Stack2 Connected.
Subscribed.
Publishing message to topic $aws/things/M5Stack2/shadow/update
{"state":{"reported":{"message": "0"}}}
Published.
Publishing message to topic $aws/things/M5Stack2/shadow/update
{"state":{"reported":{"message": "1"}}}
Published.
接続できない場合
①以下のように…..がずっと続く場合はSSIDとパスワードを確認してください。Wifiに接続できていません。
※意外と繋がるまで時間がかかるので気長にお待ちください。もしくはM5Stackをリセットしてください
.............................................................................................................................................................................................................................................................................................
②以下のようなエラーが出た場合、証明書かawsIotのエンドポイントが間違っています。
Failed. Error state=-2Failed. Error state=-2Failed. Error state=-2
まとめ
・AWSIotでモノの作成と証明書をダウンロードしてエンドポイントを確認する。
・Arduinoで該当箇所にAWSIoTで取得した上記を記入して接続試行!
さいごに
これからAPI作ったりスマホと繋いだりIotっぽいことしていこうと思います!!

コメント