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

Решено Web сервер - ! нужна авторизация

Alex1

New member
Здравствуйте друзья. Я только начал осваивать программирование возникли сложности. Есть модуль управления реле через вэб, но хотелось бы добавить логин и пароль на вход на веб страницу.
Есть 2 скетча, оба работают без проблем, но совместить у меня не выходит.
Тот что на авторизацию - пароль и логин 000000 и 000000, меняется только програмно, но меня устраивает, хотя бы так. Образцов построения авторизации на ардуино и 8266 в нете не так уж и много, точнее Я нашёл один, тот что ниже, так что методом научного тыка разобраться мне не удалось. Спасибо заранее, кто поможет.

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

MDNSResponder mdns;

// Wi-Fi
const char* ssid = "****************************";
const char* password = "*************************";

byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192,168,1,170);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

ESP8266WebServer server(80);

int D0_pin = 16;

void setup(void){
  // preparing GPIOs
  pinMode(D0_pin, OUTPUT);
  digitalWrite(D0_pin, LOW);

  delay(100);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
 
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
 
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
 
  server.on("/", [](){
    server.send(200, "text/html", webPage());
  });
  server.on("/socket1On", [](){
    digitalWrite(D0_pin, HIGH);
    server.send(200, "text/html", webPage());
    delay(100);
 
  });
  server.on("/socket1Off", [](){
    digitalWrite(D0_pin, LOW);
    server.send(200, "text/html", webPage());
    delay(100);
 
 
  });
  server.begin();
  Serial.println("HTTP server started");
}
void loop(void){
  server.handleClient();
}

String webPage()
{
  String web;
  web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>ESP 8266</title><style>button{color:red;padding: 10px 27px;}</style></head>";
  web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ESP8266 Web Server</h1><div>";
  //++++++++++ LED-1  +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----LED 1----</p>";
  if (digitalRead(D0_pin) == 1)
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
  }
  else
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
  }
  web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></div>";
  // ++++++++ LED-1 +++++++++++++

 
  // ========REFRESH=============
  web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">REFRESH</button></a></div>";
  // ========REFRESH=============
 
 
  web += "</div>";
  return(web);
}

Код авторизации
Код:
// Авторизация на Web сервере микроконтроллера   https://it4it.club/topic/13-%D0%B0%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BD%D0%B0-web-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5-%D0%BC%D0%B8%D0%BA%D1%80%D0%BE%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D0%BB%D0%B5%D1%80%D0%B0/    //





void loop() {
  WiFiClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString += c;
        if (c == '\n' && currentLineIsBlank) {
          if (readString.lastIndexOf(F("Authorization: Basic MDAwMDAwOjAwMDAwMA=="))>-1) {    // MDAwMDAwOjAwMDAwMA==  0000 0000 http://base64.ru/ через разделитель двоеточие ":" //
            if (readString.lastIndexOf(F("GET /favicon.ico"))>-1) {
              client.println(F("HTTP/1.0 404 Not Found"));
            }
            else {
              client.println(F("HTTP/1.0 200 OK"));
              client.println(F("Content-Type: text/html"));
              client.println(F("Pragma: no-cache\r\nRefresh: 30\r\n"));
              client.println(F("<html><head><meta charset=UTF-8\"><title>Arduino - iT4iT.CLUB</title>"));
              client.println(F("<style>body,table,tr,td{font-style:normal;font-family:verdana;font-size:11px;}body{background-color:#FFEBD5;}</style></head><body>"));
              client.print(F("Arduino on <a href=\"https://it4it.club\">iT4iT.CLUB</a>"));
              client.println(F("</body></html>"));
            }
          }
          else {
            client.println(F("HTTP/1.0 401 Unauthorized"));
            client.println(F("WWW-Authenticate: Basic realm=\"Arduino - iT4iT.CLUB\""));
          }
          break;
        }

        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(30);

    readString = "";
    client.stop();
  }
}
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Судя по коду у вас должно что то возвращаться в http, или не возвращаться совсем. К сожалению никакой диагностики вы не приводите, поэтому совет простой - натыкайте сообщений в код типа client.println(F("sting 16 is go")); и по ним уже определяйте чего и как у вас отрабатывает.
 

Alex1

