diff --git a/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino b/libraries/DNSServer/examples/CaptivePortal/CaptivePortal.ino new file mode 100644 index 000000000..eb2278220 --- /dev/null +++ b/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/libraries/DNSServer/examples/DNSServer/DNSServer.ino b/libraries/DNSServer/examples/DNSServer/DNSServer.ino index a7fdbb1f9..2916d5ab3 100644 --- a/libraries/DNSServer/examples/DNSServer/DNSServer.ino +++ b/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/libraries/DNSServer/library.properties b/libraries/DNSServer/library.properties index b9fc670dd..71f0ae544 100644 --- a/libraries/DNSServer/library.properties +++ b/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/libraries/DNSServer/src/DNSServer.cpp b/libraries/DNSServer/src/DNSServer.cpp index 5af48a3ce..10fc81d4a 100644 --- a/libraries/DNSServer/src/DNSServer.cpp +++ b/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/libraries/DNSServer/src/DNSServer.h b/libraries/DNSServer/src/DNSServer.h index df489402a..d58efbbdd 100644 --- a/libraries/DNSServer/src/DNSServer.h +++ b/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();