ESP32をWiFiのアクセスポイントとして起動させるには、SSID、IPアドレス、パスワードなどの設定が不可欠である。それだけでなく、センサネットワークを構築するアプリケーションでは、接続できるセンサデバイス(クライアント)の最大数が重要となる。
使用するライブラリーにおけるアクセスポイント設定関数WiFi.softAPでは、デフォルトの最大接続数が4となっていて、そのまま適用するとアプリケーションが限定されてしまう。この最大接続数はWebSocket通信と密接な関係があり、注意深く設定する必要がある。
WebSocketServer.hでは、WebSocket通信時の最大クライアント数が5に定義されている。また、開発環境PlatformIOのコンフィグレーション・ファイルsdkconfigでは、最大ソケット数が10と定義されている(ユーザの開発環境やライブラリーのバージョンによっては、これらの数値は異なるかも知れない)。
WebSocketServer.h
- WEBSOCKETS_SERVER_CLIENT_MAX (5)
C:\Users\<User_Name>\.platformed\packages\framework-arduinoespressif32\tools\sdk\esp32\sdkconfig
- CONFIG_LWIP_MAX_SOCKETS=10
接続予備実験を繰り返し、これらの定義が16まで拡張可能であることを見極めた。ただし、接続時のソケット更新用に2つのバッファを内部的に使用する模様で、最大接続数 14 (= 16 – 2) である。この数値にはブラウザも含まれるので、複数のブラウザを同時に立ち上げてセンシング状況を把握する場合なども考慮して、センサデバイスの最大数を設定する必要がある。ちなみに、14台のクライアントが接続している場合、新たなクライアントの接続は、アクセスポイントから拒否される。
以下に、アクセスポイント起動に関わるプログラムを中心に記載する。WebServer関連、WebSocketイベント処理などは、別の節で紹介する。
#include <Arduino.h>
#include <SPIFFS.h>
#include <WiFi.h>
#include <WiFiGeneric.h>
#include <WiFiServer.h>
#include <WebServer.h>
#include <WebSocketsServer.h>
#include <SSD1306.h>
// 接続最大クライアント数
#define CLIENT_MAX 14
// ブラウザのJSON形式データ
const char SERVER_JSON[] PROGMEM = R"=====({"DAT":[%s]})=====";
// テキスト・ペイロードサイズ(最大クライアント数と整合)
#define PayloadTXTSize 512
// アクセスポイント定義(パスワードは8文字以上)
const char *ssid = "AP-ESP32";
const char *password = "12345678";
const IPAddress ip(192, 168, 5, 1);
const IPAddress subnet(255, 255, 255, 0);
// ポート番号設定
int webPort = 80;
int socketPort = 81;
WebServer webServer(webPort);
WebSocketsServer webSocket = WebSocketsServer(socketPort);
// APモード起動シリアルメッセージ
void serialAPMode() {
Serial.println("");
Serial.print(F("SSID: ")); Serial.println(ssid);
Serial.print(F("Password: ")); Serial.println(password);
Serial.print(F("Address: ")); Serial.println(WiFi.softAPIP().toString());
Serial.print(F("MAC Address: ")); Serial.println(WiFi.softAPmacAddress());
Serial.println("HTTP server started");
Serial.println("");
}
// APモード起動
void setupAPMode() {
int channel = 1; // channel 1 - 13
int ssid_hidden = 0; // 0 = boroadcast SSID, 1 = hide SSID
WiFi.mode(WIFI_AP); // アクセスポイントモード
WiFi.softAPConfig(ip, ip, subnet); // IPアドレス, サブネット設定
WiFi.softAP(ssid, password, channel, ssid_hidden, CLIENT_MAX); // 最大クライアント数など設定
webServer.on("/", handleRoot); // ルート接続要求設定
webServer.on("/index.html", handleRoot);
webServer.onNotFound(handleConfirmFile); // ルート以外の接続要求設定
webServer.begin(); // Webサーバー起動
webSocket.begin(); // WebSocketサーバー起動
webSocket.onEvent(webSocketEvent); // サーバーイベント設定
serialAPMode(); // シリアルメッセージ
}