• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Как организовать на ESP точку доступа в которой при вводе любого URL будет выводится своя страница?

Di_nax

New member
Вообще история такая, у себя в гаражах хочется сделать включение света (в будущем по таймеру) при помощи мобильного.
1. Организовать точку доступа, которая выводит простую HTML страничку на которой можно выбрать светильник который хочешь включить. (это я смог)
2. Сделать так чтобы набирая любой произвольный адрес (при подключении к этой точке доступа) я все равно попадал на свою страницу. Такое есть в маке когда просит послать СМС и у многих операторов ссобщение о нулевом балансе выходит вместо запрашиваемой странички.
Видел на youtube подобное решение, но там автор решил не выкладывать скетч, куда копать Я не знаю :-(

Вот скетч.
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>



// GPIO, куда подключено реле
int rele1 = 12;
int rele2 = 13;
bool PowerRele1 = false;
bool PowerRele2 = false;


// параметры вашей WiFi сети. (Те что всегда вводите на тел. и планшете)
const char* ssid = "GKUDACHASVET";
const char* ip = "192,168,0,33";


ESP8266WebServer server(80);

void setup() {
pinMode(rele1 , OUTPUT);
digitalWrite(rele1 , PowerRele1);
pinMode(rele2 , OUTPUT);
digitalWrite(rele2 , PowerRele2);

// Подлючение к WiFi
IPAddress apIP(192,168,0,33);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP,apIP,IPAddress(255,255,255,0));
WiFi.softAP(ssid);
Serial.begin(115200);
Serial.println();
Serial.print("IP address: ");
Serial.println(apIP);
//if(WiFi.waitForConnectResult() == WL_CONNECTED){

// Запускаем сервер
//MDNS.begin(host);
server.on ( "/", HTTP_handleRoot );
server.onNotFound ( HTTP_handleRoot );
server.begin();
}
// }
void loop() {
server.handleClient();
delay(50);
}


void HTTP_handleRoot(void) {
bool statrele1 = false;
bool statrele2 = false;
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
Serial.println("HTTP server started");

// Реле 1
if( server.hasArg("statrele1") ){
if( strncmp(server.arg("statrele1").c_str(),"1",1) == 0 )
statrele1 = true;
}
else {
statrele1 = PowerRele1;
}

// Реле 2
if( server.hasArg("statrele2") ){
if( strncmp(server.arg("statrele2").c_str(),"1",1) == 0 )
statrele2 = true;
}
else {
statrele2 = PowerRele2;
}
// Формируем ШТМЛ страницу
String out = "";

out =
"<html>\
<head>\
<meta charset=\"utf-8\" />\
<title>УПРАВЛЕНИЕ ОСВЕЩЕНИЕМ :)</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>ВЫ НАХОДИТЕСЬ НА ТЕРРИТОРИИ ГК №9 УДАЧА</h1>\
";

// Для реле 1
if( statrele1 ){
out+="\
<h1>СВЕТИЛЬНИК №1 ВКЛЮЧЕН!</h1> <hr width=200 size=50 align=centre color=yellow><h2><a href=\"/?statrele1=0\">ВЫКЛЮЧИТЬ</a></h2>\
";
}
else {
out+="\
<hr width=200 size=50 align=centre color=green><h2><a href=\"/?statrele1=1\">ВКЛЮЧИТЬ</a></h2>\
";
}

// Для реле 2
if( statrele2 ){
out+="\
<h1>СВЕТИЛЬНИК №2 ВКЛЮЧЕН</h1><hr width=200 size=50 align=centre color=yellow><h2><a href=\"/?statrele2=0\">ВЫКЛЮЧИТЬ</a></h2>\
";
}
else {
out+="\
<hr width=200 size=50 align=centre color=grey><h2><a href=\"/?statrele2=1\">ВКЛЮЧИТЬ</a></h2>\
";
}

// Общее
out+= "\
</body>\
</html>";
server.send ( 200, "text/html", out );


// Для реле 1
if( statrele1 != PowerRele1 ){
PowerRele1 = statrele1;
digitalWrite(rele1 , PowerRele1);

}
// Для реле 2
if( statrele2 != PowerRele2 ){
PowerRele2 = statrele2;
digitalWrite(rele2 , PowerRele2);

}

// Скобку оставить!
}
 

