環境モニタを作ろう with ESP32 DEV Module 〜 No3. wifiに接続して、https通信を試してみよう

ここまででできたこと

  1. 環境モニタを作ろう with ESP32 DEV Module 〜 No1. まずは動かして見よう
  2. 環境モニタを作ろう with ESP32 DEV Module 〜 No2. 温度湿度センサーをつけよう

さて、前回で温度と湿度のデータを取ることができましたね。

あれ、このままではシリアルモニタでみるだけですよね。AWS-IoT

ここから、Wifi 、もしくはSoracomなどを使って通信できるようにして、クラウドにデータを保存して、スマホやタブレットやPCでその状況をみれたりすると良いですよね。

さて、一つ一つやっていきましょう。

Wifiに接続してみる

う、どうやって?

Arduinoには、スケッチ例というサンプルコードがたくさんあるので、まずはそのスケッチ例を見て見ましょう。

Arduinoスケッチ例

Wifiのサンプルだけでもたくさんありますね。

この中で、WifiClientBasicの例を見て見ましょう。

WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino

setupのメソッド部分だけ動かすだけで、Wifiに接続できます。

ssidとpasswordだけ、自分の環境に合わせるだけです。

#include <WiFi.h>
#include <WiFiMulti.h>

WiFiMulti WiFiMulti;

void setup()
{
    Serial.begin(115200);
    delay(10);

    // We start by connecting to a WiFi network
    WiFiMulti.addAP("ssid", "password");

    Serial.println();
    Serial.println();
    Serial.print("Wait for WiFi... ");

    while(WiFiMulti.run() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
    }

    Serial.println("");
    Serial.println("WiFi connected");
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    delay(500);
}

シリアルモニターを開いて、Wifiに接続したメッセージとIPアドレスが取得できたか確認しましょう。

httpに接続してみる

さて、Wifiに繋がったので、次はインターネットに接続して、どこかのサイトを取得できるか試してみましょう。

今回もスケッチ例を参考にします。

HTTPClient/examples/BasicHttpClient/BasicHttpClient.ino

setup()の部分は、Wifiに接続している部分なので、説明は省略します。

loop()の部分でhttpに接続しています。

void loop() {
    // wait for WiFi connection
    if((wifiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        // configure traged server and url
        //http.begin("https://www.howsmyssl.com/a/check", ca); //HTTPS
        http.begin("http://example.com/index.html"); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // start connection and send HTTP header
        int httpCode = http.GET();

        // httpCode will be negative on error
        if(httpCode > 0) {
            // HTTP header has been send and Server response header has been handled
            USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(5000);
}

HTTPClientのライブラリを使うことで、サイトをgetすることができます。
上記の「http://example.com/index.html」を実際にあるWebサイトのURLに書き換えて実行してみましょう

httpsに接続してみる

さて、上記のコードを見てみると、httpsのサイトへのアクセスも、ルート証明書を渡すことでできるようです。

簡単にできるかなー、と思ったのですが、この証明書の取得で引っかかりました。

こちらのサイトでChromeからの証明書の取得方法が書かれているのですが、

私のChromeでは、すでに証明書の取得がDeveloperToolでできませんでした・・。

バージョン: 62.0.3202.94(Official Build) (64 ビット)

なので、今回はFireFoxから以下のようにして取得しました。

httpsのサイトを表示し、アドレスバーの鍵をクリックして、MoreInformationでさらに情報を表示させ、View Certificateで証明書の情報を表示させます。

Certificate FieldsでSubject’s Private Keyを選択してExportします。

これで証明書が取得できます。

ルート証明書取得

取得できた証明書は、変数にセットして

const char* ca = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \
"........................\n" \
"-----END CERTIFICATE-----\n";

証明書を引数につけて呼ぶだけです。

 http.begin("https://www.hogehoge.com/", ca); //HTTPS

ESP32 DEV Moduleはhttpsも使えるんですね。
暗号化には馬力が足りないデバイスも多いのですが、これなら、ここからAWS-IoTとかにつながるかも?

ということで、次回はAWS-IoTにつなぎにいきましょう

参考サイト

Arduino – ESP32 WiFiClientSecure ライブラリで、安定して https ( SSL )記事をGETする方法 | mgo-tec電子工作