Skip to content

Commit 7faebcd

Browse files
committed
Merge pull request #448 from knovoselic/dns_server_improvements
DNSServer can now be configured to reply to all requests with one IP address (e.g. for captive portal)
2 parents d400d31 + 5deef1b commit 7faebcd

File tree

5 files changed

+52
-5
lines changed

5 files changed

+52
-5
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <ESP8266WiFi.h>
2+
#include <DNSServer.h>
3+
#include <ESP8266WebServer.h>
4+
5+
const byte DNS_PORT = 53;
6+
IPAddress apIP(192, 168, 1, 1);
7+
DNSServer dnsServer;
8+
ESP8266WebServer webServer(80);
9+
10+
String responseHTML = ""
11+
"<!DOCTYPE html><html><head><title>CaptivePortal</title></head><body>"
12+
"<h1>Hello World!</h1><p>This is a captive portal example. All requests will "
13+
"be redirected here.</p></body></html>";
14+
15+
void setup() {
16+
WiFi.mode(WIFI_AP);
17+
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
18+
WiFi.softAP("DNSServer CaptivePortal example");
19+
20+
// if DNSServer is started with "*" for domain name, it will reply with
21+
// provided IP to all DNS request
22+
dnsServer.start(DNS_PORT, "*", apIP);
23+
24+
// replay to all requests with same HTML
25+
webServer.onNotFound([]() {
26+
webServer.send(200, "text/html", responseHTML);
27+
});
28+
webServer.begin();
29+
}
30+
31+
void loop() {
32+
dnsServer.processNextRequest();
33+
webServer.handleClient();
34+
}

hardware/esp8266com/esp8266/libraries/DNSServer/examples/DNSServer/DNSServer.ino

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
#include <ESP8266WiFi.h>
22
#include <DNSServer.h>
3+
#include <ESP8266WebServer.h>
34

45
const byte DNS_PORT = 53;
56
IPAddress apIP(192, 168, 1, 1);
67
DNSServer dnsServer;
8+
ESP8266WebServer webServer(80);
79

810
void setup() {
911
WiFi.mode(WIFI_AP);
@@ -19,10 +21,21 @@ void setup() {
1921
// default is DNSReplyCode::NonExistentDomain
2022
dnsServer.setErrorReplyCode(DNSReplyCode::ServerFailure);
2123

22-
//start DNS server for a specific domain name
24+
// start DNS server for a specific domain name
2325
dnsServer.start(DNS_PORT, "www.example.com", apIP);
26+
27+
// simple HTTP server to see that DNS server is working
28+
webServer.onNotFound([]() {
29+
String message = "Hello World!\n\n";
30+
message += "URI: ";
31+
message += webServer.uri();
32+
33+
webServer.send(200, "text/plain", message);
34+
});
35+
webServer.begin();
2436
}
2537

2638
void loop() {
2739
dnsServer.processNextRequest();
40+
webServer.handleClient();
2841
}

hardware/esp8266com/esp8266/libraries/DNSServer/library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=DNSServer
2-
version=1.0.0
2+
version=1.1.0
33
author=Kristijan Novoselić
44
maintainer=Kristijan Novoselić, <[email protected]>
55
sentence=A simple DNS server for ESP8266.

hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ void DNSServer::processNextRequest()
5454
if (_dnsHeader->QR == DNS_QR_QUERY &&
5555
_dnsHeader->OPCode == DNS_OPCODE_QUERY &&
5656
requestIncludesOnlyOneQuestion() &&
57-
getDomainNameWithoutWwwPrefix() == _domainName)
57+
(_domainName == "*" || getDomainNameWithoutWwwPrefix() == _domainName)
58+
)
5859
{
5960
replyWithIP();
6061
}

hardware/esp8266com/esp8266/libraries/DNSServer/src/DNSServer.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ struct DNSHeader
2727
unsigned char AA : 1; // authoritive answer
2828
unsigned char OPCode : 4; // message_type
2929
unsigned char QR : 1; // query/response flag
30-
unsigned char RCode : 4; // response code
30+
unsigned char RCode : 4; // response code
3131
unsigned char Z : 3; // its z! reserved
3232
unsigned char RA : 1; // recursion available
3333
uint16_t QDCount; // number of question entries
@@ -62,7 +62,6 @@ class DNSServer
6262
uint32_t _ttl;
6363
DNSReplyCode _errorReplyCode;
6464

65-
6665
void downcaseAndRemoveWwwPrefix(String &domainName);
6766
String getDomainNameWithoutWwwPrefix();
6867
bool requestIncludesOnlyOneQuestion();

0 commit comments

Comments
 (0)