ホーム » その他 » 【M5Stack×Arduino】AWSIoTにMQTT接続し通信するまでの手順を説明

【M5Stack×Arduino】AWSIoTにMQTT接続し通信するまでの手順を説明

【M5Stack×Arduino】AWSIoTに接続するまでの手順 その他

はじめに

これから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っぽいことしていこうと思います!!

コメント

タイトルとURLをコピーしました