Добавление авторизации к готовому коду на ESP8266 (ESP-01)
- Войдите на сайт для отправки комментариев
Есть готовый рабочий скетч, который позволяет удалённо Включить/Выключить ПК, а так же узнать состояние ПК (Включен ли он в данный момент или нет).
Реализовано всё на ESP-01, там как раз есть 2 GPIO пина для этих целей, всё работает отлично через web интерфейс. Вот только нужна Авторизация по Логину/Паролю для доступа на WEB интерфейс, а то так не безопасно, что любой сможет получить доступ на WEB интерфейс ESP-01, будет сделан проброс на роутере и привязка к Домену (что уже успешно протестировано).
Помогите пожалуйста, как добавить к готовому коду возможность простой Авторизации по Логину/Паролю прямо в скетч? Возможность менять Логин/Пароль на WEB интерфейсе мне ненужна, хочу один раз просто задать их в скетче и всё.
Для понимания вот готовый скетч:
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> // Параметры подключения к точке доступа Wi-Fi const char* ssid = "test"; //Вводим свой SSID (Wi-Fi) const char* password = "test"; //Вводим пароль от Wi-Fi //Если нужен Статический IP адрес, тогда раскомментировать эти строки, так же ещё в двух местах раскоментировать ниже в коде //IPAddress ip(192, 168, 1, 12); //Статический IP-адрес, меняем на свой //IPAddress gateway(192, 168, 1, 1); //IP-адрес роутера, меняем на свой //IPAddress subnet(255, 255, 255, 0); ESP8266WebServer server(80); //Стандартный порт 80 (Web морда) //Таймер для переподключения к Wi-Fi long previousMillis = 0; unsigned long currentMillis; const long interval_wifi_searsh = 120000; int pwr_sw = 0; // GPIO0 (Нога для управления компьютером, Вкл./Выкл. PC) int pwr_led = 2; // GPIO2 (LED индикатор на кнопке Power для определения состояния PC) // Набор переменных для Web интерфейса String webPage, pageTop, webPcState_on, webPcState_off, webControl_on, webControl_off, EndBlock; void setup() { pinMode(pwr_sw, OUTPUT); //Назначаем pin управления Транзистором Вкл./Выкл. как ВЫХОД pinMode(pwr_led, INPUT); //Назначаем pin отслеживания состояния LED как ВХОД digitalWrite(pwr_sw, LOW); //Устанавливаем низкое значение на выходе Транзистора //Инициализация server.onNotFound(handleNotFound); server.begin(); //Присваиваем элементы HTML к Переменным для отображения Web Интерфейса pageTop = "<!DOCTYPE html><title>Панель Управления</title><head><meta charset='UTF-8'><meta name=\"viewport\" content=\"width=device-width\"></head><body><h1>Управление PC</h1><table style=\"text-align: left; height: 222px; width: 324px;\" border=\"1\" cellpadding=\"2\" cellspacing=\"2\"><tbody><tr><td style=\"font-size: 17pt; text-align: center; width: 80px;\">Состояние PC</td>"; webPcState_on = "<td style=\"font-size: 20pt; text-align: center; background-color: green; width: 135px;\">ON</td></tr>"; webPcState_off = "<td style=\"font-size: 20pt; text-align: center; background-color: red; width: 135px;\">OFF</td></tr>"; webControl_on = "<tr><td style=\"font-size: 20pt; text-align: center; width: 60px;\">Система</td><td style=\"text-align: center; width: 140px;\"><a href=\"on\"><button style=\"font-size: 20pt;\">Вкл.</button></a> <a href=\"off\"><button disabled style=\"font-size: 20pt;\">Выкл.</button></a></td></tr>"; webControl_off = "<tr><td style=\"font-size: 20pt; text-align: center; width: 60px;\">Система</td><td style=\"text-align: center; width: 140px;\"><a href=\"on\"><button disabled style=\"font-size: 20pt;\">Вкл.</button></a> <a href=\"off\"><button style=\"font-size: 20pt;\">Выкл.</button></a></td></tr>"; EndBlock = "</tbody></table></body></html>"; //Стартовая страница с информацией о состоянии server.on("/", []() { //Если введён ip адрес, тогда отображаем только состояние PC if (digitalRead(pwr_led) == LOW) { webPage = pageTop + webPcState_off + EndBlock; } else if (digitalRead(pwr_led) == HIGH) { webPage = pageTop + webPcState_on + EndBlock; } server.send(200, "text/html", webPage); }); //Страница Управления питанием PC server.on("/control", []() { //Если к ip адресу добавить "/control", тогда откроется панель управления + состояние PC if (digitalRead(pwr_led) == LOW) { webPage = pageTop + webPcState_off + webControl_on + EndBlock; } else if (digitalRead(pwr_led) == HIGH) { webPage = pageTop + webPcState_on + webControl_off + EndBlock; } server.send(200, "text/html", webPage); }); //Отдельная команда к ip адресу для Вкл. PC server.on("/on", []() { if (digitalRead(pwr_led) == LOW) { pc(); } server.send(200, "text/html", webPage); }); //Отдельная команда к ip адресу для Выкл. PC server.on("/off", []() { if (digitalRead(pwr_led) == HIGH) { pc(); } server.send(200, "text/html", webPage); }); //Отдельная команда к ip адресу для Принудительного выключения PC в случае его зависания (исключена из WEB Интерфейса, что бы нечаянно не нажать) server.on("/hard", []() { if (digitalRead(pwr_led) == HIGH) { pc_hard(); } server.send(200, "text/html", webPage); }); //Режим Wi-Fi WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); //Если нужен Статический IP адрес, тогда раскомментировать строку ниже // WiFi.config(ip, gateway, subnet); // Ожидание соединения if (WiFi.status() != WL_CONNECTED) { //Ожидаем соединения for (int i = 0; i <= 16; i++) { delay(200); } } } void loop() { currentMillis = millis(); //Запускаем таймер server.handleClient(); if (WiFi.status() != WL_CONNECTED) //Проверяем статус Wi-Fi, если не подключены, тогда делаем переподключение { if (currentMillis - previousMillis > interval_wifi_searsh) { WIFI_Connect(); previousMillis = currentMillis; } } } void WIFI_Connect() //Функция подключения к Wi-Fi { WiFi.disconnect(); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); //Если нужен Статический IP адрес, тогда раскомментировать строку ниже // WiFi.config(ip, gateway, subnet); // Ожидание соединения... if (WiFi.status() != WL_CONNECTED) { for (int i = 0; i <= 12; i++) { delay(100); } } } void pc () { //Функция Вкл. транзистора на пол секунды (имитация нажатия кнопки Power на PC) digitalWrite(pwr_sw, HIGH); delay(500); digitalWrite(pwr_sw, LOW); } void pc_hard () { //Функция принудительного Выкл. PC. Необходима для принудительной перезагрузки PC в случае его зависания! digitalWrite(pwr_sw, HIGH); delay(4010); digitalWrite(pwr_sw, LOW); } void handleNotFound() { //Функция вывода Несуществующий страницы, если введён неверный адрес String message = "File Not Found!\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i = 0; i < server.args(); i++) { message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); }
Выставлять esp-01 лицом наружу это в любом случае плохая идея. Тебе ее просто боты будут регулярно опрокидывать.
Проект рабочий. У меня есть так же постоянно работающий Сервер на Линуксе, у меня есть просто своё облако с SSL защитой и много что ещё там крутится. Идея приходила что бы делать авторизацию через него с помощью Apache2, как то так себе это представлял: завести статическую старничку с авторизацией по SSL + защиту от перебора паролей потом сделать и если авторизация прошла успешна на стороне сервера под Linux'ом, тогда перенаправить на страничку с ESP-01 для управления.
Или может есть какие идеи ещё ?
Напиши нормальное веб-приложение на нормальном сервере и настрой легковесную связь между сервером и контроллером.
Решил всё же сделать простую Авторизацию + в последний момент вспомнил, что по проводу очень не удобно перепрошивать микроконтроллер, если он спрятан внутри ПК (в моём случае он внутри ноутбука), поэтому добавил возможность Обновления прошивки по Воздуху. Так как мой ноут не поддерживает технологию Wake-on-Line и была придумана эта система Управления PC на ESP-01.
Код далеко не идеален, но работает очень хорошо и стабильно, вероятно кому то тоже захочется сделать такой проект, поэтому оставлю последнюю проверенную версию Скетча ниже, схему подключения так же добавил:
Скетч:
Полностью переделал программную часть, не затрагивая схему. Выложу сюда, что бы не потерялось, может пригодится так же кому. В архиве есть всё, что нужно для повторения.
За время использования никаких проблем не было, включая брутфорса.