" + ssid + "";
s_ssid_list += String(toWiFiQuality(WiFi.RSSI(i))) + "%";
if (WiFi.encryptionType(i) != WIFI_AUTH_OPEN)
s_ssid_list += "
";
s_ssid_list += "
";
}
CONNECT_REQ = false;
return s_ssid_list;
}
// Accepting connection request.
// Flag the occurrence of the connection request and response a redirect to
// the connection result page.
String reqConnect(PageArgument& args) {
if (CONN_SSID == "?")
CONN_SSID = args.arg("ssid");
CONN_PSK = args.arg("psk");
// Leave from the AP currently.
if (WiFi.status() == WL_CONNECTED) {
WiFi.disconnect();
while (WiFi.status() == WL_CONNECTED);
}
// Available upon connection request.
CONNECT_REQ = true;
REDIRECT_URI = "";
CURRENT_HOST = "";
// Redirect http request to connection result page.
server.sendHeader("Location", String("http://") + WiFi.softAPIP().toString() + String(URI_RESULT), true);
server.send(302, "text/plain", "");
REQ_PAGE.cancel();
return "";
}
// Performing AP connection procedure.
void connWiFi() {
// Starts connecting the ap as WIFI_STA
Serial.print("Connect to " + CONN_SSID + "/" + CONN_PSK + " ");
WiFi.begin(CONN_SSID.c_str(), CONN_PSK.c_str());
unsigned long tm = millis();
do {
delay(500);
Serial.print('.');
if (millis() - tm > 30000)
break;
} while (WiFi.status() != WL_CONNECTED);
Serial.print(String(WiFi.status()) + ":");
// Dynamically switch the result page URL according to the connection result.
// If it connected to the AP, redirect localIP () as the host address.
// Connection failed, redirect to a failed page addressed on softAPIP().
if (WiFi.status() == WL_CONNECTED) {
// Connection established, makes a response page into a new IP address.
CURRENT_HOST = WiFi.localIP().toString();
REDIRECT_URI = URI_WELCOME;
Serial.println("OK");
}
else {
// Connection refused, a fails page keeps on softAPIP.
CURRENT_HOST = WiFi.softAPIP().toString();
REDIRECT_URI = URI_FAILED;
Serial.println("Failed");
}
}
// Responds redirect destination according to the connection result of success
// or failure to the AP.
String resConnect(PageArgument& args) {
String redirect = String("http://") + CURRENT_HOST + REDIRECT_URI;
Serial.println("Redirect: " + redirect);
server.sendHeader("Location", redirect, true);
server.sendHeader("Connection", "keep-alive");
server.send(302, "text/plain", "");
server.client().stop();
CONNRES_PAGE.cancel();
Serial.println();
WiFi.printDiag(Serial);
return "";
}
// WiFi event determination and echo back.
void broadcastEvent(WiFiEvent_t event) {
static const char eventText_APSTA_CONN[] PROGMEM = "SoftAP station connected.";
static const char eventText_APSTA_DISC[] PROGMEM = "SoftAP station disconnected.";
static const char eventText_STA_CONN[] PROGMEM = "WiFi AP connected.";
static const char eventText_STA_DISC[] PROGMEM = "WiFi AP disconnected.";
const char* eventText;
switch (event) {
case WIFI_EVENT_AP_STACONNECTED:
eventText = eventText_APSTA_CONN;
break;
case WIFI_EVENT_AP_STADISCONNECTED:
eventText = eventText_APSTA_DISC;
break;
case WIFI_EVENT_STA_CONNECTED:
eventText = eventText_STA_CONN;
break;
case WIFI_EVENT_STA_DISCONNECTED:
eventText = eventText_STA_DISC;
break;
default:
eventText = nullptr;
}
if (eventText)
Serial.println(String("[event] ") + String(FPSTR(eventText)));
}
// Get an architecture of compiled
String getArch(PageArgument& args) {
#if defined(ARDUINO_ARCH_ESP8266)
return "ESP8266";
#elif defined(ARDUINO_ARCH_ESP32)
return "ESP32";
#endif
}
// HTML page declarations.
// root page
PageElement SSID_ELM("file:/root.htm", {
{ "SSID_LIST", listSSID },
{ "URI_ROOT", [](PageArgument& args) { return URI_ROOT; }}
});
PageBuilder SSID_PAGE(URI_ROOT, { SSID_ELM });
// SSID & Password entry page
PageElement ENTRY_ELM("file:/entry.htm", {
{ "ESP_ARCH", getArch },
{ "ENTRY", [](PageArgument& args) { CONN_SSID = args.arg("ssid"); return "AP"; } },
{ "URI_REQ", [](PageArgument& args) { return URI_REQ; } },
{ "SSID", [](PageArgument& args) { return CONN_SSID == "?" ? "placeholder=\"SSID\"" : String("value=\"" + CONN_SSID + "\" readonly"); } },
{ "PSK", [](PageArgument& args) { return args.arg("psk_type") != "7" ? "