1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-19 23:22:16 +03:00

Fixes by SwiCago on DNSServer

Fixes by SwiCago on this forum comment
http://www.esp8266.com/viewtopic.php?p=23900#p23900
This commit is contained in:
aalku 2015-08-13 10:06:18 +02:00 committed by Ivan Grokhotkov
parent 278c980ed8
commit a2f3637ed4
3 changed files with 133 additions and 3 deletions

View File

@ -0,0 +1,100 @@
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
const char* ssid = "esp8266";
boolean LEDstate[] = {LOW, false, LOW};
const char* html = "<html><head><title>Success</title><style>.bt{display:block;width:250px;height:100px;padding:10px;margin:10px;"
"text-align:center;border-radius:5px;color:white;font-weight:bold;font-size:70px;text-decoration:none;} "
"body{background:#000;} .r{background:#933;} .g{background:#363;} .y{background:#EE0;height:100px;"
"width:100px;border-radius:50px;} .b{background:#000;height:100px;width:100px;border-radius:50px;} "
".a{font-size:35px;} td{vertical-align:middle;}</style>"
"</head><body><table><tr><td><div class='TGT0'></div></td><td><a class='bt g' href='/L0?v=1'>ON</a></td>"
"<td><a class='bt r' href='/L0?v=0'>OFF</a></td></tr><tr><td><div class='TGT2'></div></td><td>"
"<a class='bt g' href='/L2?v=1'>ON</a></td><td><a class='bt r' href='/L2?v=0'>OFF</a></td></tr>"
"<tr><td>&nbsp;</td><td><a class='bt g a' href='/ALL?v=1'><br/>ALL ON</a></td><td>"
"<a class='bt r a' href='/ALL?v=0'><br/>ALL OFF</a></td></tr></body></html>";
const byte DNS_PORT = 53;
IPAddress apIP(192, 168, 1, 1);
IPAddress netMsk(255, 255, 255, 0);
DNSServer dnsServer;
ESP8266WebServer server(80);
void setup() {
pinMode(0, OUTPUT);
pinMode(2, OUTPUT);
digitalWrite(2, LEDstate[0]);
digitalWrite(2, LEDstate[2]);
Serial.begin(115200);
Serial.setDebugOutput(true);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, netMsk);
WiFi.softAP(ssid);
Serial.print("SSID: ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.softAPIP());
dnsServer.setErrorReplyCode(DNSReplyCode::NoError);
dnsServer.start(DNS_PORT, "*", apIP);
Serial.println("USP Server started");
server.on("/", handle_root);
server.on("/generate_204", handle_root); //Android captive portal
server.on("/L0", handle_L0);
server.on("/L2", handle_L2);
server.on("/ALL", handle_ALL);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
dnsServer.processNextRequest();
server.handleClient();
}
void handleNotFound() {
Serial.print("\t\t\t\t URI Not Found: ");
Serial.println(server.uri());
server.send ( 200, "text/plain", "URI Not Found" );
}
void handle_root() {
Serial.println("Page served");
String toSend = html;
toSend.replace("TGT0", LEDstate[0] ? "y" : "b");
toSend.replace("TGT2", LEDstate[2] ? "y" : "b");
server.send(200, "text/html", toSend);
delay(100);
}
void handle_L0() {
change_states(0);
handle_root();
}
void handle_L2() {
change_states(2);
handle_root();
}
void handle_ALL() {
change_states(0);
change_states(2);
handle_root();
}
void change_states(int tgt) {
if (server.hasArg("v")) {
int state = server.arg("v").toInt() == 1;
Serial.print("LED");
Serial.print(tgt);
Serial.print("=");
Serial.println(state);
LEDstate[tgt] = state ? HIGH : LOW;
digitalWrite(tgt, LEDstate[tgt]);
}
}

View File

@ -2,6 +2,9 @@
#include <lwip/def.h> #include <lwip/def.h>
#include <Arduino.h> #include <Arduino.h>
#define DEBUG
#define DEBUG_OUTPUT Serial
DNSServer::DNSServer() DNSServer::DNSServer()
{ {
_ttl = htonl(60); _ttl = htonl(60);
@ -110,16 +113,43 @@ void DNSServer::replyWithIP()
{ {
_dnsHeader->QR = DNS_QR_RESPONSE; _dnsHeader->QR = DNS_QR_RESPONSE;
_dnsHeader->ANCount = _dnsHeader->QDCount; _dnsHeader->ANCount = _dnsHeader->QDCount;
_dnsHeader->QDCount = 0; _dnsHeader->QDCount = _dnsHeader->QDCount;
//_dnsHeader->RA = 1;
_udp.beginPacket(_udp.remoteIP(), _udp.remotePort()); _udp.beginPacket(_udp.remoteIP(), _udp.remotePort());
_udp.write(_buffer, _currentPacketSize); _udp.write(_buffer, _currentPacketSize);
_udp.write((uint8_t)192); // answer name is a pointer
_udp.write((uint8_t)12); // pointer to offset at 0x00c
_udp.write((uint8_t)0); // 0x0001 answer is type A query (host address)
_udp.write((uint8_t)1);
_udp.write((uint8_t)0); //0x0001 answer is class IN (internet address)
_udp.write((uint8_t)1);
_udp.write((unsigned char*)&_ttl, 4); _udp.write((unsigned char*)&_ttl, 4);
// Length of RData is 4 bytes (because, in this case, RData is IPv4) // Length of RData is 4 bytes (because, in this case, RData is IPv4)
_udp.write((uint8_t)0); _udp.write((uint8_t)0);
_udp.write((uint8_t)4); _udp.write((uint8_t)4);
_udp.write(_resolvedIP, sizeof(_resolvedIP)); _udp.write(_resolvedIP, sizeof(_resolvedIP));
_udp.endPacket(); _udp.endPacket();
#ifdef DEBUG
DEBUG_OUTPUT.print("DNS responds: ");
DEBUG_OUTPUT.print(_resolvedIP[0]);
DEBUG_OUTPUT.print(".");
DEBUG_OUTPUT.print(_resolvedIP[1]);
DEBUG_OUTPUT.print(".");
DEBUG_OUTPUT.print(_resolvedIP[2]);
DEBUG_OUTPUT.print(".");
DEBUG_OUTPUT.print(_resolvedIP[3]);
DEBUG_OUTPUT.print(" for ");
DEBUG_OUTPUT.println(getDomainNameWithoutWwwPrefix());
#endif
} }
void DNSServer::replyWithCustomCode() void DNSServer::replyWithCustomCode()