New member
Судя по коду у вас должно что то возвращаться в http, или не возвращаться совсем. К сожалению никакой диагностики вы не приводите, поэтому совет простой - натыкайте сообщений в код типа client.println(F("sting 16 is go")); и по ним уже определяйте чего и как у вас отрабатывает.
Авторизация получается нормально, без основного кода, но только как я пытаюсь вставить этот код в свой, не компилируется, пишет разные ошибки в строках, тонкостей не понимаю пока, где не состыковки
 

Andy Korg

Moderator
Команда форума
...пишет разные ошибки в строках
Хотел прочитать список ошибок, но не смог пробиться через ментальное поле - сегодня большие помехи для телепатических связей. Шутка :)
Нужен список ошибок компиляции, что бы что то советовать.
 

Alex1

New member
Хотел прочитать список ошибок, но не смог пробиться через ментальное поле - сегодня большие помехи для телепатических связей. Шутка :)
Нужен список ошибок компиляции, что бы что то советовать.
'webPage' was not declared in this scope - на строке server.send(200, "text/html", webPage());
Код авторизации был взят из проекта Ethernet модуля на чипе W5100, а с другой стороны причём тут способ подключения по воздуху или по кабелю или не так?

Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <SPI.h>

MDNSResponder mdns;
// Wi-Fi
const char* ssid = "*******";
const char* password = "******";
byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(192,168,1,170);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server(80);

String readString;         // Буфер для данных от пользователя Web сервера/*

int D0_pin = 16;
void setup(void){
  // preparing GPIOs
  pinMode(D0_pin, OUTPUT);
  digitalWrite(D0_pin, LOW);
  delay(100);
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  WiFi.config(ip, gateway, subnet);
  Serial.println("");
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
   Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  if (mdns.begin("esp8266", WiFi.localIP())) {
    Serial.println("MDNS responder started");
  }
  server.on("/", [](){
    server.send(200, "text/html", webPage());
  });
  server.on("/socket1On", [](){
    digitalWrite(D0_pin, HIGH);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  server.on("/socket1Off", [](){
    digitalWrite(D0_pin, LOW);
    server.send(200, "text/html", webPage());
    delay(100);
  });
  server.begin();
  Serial.println("HTTP server started");
}
void loop(void){
 
WiFiClient client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readString += c;
        if (c == '\n' && currentLineIsBlank) {
          if (readString.lastIndexOf(F("Authorization: Basic MDAwMDAwOjAwMDAwMA=="))>-1) {    // MDAwMDAwOjAwMDAwMA==  0000 0000 http://base64.ru/ через разделитель двоеточие ":" //
            if (readString.lastIndexOf(F("GET /favicon.ico"))>-1) {
              client.println(F("HTTP/1.0 404 Not Found"));
            }
            else {
              client.println(F("HTTP/1.0 200 OK"));
              client.println(F("Content-Type: text/html"));
              client.println(F("Pragma: no-cache\r\nRefresh: 30\r\n"));
              client.println(F("<html><head><meta charset=UTF-8\"><title>Arduino - iT4iT.CLUB</title>"));
              client.println(F("<style>body,table,tr,td{font-style:normal;font-family:verdana;font-size:11px;}body{background-color:#FFEBD5;}</style></head><body>"));
              client.print(F("Arduino on <a href=\"https://it4it.club\">iT4iT.CLUB</a>"));
              client.println(F("</body></html>"));
            }
          }
          else {
            client.println(F("HTTP/1.0 401 Unauthorized"));
            client.println(F("WWW-Authenticate: Basic realm=\"Arduino - iT4iT.CLUB\""));
          }
          break;
        }

        if (c == '\n') {
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          currentLineIsBlank = false;
        }
      }
    }
    delay(30);

    readString = "";
    client.stop();
  }
}
  server.handleClient();
}
String webPage()
{
  String web;
  web += "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/> <meta charset=\"utf-8\"><title>ESP 8266</title><style>button{color:red;padding: 10px 27px;}</style></head>";
  web += "<h1 style=\"text-align: center;font-family: Open sans;font-weight: 100;font-size: 20px;\">ESP8266 Web Server</h1><div>";
  //++++++++++ LED-1  +++++++++++++
  web += "<p style=\"text-align: center;margin-top: 0px;margin-bottom: 5px;\">----LED 1----</p>";
  if (digitalRead(D0_pin) == 1)
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #43a209;margin: 0 auto;\">ON</div>";
  }
  else
  {
    web += "<div style=\"text-align: center;width: 98px;color:white ;padding: 10px 30px;background-color: #ec1212;margin: 0 auto;\">OFF</div>";
  }
  web += "<div style=\"text-align: center;margin: 5px 0px;\"> <a href=\"socket1On\"><button>ON</button></a>&nbsp;<a href=\"socket1Off\"><button>OFF</button></a></div>";
  // ++++++++ LED-1 +++++++++++++
  // ========REFRESH=============
  web += "<div style=\"text-align:center;margin-top: 20px;\"><a href=\"/\"><button style=\"width:158px;\">REFRESH</button></a></div>";
  // ========REFRESH=============
  web += "</div>";
  return(web);
}
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
'webPage' was not declared in this scope - на строке server.send(200, "text/html", webPage());
Компилятор не может найти функцию webPage(), в то же время описание этой функции есть ниже в файле. Следовательно либо надо перенести описание этой функции выше строк в которых используется функция, либо объявить прототип функции webPage() вначале файла.
 