Di_nax

New member
Ой все нашел...
библиотечку взял тутESP8266 Captive Portal - Hackster.io
Если кому надо вот скетч, Наверное он сырой, но мне хватит :)

/*
Captive Portal by: M. Ray Burnette 20150831
See Notes tab for original code references and compile requirements
Sketch uses 300,640 bytes (69%) of program storage space. Maximum is 434,160 bytes.
Global variables use 50,732 bytes (61%) of dynamic memory, leaving 31,336 bytes for local variables. Maximum is 81,920 bytes.
*/

#include <ESP8266WiFi.h>
#include "./DNSServer.h" // Patched lib
#include <ESP8266WebServer.h>
#include <WiFiClient.h>

// GPIO, куда подключено реле
int rele1 = 12;
int rele2 = 13;
bool PowerRele1 = false;
bool PowerRele2 = false;

const byte DNS_PORT = 53; // Capture DNS requests on port 53
IPAddress apIP(10, 10, 10, 1); // Private network for server
DNSServer dnsServer; // Create the DNS object
ESP8266WebServer webServer(80); // HTTP server

String responseHTML = ""
"<!DOCTYPE html><html><head><title>CaptivePortal</title></head><body>"
"<h1>Hello World!</h1><p>This is a captive portal example. All requests will "
"be redirected here.</p></body></html>";


void setup() {
pinMode(rele1 , OUTPUT);
digitalWrite(rele1 , PowerRele1);
pinMode(rele2 , OUTPUT);
digitalWrite(rele2 , PowerRele2);
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
WiFi.softAP("7_7_7_test");

// 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( HTTP_handleRoot );
//webServer.onNotFound([]() {
// webServer.send(200, "text/html", responseHTML);
//});
webServer.begin();
}

void loop() {
dnsServer.processNextRequest();
webServer.handleClient();}
void HTTP_handleRoot(void){
bool statrele1 = false;
bool statrele2 = false;

// Реле 1
if( webServer.hasArg("statrele1") ){
if( strncmp(webServer.arg("statrele1").c_str(),"1",1) == 0 )
statrele1 = true;
}
else {
statrele1 = PowerRele1;
}

// Реле 2
if( webServer.hasArg("statrele2") ){
if( strncmp(webServer.arg("statrele2").c_str(),"1",1) == 0 )
statrele2 = true;
}
else {
statrele2 = PowerRele2;
}
// Формируем ШТМЛ страницу
String out = "";

out =
"<html>\
<head>\
<meta charset=\"utf-8\" />\
<title>УПРАВЛЕНИЕ ОСВЕЩЕНИЕМ :)</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1>ВЫ НАХОДИТЕСЬ НА ТЕРРИТОРИИ ГК №9 УДАЧА</h1>\
";

// Для реле 1
if( statrele1 ){
out+="\
<h1>СВЕТИЛЬНИК №1 ВКЛЮЧЕН!</h1> <hr width=200 size=50 align=centre color=yellow><h2><a href=\"/?statrele1=0\">ВЫКЛЮЧИТЬ</a></h2>\
";
}
else {
out+="\
<hr width=200 size=50 align=centre color=green><h2><a href=\"/?statrele1=1\">ВКЛЮЧИТЬ</a></h2>\
";
}

// Для реле 2
if( statrele2 ){
out+="\
<h1>СВЕТИЛЬНИК №2 ВКЛЮЧЕН</h1><hr width=200 size=50 align=centre color=yellow><h2><a href=\"/?statrele2=0\">ВЫКЛЮЧИТЬ</a></h2>\
";
}
else {
out+="\
<hr width=200 size=50 align=centre color=grey><h2><a href=\"/?statrele2=1\">ВКЛЮЧИТЬ</a></h2>\
";
}

// Общее
out+= "\
</body>\
</html>";
webServer.send ( 200, "text/html", out );


// Для реле 1
if( statrele1 != PowerRele1 ){
PowerRele1 = statrele1;
digitalWrite(rele1 , PowerRele1);

}
// Для реле 2
if( statrele2 != PowerRele2 ){
PowerRele2 = statrele2;
digitalWrite(rele2 , PowerRele2);

}
}
 
Сверху Снизу