Advertisement
Guest User

Captive portal asyncwebserver example

a guest
Aug 1st, 2017
303
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include <ESP8266WiFi.h>
  2. #include <DNSServer.h>
  3. #include <FS.h>          // SPIFFS Library for access to the onboard storage
  4. #include <ESPAsyncTCP.h>    // Async TCP Library is mandatory for Async Web Server
  5. #include <ESPAsyncWebServer.h>  // Async Web Server with built-in WebSocket Plug-in
  6. #include <ESP8266mDNS.h>        // Zero-config Library (Bonjour, Avahi)
  7.  
  8. const byte DNS_PORT = 53;
  9. DNSServer dnsServer;
  10. AsyncWebServer server(80);
  11.  
  12. IPAddress apIP(192, 168, 4, 1);
  13.  
  14. void setup() {
  15.   SPIFFS.begin();
  16.  
  17.   // if DNSServer is started with "*" for domain name, it will reply with
  18.   // provided IP to all DNS request
  19.   dnsServer.start(DNS_PORT, "*", apIP);
  20.  
  21.   server.serveStatic("/", SPIFFS, "/");
  22.  
  23.  
  24.   // replay to all requests with same HTML
  25.   server.onNotFound([](AsyncWebServerRequest *request) {
  26.       if (captivePortal(request)) { // If captive portal redirect instead of displaying the error page.
  27.         return;
  28.       }
  29.  
  30.       String message = "File Not Found\n\n";
  31.       message += "URI: ";
  32.       message += request->url();
  33.       message += "\nMethod: ";
  34.       message += ( request->method() == HTTP_GET ) ? "GET" : "POST";
  35.       message += "\nArguments: ";
  36.       message += request->args();
  37.       message += "\n";
  38.  
  39.       for (uint8_t i = 0; i < request->args(); i++ ) {
  40.         message += " " + request->argName ( i ) + ": " + request->arg ( i ) + "\n";
  41.       }
  42.      
  43.       AsyncWebServerResponse *response = request->beginResponse(404,"text/plain",message);
  44.       response->addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  45.       response->addHeader("Pragma", "no-cache");
  46.       response->addHeader("Expires", "-1");
  47.       request->send(response);
  48.     });
  49.   server.begin();
  50.  
  51.   WiFi.mode(WIFI_AP);
  52.   WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  53.   WiFi.softAP("DNSServer CaptivePortal example");
  54.    
  55.   if (!MDNS.begin("esp-captive-portal")) {
  56.        Serial.println(F("Error setting up MDNS responder!"));
  57.     }
  58.     // Add Web Server service to mDNS
  59.     MDNS.addService("http", "tcp", 80);
  60. }
  61.  
  62. void loop() {
  63.   dnsServer.processNextRequest();
  64. }
  65.  
  66. boolean captivePortal(AsyncWebServerRequest *request) {
  67.     if (!isIp(request->host()) ) {
  68.       AsyncWebServerResponse *response = request->beginResponse(302,"text/plain","");
  69.       response->addHeader("Location", String("http://" + ipToString(apIP)));
  70.       request->send(response);
  71.       return true;
  72.     }
  73.     return false;
  74. }
  75.  
  76. boolean isIp(String str) {
  77.     for (int i = 0; i < str.length(); i++) {
  78.       int c = str.charAt(i);
  79.       if (c != '.' && (c < '0' || c > '9')) {
  80.           return false;
  81.       }
  82.     }
  83.     return true;
  84. }
  85.  
  86. String ipToString(IPAddress ip) {
  87.   String res = "";
  88.   for (int i = 0; i < 3; i++) {
  89.     res += String((ip >> (8 * i)) & 0xFF) + ".";
  90.   }
  91.   res += String(((ip >> 8 * 3)) & 0xFF);
  92.   return res;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement