2021年10月1日金曜日

ESP32 で Wifi 接続して外部のサイトに https リクエストする方法

ESP32 で Wifi 接続して外部のサイトに https リクエストする方法

概要

ESP32 の Wifi 接続機能を使ってみました
Wifi 接続後に動作確認としてインターネット上の外部のサイトに https で接続してレスポンスをシリアルに表示してみます

環境

  • macOS 11.6
  • Arduino IDE 1.8.16
  • ESP-WROOM-32 devkitc v4

スケッチ

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

WiFiMulti wifiMulti;
WiFiClientSecure client;

const char* host = "kaka-request-dumper.herokuapp.com";

void setup() {
  Serial.begin(115200);
  delay(100);
  wifiMulti.addAP("ssid", "ssid_pass");
  if (wifiMulti.run() == WL_CONNECTED) {
    Serial.println("Wifi Connected.");
  }
}

void onButton() {
  client.setInsecure();

  // インターネットにアクセスできるかテスト
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed!");
  } else {
    client.println("GET / HTTP/1.1");
    client.println("Host: " + String(host));
    client.println();

    // レスポンスが返ってくるまで待つ
    unsigned long timeout = micros();
    while (client.available() == 0) {
      if (micros() - timeout  > 5000000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }
    // レスポンスの表示
    while (client.available()) {
      String line = client.readStringUntil('\n');
      Serial.println(line);
    }
    client.stop();
  }
}

void loop() {
  static uint8_t lastPinState = 1;
  uint8_t pinState = digitalRead(0);
  if (!pinState && lastPinState) {
    onButton();
  }
  lastPinState = pinState;
  delay(500);
}

解説

wifiMulti.addAP でアクセスポイントの情報を定義します
WiFiMulti を使うと複数のアクセスポイントに接続できます

接続完了後に ESP32 のブートボタンを押すと外部のサイトに接続テストします
WiFiClientSecure を使って外部に接続する場合証明書が必要になります
今回はテストなので証明書を使わない方法として client.setInsecure() を設定しています

HTTP のリクエストは client.println で作成します
ヘッダ情報やボディ情報などをそれぞれ書き足していきます

レスポンスを使用する場合はレスポンスが返ってくるまで待つ必要があります
レスポンスが取得できる状態になったら client.readStringUntil で各行を表示しています

最後に

リクエストを作るのが少し面倒ですが HTTP リクエストを送信することができました

今回は実装していませんが Wifi の再接続などの処理も必要かもしれません

参考サイト

0 件のコメント:

コメントを投稿