Rabu, 12 November 2025

Wi-Fi hotspot dengan captive portal

ESP32 yang dikonfigurasi sebagai Wi-Fi hotspot dengan captive portal bekerja dengan cara membuat jaringan lokal mandiri yang dapat diakses oleh perangkat lain. Ketika ESP32 diaktifkan dalam mode Access Point (AP), ia memancarkan sinyal Wi-Fi dengan nama SSID tertentu, misalnya "ESP32_Hotspot". Perangkat yang terhubung ke jaringan ini akan diarahkan ke halaman web lokal melalui mekanisme DNS spoofing, di mana semua permintaan domain dialihkan ke alamat IP ESP32 menggunakan library DNSServer. Web server yang berjalan di ESP32 kemudian menangani permintaan HTTP dan menampilkan halaman HTML yang telah diprogram, seperti halaman sambutan atau formulir input. Dengan cara ini, pengguna yang terhubung ke hotspot akan otomatis melihat halaman portal tanpa perlu mengetik alamat tertentu, mirip seperti sistem login Wi-Fi publik di kafe atau hotel.

Source code lengkap untuk ESP32 yang berfungsi sebagai Wi-Fi hotspot dengan captive portal yang mengarahkan pengguna ke halaman web lokal:

#include <WiFi.h>
#include <DNSServer.h>
#include <ESPAsyncWebServer.h>
#include <AsyncTCP.h>

const byte DNS_PORT = 53;
DNSServer dnsServer;
AsyncWebServer server(80);

// HTML halaman utama
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>ESP32 Captive Portal</title>
</head>
<body>
  <h1>Selamat Datang di Hotspot ESP32</h1>
  <p>Anda berhasil terhubung ke jaringan lokal.</p>
</body>
</html>
)rawliteral";

void setup() {
  Serial.begin(115200);

  // Setup Access Point
  WiFi.softAP("ESP32_Hotspot", "12345678");
  delay(100);
  Serial.println("Hotspot aktif: ESP32_Hotspot");

  // Setup DNS untuk redirect semua domain ke IP ESP32
  dnsServer.start(DNS_PORT, "*", WiFi.softAPIP());

  // Setup Web Server
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html);
  });

  // Redirect semua permintaan ke halaman utama
  server.onNotFound([](AsyncWebServerRequest *request){
    request->redirect("/");
  });

  server.begin();
}

void loop() {
  dnsServer.processNextRequest();
}
https://github.com/lacamera/ESPAsyncWebServer

Wi-Fi hotspot dengan captive portal