Alex1

New member
Проверьте скобки в Loop
у вас:
} - здесь loop закончился
server.handleClient(); ----- это уже за пределами loop
} ------ и это тоже
'class ESP8266WebServer' has no member named 'available' ....следующая ошибка на строке... WiFiClient client = server.available();
Переместил сюда, правильно?
}
delay(30);
readString = "";
client.stop();
server.handleClient();
}
 
Последнее редактирование:

kab

New member
@Alex1
Вопрос еще актуален? Недавно я аналогично доработал свой скетч аутентификацией существенно более простым способом. Если интересно - могу подробнее.
 

Alex1

New member
@Alex1
Вопрос еще актуален? Недавно я аналогично доработал свой скетч аутентификацией существенно более простым способом. Если интересно - могу подробнее.
Да конечно, Я не могу понять как после примера со входом *Login OK* перейти на основной код, а уроков в сети Я не нашёл к сожалению
 

Alex1

New member
Подскажите после появления Login OK, от этого примера, какая ключевая команда для перехода на мою основную программу


#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>

const char* ssid = "*************";
const char* password = "***************";

ESP8266WebServer server(80);

const char* www_username = "0000";
const char* www_password = "0000";

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if(WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("WiFi Connect Failed! Rebooting...");
delay(1000);
ESP.restart();
}
ArduinoOTA.begin();

server.on("/", [](){
if(!server.authenticate(www_username, www_password))
return server.requestAuthentication();
server.send(200, "text/plain", "Login OK");
});
server.begin();

Serial.print("Open http://");
Serial.print(WiFi.localIP());
Serial.println("/ in your browser to see it working");
}

void loop() {
ArduinoOTA.handle();
server.handleClient();
}


Код:
 #include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ticker.h>  // Мигание по вн. таймеру
Ticker blinker;
#define ONE_WIRE_BUS 2 /// GPIO02  НА ПЛАТЕ 201
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//const char *ssid = "Access Point home1";  // как точка доступа
//const char *password = "12344321";        // как точка доступа
const char *ssid = ***********        //  как клиент
const char *password = ***********      //  как клиент

  byte arduino_mac[] = { 0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
  IPAddress ip(192, 168, 1, 100);
  IPAddress gateway(192, 168, 1, 1);
  IPAddress subnet(255, 255, 255, 0);
  ESP8266WebServer server(80);
  MDNSResponder mdns;

  int vcc;
  ADC_MODE(ADC_VCC);
 
  int ledPin = 0;         // LED pin GPIO00 НА ПЛАТЕ 201.
  uint8_t ledStatus = 0;
  int counter = 0; 

  const int buzzerPin = 10; // GPIO 010   D3 - на плате 201)
  int led1 = 13;
  int stateLED1 = LOW;
  int led2 = 12;
  int stateLED2 = LOW;
  int led3 = 14;
  int stateLED3 = LOW;
  int led4 = 5;
  int stateLED4 = LOW;

  int D5_pin = 16;  // GPIO 16 XPD  - на плате 201 rezerv
  int key1=0;
  int D6_pin = 4;  // GPIO 04
  int key2=0;
//R  int D7_pin = 15;  // GPIO 15
//R  int key3=0;

void handleRoot()
{
    response();
   
   sensors.requestTemperatures();
  
    //******************** //Звук отработки  команды  - обновить F5
  tone(buzzerPin, 1000);
  delay(100);
  tone(buzzerPin, 1200);
  delay(200);
  noTone(buzzerPin);
  //********************
}
////////////////////////////////
void handleLed1On() {
  stateLED1 = HIGH;
  digitalWrite(led1, stateLED1);
//******************** //Звук отработки  команд кнопка ON
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 700);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed1Off() {
  stateLED1 = LOW;
  digitalWrite(led1, stateLED1);
  //******************** //Звук отработки  команд кнопка OFF
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 500);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
////////////////////////////////
}
void handleLed2On() {
  stateLED2 = HIGH;
  digitalWrite(led2, stateLED2);
  //******************** //Звук отработки  команд кнопка ON
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 700);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed2Off() {
  stateLED2 = LOW;
  digitalWrite(led2, stateLED2);
  //******************** //Звук отработки  команд кнопка OFF
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 500);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed3On() {
  stateLED3 = HIGH;
  digitalWrite(led3, stateLED3);
  //******************** //Звук отработки  команд кнопка ON
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 700);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed3Off() {
  stateLED3 = LOW;
  digitalWrite(led3, stateLED3);
  //******************** //Звук отработки  команд кнопка OFF
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 500);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed4On() {
  stateLED4 = HIGH;
  digitalWrite(led4, stateLED4);
  //******************** //Звук отработки  команд кнопка ON
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 700);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
void handleLed4Off() {
  stateLED4 = LOW;
  digitalWrite(led4, stateLED4);
  //******************** //Звук отработки  команд кнопка OFF
  tone(buzzerPin, 400);
  delay(80);
  tone(buzzerPin, 600);
  delay(80);
  tone(buzzerPin, 500);
  delay(200);
  noTone(buzzerPin);
  //********************
  response();
}
 

