Azure IoT HubのREST APIを使ってM5ATOM Liteからデータを送信するメモ


はじめに

Azure IoT HubにM5ATOM Liteからデータを送信するメモです。
IoT HubのREST APIを利用します。

ソースコードはGitHubに公開しています。
https://github.com/tmitsuoka0423/m5stack-azure-iot-http-post

Azure IoT Hub周りの作業

Azure IoT Hubをデプロイする

公式のクイックスタートを参考にIoT Hubのインスタンスを作成します。

  • スケールはF1を選択。(無料版)

Azure IoT HubのREST APIエンドポイントのルート証明書を取得する

ESP32でHTTPS通信を行う場合は、ルート証明書を指定してあげる必要があります。

こちらの記事(Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法)を参考にさせていただき、ルート証明書を取得します。

https://<Iot Hubの名前>.azure-devices.net/をChromeで開いて証明書を取得します。
(実際に開くとBad Requestになりますが、ルート証明書を取るだけなので問題なし)

IoTデバイスを登録する

Azure IoT Hubのコンソールを開き、IoTデバイス > 新規からデバイスを登録します。

デバイスIDは好きな値を指定し、その他は変更なしでOKです。

M5ATOM Liteのプログラム

サンプルコード

前記事(M5ATOM LiteでHTTP POSTするシンプルなサンプルコード)で作成したコードを変更していきます。
testという文字列を送信してみます。

arduino-esp32HTTPClient.hを見ると、beginメソッドにURLルート証明書を渡せば良さそうです。

https://github.com/espressif/arduino-esp32/blob/dd513df124bd39736e96c2b03b23dd48bdae0c97/libraries/HTTPClient/src/HTTPClient.h#L160

bool begin(String url, const char* CAcert);

コードは以下のようになります。

#define FASTLED_INTERNAL

#include <M5Atom.h>
#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_PASSWORD";

const char *url = "https://<IoT Hubの名前>.azure-devices.net/devices/<デバイスID>/messages/events?api-version=2018-06-30";
const char* azure_iot_hub_root_ca =
    "-----BEGIN CERTIFICATE-----\n" \
    "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n" \
    "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n" \
    "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n" \
    "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n" \
    "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n" \
    "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n" \
    "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n" \
    "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n" \
    "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n" \
    "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n" \
    "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n" \
    "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n" \
    "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n" \
    "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n" \
    "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n" \
    "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n" \
    "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n" \
    "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n" \
    "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n" \
    "-----END CERTIFICATE-----\n";

const char *sasToken = "SharedAccessSignature sr=xxxxxxxxxx&sig=xxxxxxxxxxxxxxxx&se=xxxxxxxxxxxxxxx&skn=xxxxxxxxxxxxxxxxxx";

void post() {
  HTTPClient http;
  http.begin(url, azure_iot_hub_root_ca);
  http.addHeader("Content-Type", "application/json");
  http.addHeader("Authorization", sasToken);
  http.POST("test");
  Serial.println(http.getString());
  http.end();
}

void setup() {
  M5.begin();
  Serial.begin(115200);

  Serial.print("WiFi connecting.");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(100);
  }

  post();
}

void loop() { /* 起動時のみ送信するため、ループでは何もしない。*/ }

実際に利用する場合は、WiFiの設定とAzureのパラメータを設定してください。
Azureのパラメータの詳細は以下の通りです。

名前 内容 備考
url Azure IoT HubのREST APIのURL 作成したIoT Hubインスタンスの名前と、登録したデバイスIDを指定
sasToken SASトークン SASトークンを発行するで発行できます

動作確認

公式のサンプルコードを利用して、受信できているか確認します。

サンプルコードをダウンロード後、Node.jsでAzure IoT Hubにテレメトリを送信するサンプルコードを動かすメモ/送信したデータを受信するの手順に従って、プログラムを実行します。

// TODO 画像

まとめ

M5ATOM LiteからAzure IoT HubのREST APIを使ってデータを送信しました。
HTTP POSTで送信すると、割とシンプルなコードで送信することができました。

今回、SASトークンはパソコンで発行してからM5ATOM Liteに書き込んでいるので、時間が経つと期限が切れてしまいます。
マイコン上でSASトークンを発行する方法も調べていきます。