• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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);

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