Slacky

Member
@Alex1 в самом начале построения html страницы пишем что-то вроде

Код:
  if (wmConfig.fullSecurity) {
    if (!webServer.authenticate(wmConfig.webAdminLogin, wmConfig.webAdminPassword))
    return webServer.requestAuthentication();
  }
mvConfig - это уже мои прибабахи из конфига.

Ну и где-то после #include <>

поставить

ESP8266WebServer webServer(80);

Все это я спокойно нашел в примерах в сети.

Или Вы о чем?
 
Последнее редактирование:

kab

New member
@Alex1
попозже вечером я доберусь до домашнего компьютера, освежу в памяти, как я сделал это и отпишу. Пока могу сообщить, что в моем варианте в исходную программу добавляется существенно меньше строк и смысл добавок более ясный.

Arduino Ide у меня 1.8.3. Это на всякий случай...
 

Alex1

New member
@Alex1 в самом начале построения html страницы пишем что-то вроде

Код:
  if (wmConfig.fullSecurity) {
    if (!webServer.authenticate(wmConfig.webAdminLogin, wmConfig.webAdminPassword))
    return webServer.requestAuthentication();
  }

Ну и где-то после #include <>

поставить

ESP8266WebServer webServer(80);

Все это я спокойно нашел в примера в сети.

Или Вы о чем?
Здесь как то всё разбросано у вас. Для новичка собирать
mvConfig - это уже мои прибабахи из конфига.
это уж перебор, может ссылки на уроки есть какие. что б суть понять как это работает, а не пальцем в небо
 

Slacky

Member
@Alex1 это не пальцем в небо, это и есть пример.

if (wmConfig.fullSecurity) {

Если wmConfig.fullSecurity true, то нужна аутентификация. Это вообще можно убрать.

if (!webServer.authenticate(wmConfig.webAdminLogin, wmConfig.webAdminPassword))
return webServer.requestAuthentication();
}

wmConfig.webAdminLogin и wmConfig.webAdminPassword это соответственно логин и пароль, попавшие в конфиг ранее в программе.

А вот

if (!webServer.authenticate(ВашЛогин, ВашПароль))
return webServer.requestAuthentication();
}

и есть то, что Вам нужно ...
 

Slacky

Member
@Alex1 держите Вам пример из либ ардуиновских. Не понимаю, почему Вы сами туда не заглянули

Код:
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

const char* www_username = "admin";
const char* www_password = "esp8266";

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if(WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Connect Failed! Rebooting...");
    delay(1000);
    ESP.restart();
  }
  ArduinoOTA.begin();

  server.on("/", [](){
    if(!server.authenticate(www_username, www_password))
      return server.requestAuthentication();
    server.send(200, "text/plain", "Login OK");
  });
  server.begin();

  Serial.print("Open http://");
  Serial.print(WiFi.localIP());
  Serial.println("/ in your browser to see it working");
}

