ESP32をWebサーバーにして応答させてみる

2020年5月3日Arduino/ESP32BASIC認証,ESP32,WebServer

ESP32と対話をするのにシリアルインターフェースだけでは面倒ですので、HTTPサーバーを試してみる事にします。

wifiクライアント等から喋らせてもいいのですが、これまた面倒ですのでwebserverのライブラリを使ってしまいます。

使えるものは使わねば^^;

mimeとか判定面倒ですしおすし

そんなわけで、これまたespressif様のGitリポジトリにお世話になります。

ざっくりと、多分こんな感じかな

1.Webサーバーのインスタンスを作成
2.定義を書いて
3.インスタンススタート
4.ループでコネクション待ち受け

Wifi接続と、なんだかBASIC認証っぽいメソッドもあるのでこれも使ってみます。

#include <Arduino.h>

/*
    Webサーバーテスト
*/

// WiFiライブラリをインクルード
#include <WiFi.h>

// アクセスポイント設定
const char *WIFI_SSID = "XXXXXXXXXX";
const char *WIFI_PASS = "YYYYYYYYYY";

// インスタンス生成
WiFiClass wifi;

// WebServerライブラリを使用
#include <WebServer.h>

// インスタンス作成 待ち受け80番ポート
WebServer server(80);

// basic認証用
const char *www_username = "admin";
const char *www_password = "abc";

void setup()
{
    // put your setup code here, to run once:

    // シリアル通信を開始
    Serial.begin(115200);

    // ちょっと待つ
    delay(3000);

    // 既に接続中なら一旦切る
    if (wifi.isConnected())
    {
        wifi.disconnect();
        delay(3000);
    }

    // wifiモードを設定 ステーションモード
    wifi.mode(WIFI_STA);
    wifi.setAutoConnect(false);

    // wifi通信開始
    wifi.begin(WIFI_SSID, WIFI_PASS);
    delay(6000); // 6秒待ち

    // 繋がるまでループ
    while (wifi.status() != WL_CONNECTED)
    {
        // 繋がらなかったら
        if (wifi.status() == WL_CONNECT_FAILED)
        {
            Serial.println("aborting wifi connection to SSID. plz check at config.");
        }
        Serial.println("connecting...");
        delay(6000);
    }

    Serial.println("success!");
    Serial.print("IP address: ");
    Serial.println(wifi.localIP());
    Serial.print("GW address: ");
    Serial.println(wifi.gatewayIP());
    Serial.print("DNS address: ");
    Serial.println(wifi.dnsIP());
    Serial.println("");

    // rootアクセスに応答する定義
    server.on("/", []() {
        // BASIC認証
        if (!server.authenticate(www_username, www_password))
        {
            return server.requestAuthentication();
        }
        // 認証OKの場合にはログインOKを表示
        server.send(200, "text/plain", "Login OK");
    });

    // サーバースタート
    server.begin();

    Serial.print("WebServer Started. http://");
    Serial.print(WiFi.localIP());
    Serial.println("/");
}

void loop()
{
    // put your main code here, to run repeatedly:
    // Webサーバー待ち受け
    server.handleClient();

}

こんなで良かろうかしら

WebServer::handleClient() で待ち受けるみたいです。

シリアルモニタで動作を確認しまして

ちゃんとWebサーバーが立ち上がったみたいです。

たぶん・・・

じゃちょっとブラウザでアクセスを

たった数行でBASIC認証の窓が出て、

IDとパスワードを入力したらレスポンスが表示されましたね

[WebServerインスタンス].on(const Uri &uri, THandlerFunction handler) で、あらかじめ設定しておいたURLのリクエストが来たら指定した関数が呼び出されて実行される様子。

容量の関係で、恐らく2,3ページくらいしか作らないと考えればこの様な実装で良いのでしょうけれど

これだとページを増やす度にBASIC認証を頭に入れなくてはいけない。

ちょこっと汎用性が無いかなぁと思ったり思わなかったり。

しかしひとまずは、お手軽に出来る事が価値があるというものだと思います。

こういった細々とした面倒事をざっくり実装してくれるライブラリは助かります。

この程度の内容でも自分で書くと結構面倒ですからね^^;