From 8a97666b8ff62cb4fc45bdee7d067ae150840282 Mon Sep 17 00:00:00 2001 From: Kristijan Novoselic Date: Fri, 19 Jun 2015 19:59:54 +0200 Subject: [PATCH 1/2] Added simple HTTP server to DNSServer example --- .../DNSServer/examples/DNSServer/DNSServer.ino | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino index 15951d629f..a7fdbb1f9d 100644 --- a/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino @@ -1,9 +1,11 @@ #include #include +#include const byte DNS_PORT = 53; IPAddress apIP(192, 168, 1, 1); DNSServer dnsServer; +ESP8266WebServer webServer(80); void setup() { WiFi.mode(WIFI_AP); @@ -21,8 +23,19 @@ void setup() { //start DNS server for a specific domain name dnsServer.start(DNS_PORT, "www.example.com", apIP); + + //simple HTTP server to see that DNS server is working + webServer.onNotFound([]() { + String message = "Hello World!\n\n"; + message += "URI: "; + message += webServer.uri(); + + webServer.send(200, "text/plain", message); + }); + webServer.begin(); } void loop() { dnsServer.processNextRequest(); + webServer.handleClient(); } From 5deef1b6a8bb7cf05dcce0c68bc9f9fdcf6e5c0b Mon Sep 17 00:00:00 2001 From: Kristijan Novoselic Date: Fri, 19 Jun 2015 20:21:19 +0200 Subject: [PATCH 2/2] Added captive portal functionality --- .../examples/CaptivePortal/CaptivePortal.ino | 34 +++++++++++++++++++ .../examples/DNSServer/DNSServer.ino | 4 +-- .../libraries/DNSServer/library.properties | 2 +- .../libraries/DNSServer/src/DNSServer.cpp | 3 +- .../libraries/DNSServer/src/DNSServer.h | 3 +- 5 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino new file mode 100644 index 0000000000..eb22782205 --- /dev/null +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino @@ -0,0 +1,34 @@ +#include +#include +#include + +const byte DNS_PORT = 53; +IPAddress apIP(192, 168, 1, 1); +DNSServer dnsServer; +ESP8266WebServer webServer(80); + +String responseHTML = "" + "CaptivePortal" + "

Hello World!

This is a captive portal example. All requests will " + "be redirected here.

"; + +void setup() { + WiFi.mode(WIFI_AP); + WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); + WiFi.softAP("DNSServer CaptivePortal example"); + + // if DNSServer is started with "*" for domain name, it will reply with + // provided IP to all DNS request + dnsServer.start(DNS_PORT, "*", apIP); + + // replay to all requests with same HTML + webServer.onNotFound([]() { + webServer.send(200, "text/html", responseHTML); + }); + webServer.begin(); +} + +void loop() { + dnsServer.processNextRequest(); + webServer.handleClient(); +} diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino index a7fdbb1f9d..2916d5ab3c 100644 --- a/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino @@ -21,10 +21,10 @@ void setup() { // default is DNSReplyCode::NonExistentDomain dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure); - //start DNS server for a specific domain name + // start DNS server for a specific domain name dnsServer.start(DNS_PORT, "www.example.com", apIP); - //simple HTTP server to see that DNS server is working + // simple HTTP server to see that DNS server is working webServer.onNotFound([]() { String message = "Hello World!\n\n"; message += "URI: "; diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/library.properties b/hardware/esp8266com/esp8266/libraries/DNSServer/library.properties index b9fc670dd1..71f0ae5440 100644 --- a/hardware/esp8266com/esp8266/libraries/DNSServer/library.properties +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/library.properties @@ -1,5 +1,5 @@ name=DNSServer -version=1.0.0 +version=1.1.0 author=Kristijan Novoselić maintainer=Kristijan Novoselić, sentence=A simple DNS server for ESP8266. diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.cpp b/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.cpp index 5af48a3cec..10fc81d4a9 100644 --- a/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.cpp +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.cpp @@ -54,7 +54,8 @@ void DNSServer::processNextRequest() if (_dnsHeader->QR == DNS_QR_QUERY && _dnsHeader->OPCode == DNS_OPCODE_QUERY && requestIncludesOnlyOneQuestion() && - getDomainNameWithoutWwwPrefix() == _domainName) + (_domainName == "*" || getDomainNameWithoutWwwPrefix() == _domainName) + ) { replyWithIP(); } diff --git a/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.h b/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.h index df489402ad..d58efbbdd3 100644 --- a/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.h +++ b/hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.h @@ -27,7 +27,7 @@ struct DNSHeader unsigned char AA : 1; // authoritive answer unsigned char OPCode : 4; // message_type unsigned char QR : 1; // query/response flag - unsigned char RCode : 4; // response code + unsigned char RCode : 4; // response code unsigned char Z : 3; // its z! reserved unsigned char RA : 1; // recursion available uint16_t QDCount; // number of question entries @@ -62,7 +62,6 @@ class DNSServer uint32_t _ttl; DNSReplyCode _errorReplyCode; - void downcaseAndRemoveWwwPrefix(String &domainName); String getDomainNameWithoutWwwPrefix(); bool requestIncludesOnlyOneQuestion();