void loop() {
  ArduinoOTA.handle();
  server.handleClient();
}
 

Alex1

New member
@Alex1 это не пальцем в небо, это и есть пример.

if (wmConfig.fullSecurity) {

Если wmConfig.fullSecurity true, то нужна аутентификация. Это вообще можно убрать.

if (!webServer.authenticate(wmConfig.webAdminLogin, wmConfig.webAdminPassword))
return webServer.requestAuthentication();
}

wmConfig.webAdminLogin и wmConfig.webAdminPassword это соответственно логин и пароль, попавшие в конфиг ранее в программе.

А вот

if (!webServer.authenticate(ВашЛогин, ВашПароль))
return webServer.requestAuthentication();
}

и есть то, что Вам нужно ...
Мне не очень понятно без примера что куда вставлять, например сюда
Код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

const char *ssid = "arduino-er";
const char *password = "password";
int stateLED = LOW;

ESP8266WebServer server(80);

void handleRoot() {
    response();
}

void handleLedOn() {
  stateLED = LOW;
  digitalWrite(LED_BUILTIN, stateLED);
  response();
}

void handleLedOff() {
  stateLED = HIGH;
  digitalWrite(LED_BUILTIN, stateLED);
  response();
}

const String HtmlHtml = "<html><head>"
    "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" /></head>";
const String HtmlHtmlClose = "</html>";
const String HtmlTitle = "<h1>Arduino-er: ESP8266 AP WebServer exercise</h1><br/>\n";
const String HtmlLedStateLow = "<big>LED is now <b>ON</b></big><br/>\n";
const String HtmlLedStateHigh = "<big>LED is now <b>OFF</b></big><br/>\n";
const String HtmlButtons =
    "<a href=\"LEDOn\"><button style=\"display: block; width: 100%;\">ON</button></a><br/>"
    "<a href=\"LEDOff\"><button style=\"display: block; width: 100%;\">OFF</button></a><br/>";

void response(){
  String htmlRes = HtmlHtml + HtmlTitle;
  if(stateLED == LOW){
    htmlRes += HtmlLedStateLow;
  }else{
    htmlRes += HtmlLedStateHigh;
  }

  htmlRes += HtmlButtons;
  htmlRes += HtmlHtmlClose;

  server.send(200, "text/html", htmlRes);
}

void setup() {
    delay(1000);
    Serial.begin(9600);
    Serial.println();

    WiFi.softAP(ssid, password);

    IPAddress apip = WiFi.softAPIP();
    Serial.print("visit: \n");
    Serial.println(apip);
    server.on("/", handleRoot);
    server.on("/LEDOn", handleLedOn);
    server.on("/LEDOff", handleLedOff);
    server.begin();
    Serial.println("HTTP server beginned");
    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, stateLED);
}

void loop() {
    server.handleClient();
}
 

Alex1

New member
@Alex1 держите Вам пример из либ ардуиновских. Не понимаю, почему Вы сами туда не заглянули

Код:
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>

const char* ssid = "........";
const char* password = "........";

ESP8266WebServer server(80);

const char* www_username = "admin";
const char* www_password = "esp8266";

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  if(WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Connect Failed! Rebooting...");
    delay(1000);
    ESP.restart();
  }
  ArduinoOTA.begin();

  server.on("/", [](){
    if(!server.authenticate(www_username, www_password))
      return server.requestAuthentication();
    server.send(200, "text/plain", "Login OK");
  });
  server.begin();

  Serial.print("Open http://");
  Serial.print(WiFi.localIP());
  Serial.println("/ in your browser to see it working");
}

void loop() {
  ArduinoOTA.handle();
  server.handleClient();
}
Этот пример Я пробовал, но дальше как "Login OK" ничего не продолжалось
 

kab

New member
@Alex1

Всё существенней проще:
- берем первоначальный код из поста №1
- после каждой
Код:
  ", [](){
в общем, в начале каждой функции-обработчика (их у Вас вроде 3 штуки) надо вставить такие строки


Код:
     if(!server.authenticate("esp", "123"))
          {
            server.requestAuthentication();
            return;
          }
"esp" - логин -поставить свой

"123" - пароль -поставить свой

Вот всё!!!

ЗЫ. Возможно такой вариант тоже работает:
Код:
if(!server.authenticate(www_username, www_password))
      return server.requestAuthentication();
 
Последнее редактирование:
Сверху Снизу