ESP32を無線APにしてスマホから接続するテスツ

Arduino/ESP32ESP32,wifi,アクセスポイント,無線

今回はESP32を無線アクセスポイントにして、スマホから接続できる様にしたいと思います。

何に使うかって、、、?

ESP32を何処か別の場所に持って行った時に、その場所のwifiアクセスポイントに接続する接続情報を入力する為でござる

液晶くっつけてポチポチボタンで入力させるとか、ノートPC持ち込んでプログラム書き換えるとか、そんな事したくないでござる

そんなわけで、現地に何も無くてもスマホからアクセスできる機材を作るという目的です。

ひとまずどんな感じか触ってみない事には設計を間違いますからね・・・

さて、無線アクセスポイントにするには、、、

この辺でしょうか

GitHub – Espressif – arduino-esp32/libraries/WiFi/examples/WiFiAccessPoint/WiFiAccessPoint.ino

じゃちょっと書いてみます。

サンプルではWiFiServerを使っている様ですが、折角なのでWiFiAPとWebServerライブラリでやってみます。

#include <Arduino.h>
/*
    wifiAPモードにし、スマホからのアクセスに応答するテスト
*/
// WiFiライブラリ
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
// WebServerライブラリ
#include <WebServer.h>
#include <uri/UriRegex.h>

// 自身のSSID、パスワード設定
const char *ssid = "ESP32AP";
const char *password = "guestguest";    // 短いと無効なので・・・

// BASIC認証
const char *www_username = "basic";
const char *www_password = "basic";

// wifiインスタンス
WiFiClass wifi;
// サーバーインスタンス
WebServer server;
// コア2ループのタスクハンドル
TaskHandle_t pWebServerPolling;

// wifiスキャン文字列を返すだけ
bool getWifiScanStr(String &_str, WiFiScanClass &_wifi)
{
    // wifiスキャン
    //  int16_t scan_res = wifi.scanNetworks();
    int16_t scan_res = _wifi.scanNetworks();
    if (scan_res > 0)
    {
        // 発見したwifiAPを表示
        _str += "- SCAN SSID RESULT -<br /><br />\n";
        _str += String(scan_res) + " of SSID found.<br />\n";
        for (int i = 0; i < scan_res; ++i)
        {
            // SSIDとRSSIをprint
            _str += String(i) + ":" + _wifi.SSID(i) + "(RSSI:" + _wifi.RSSI(i) + " dBm)<br />\n";
        }
        return true;
    }
    else
    {
        return false;
    }
}

void response()
{
    // リザルト文字列
    String str;

    // 処理内容
    Serial.println("Incomming Browser Access.");
    Serial.print("request:");
    Serial.println(server.uri());

    // BASIC認証
    if (!server.authenticate(www_username, www_password))
    {
        return server.requestAuthentication();
    }

    // サーバーリセット
    if (server.uri() == "/reset")
    {
        server.send(200, "text/plain", "after reset server at 5 sec..");
        delay(10000);
        ESP.restart();
    }
    else
    {
        // html作成
        str += "<html><head></head><body>\n";
        // 現在のSSIDを表示
        str += "Welcome ESP32 AP at : " + String(wifi.softAPgetHostname()) + "<br /><br />\n";
        // wifi scan print
        getWifiScanStr(str, wifi);
    }

    if (str.length() > 0)
    {
        str += "</body></html>";
        server.send(200, "text/html", str);
    }
    else
    {
        server.send(200, "text/plain", "other case....");
    }
    // delayをちりばめておく・・・
    delay(1);
}

// コア0ループ
void WebServerPolling(void *param)
{
    // ポーリングなどを
    while (1)
    {
        // Webサーバー待ち受け
        server.handleClient();
        // resistance watchdog
        delay(2);
    }
}

void setup()
{
    // シリアル
    Serial.begin(115200);

    Serial.println();
    Serial.println("beginning AP");

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

    // wifiモード softAPモードで設定
    wifi.mode(WIFI_AP);
    //  wifi.mode(WIFI_STA);
    //  wifi.mode(WIFI_AP_STA); // 両方モード

    // channel 3, max-connection 4
    // bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0, int max_connection = 4);
    wifi.softAP(ssid, password, 3, 0, 4);

    delay(200);

    // 初期IPアドレス
    wifi.softAPConfig(IPAddress(192, 168, 4, 1), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));

    Serial.print("AP IP address: ");
    Serial.print(wifi.softAPIP());
    Serial.println();
    // Wifi ------------------------------------------------------------

    delay(100);

    // WebServer ------------------------------------------------------------
    //  すべての接続をresponseへ
    server.on(UriRegex("^.*?$"), response);

    // WebServerスタート
    server.begin();

    // Core 0 でWebサーバーを起動
    //      コアを明確に指定しない場合は xTaskCreateUniversal ラッパーを使う方がいい
    xTaskCreateUniversal(
        WebServerPolling,   //  TaskFunction_t pvTaskCode,
        "WebServerPolling", //  const char * const pcName,
        20480,              //  const uint32_t usStackDepth,
        NULL,               //  void * const pvParameters,
        1,                  //  UBaseType_t uxPriority,
        &pWebServerPolling, //  TaskHandle_t * const pvCreatedTask,
        0);                 //  CPU Core

    Serial.print("WebServer Started. http://");
    Serial.print(wifi.softAPIP());
    Serial.println("/");
    // WebServer ------------------------------------------------------------
}

void loop()
{

    // 暇なので空きメモリでも出しておく
    Serial.print("Free Heap memory malloc: ");
    Serial.println(ESP.getFreeHeap());
    Serial.print("wifi connected at : ");
    Serial.println(wifi.softAPgetStationNum());

    delay(20000);
}

解説は、、いりませんよねこれだけの内容ですし

ついでになんとなくCPUを分けてみてます。

さっとコンパイルして、、

なんか容量を74.5%も使ってます。

サーバープロセスを入れると文字もいっぱい書きますから膨らんでしまいますね

さてシリアルモニタを立ち上げまして

起動時はwifi接続数は0。

スマホを操作しまして、、無事接続完了。

接続後はちゃんとwifi connected at が1になってくれました。

BASIC認証も入れて接続すると、ちゃんと応答してくれました。

wifiオブジェクトを使いまわしてしまっているので、本番はもう少しちゃんと書かないといけませんね

とりあえず出来たという事で、、