Всем доброго времени суток! Имею Mega2560 и Ethernet shield enc28j60, был рабочий код на библиотеках "etherShield.h" и "ETHER_28J60.h", в силу надобности авторизации для доступа из интернета перешел на библиотеку <UIPEthernet.h>. Пытаюсь перенести старый код на новую либу, но не могу разобраться как обрабатывать нажатия кнопок в браузере. Старый рабочий код: Код (C++): #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #include "etherShield.h" #include "ETHER_28J60.h" LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); static uint8_t mac[6] = {0x52, 0x55, 0x58, 0x11, 0x22, 0x29}; // this just needs to be unique for your network, static uint8_t ip[4] = {192, 168, 0, 109}; // the IP address for your board. Check your home hub static uint16_t port = 80; // Use port 80 - the standard for HTTP ETHER_28J60 ethernet; int brightness = 3; int a = 255; void setup() { pinMode(40, OUTPUT); // realy pinMode(brightness, OUTPUT); // lcd brightness pinMode(13, OUTPUT); //requests vizualization ethernet.setup(mac, ip, port); lcd.begin(20,4); analogWrite(brightness, a); digitalWrite(40, HIGH); } void loop() { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print("bT1="); lcd.setCursor(4,0); lcd.print(sensors.getTempCByIndex(0)); lcd.setCursor(11,0); lcd.print("bT2="); lcd.setCursor(15,0); lcd.print(sensors.getTempCByIndex(2)); lcd.setCursor(0,1); lcd.print("pT1="); lcd.setCursor(4,1); lcd.print(sensors.getTempCByIndex(3)); lcd.setCursor(11,1); lcd.print("pT2="); lcd.setCursor(15,1); lcd.print(sensors.getTempCByIndex(1)); if (digitalRead (40) == LOW) {lcd.setCursor(0,3); lcd.print("Realy is ON ");} else {lcd.setCursor(0,3); lcd.print("Realy is OFF"); } char* params; if (params = ethernet.serviceRequest()) { digitalWrite(13, HIGH); ethernet.print("<H2>Температура датчика 1 на плате = "); ethernet.print(sensors.getTempCByIndex(0)); ethernet.print("C°"); ethernet.print("<br><H2>Температура датчика 2 на плате = "); ethernet.print(sensors.getTempCByIndex(2)); ethernet.print("C°"); ethernet.print("<br><H2>Температура внешнего датчика 1 = "); ethernet.print(sensors.getTempCByIndex(3)); ethernet.print("C°"); ethernet.print("<br><H2>Температура внешнего датчика 2 = "); ethernet.print(sensors.getTempCByIndex(1)); ethernet.print("C°"); ethernet.print("<br>"); ethernet.print("<br>"); ethernet.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>"); ethernet.print("<br>"); ethernet.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>"); if (strcmp(params, "rel=on") == 0) {digitalWrite(40, LOW); } if (strcmp(params, "rel=off") == 0) {digitalWrite(40, HIGH); } ethernet.print("<br>"); ethernet.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>"); ethernet.print("<br>"); ethernet.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>"); ethernet.print("<br>"); ethernet.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>"); ethernet.print("<br>"); if (strcmp(params, "lcd=100") == 0) {analogWrite(brightness, 255); a = 255; } if (strcmp(params, "lcd=0") == 0) {analogWrite(brightness, 0); a = 0; } if (strcmp(params, "lcd=50") == 0) {analogWrite(brightness, 127); a = 127; } if (digitalRead (40) == LOW) {ethernet.print("<H1><br>Нагрузка включена");} else {ethernet.print("<H1><br>Нагрузка отключена");} ethernet.print("<br>"); if (a == 0) {ethernet.print("<br>Подсветка LCD отключена");} if (a == 127) {ethernet.print("<br>Подсветка LCD 50%");} if (a == 255) {ethernet.print("<br>Подсветка LCD включена");} ethernet.respond(); digitalWrite(13, LOW); } }
Новый код (закомментированы места, требующие вашей помощи): Код (C++): #include <SPI.h> #include <UIPEthernet.h> // Used for client #include <Base64.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> /* Настройки сети */ byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 }; IPAddress ip(192, 168, 0, 109); EthernetServer server(80); /* Переменные для авторизации через web */ String readString; // Буфер для данных от пользователя Web сервера String auth_hash; // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ=" char login[] = "admin"; // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM char password[] = "admin"; // Пароль по умолчанию. -/- /* SETUP */ LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int brightness = 3; int a = 255; void setup() { Serial.begin(9600); lcd.begin(20,4); analogWrite(brightness, a); pinMode(40, OUTPUT); digitalWrite(40, HIGH); pinMode(brightness, OUTPUT); auth_hash = auth_update(login, password); // Поднимаем сеть Ethernet.begin(mac, ip); server.begin(); Serial.println("started"); } /* LOOP */ void loop() { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print("bT1="); lcd.setCursor(4,0); lcd.print(sensors.getTempCByIndex(0)); lcd.setCursor(11,0); lcd.print("bT2="); lcd.setCursor(15,0); lcd.print(sensors.getTempCByIndex(2)); lcd.setCursor(0,1); lcd.print("pT1="); lcd.setCursor(4,1); lcd.print(sensors.getTempCByIndex(3)); lcd.setCursor(11,1); lcd.print("pT2="); lcd.setCursor(15,1); lcd.print(sensors.getTempCByIndex(1)); if (digitalRead (40) == LOW) {lcd.setCursor(0,3); lcd.print("Realy is ON ");} else {lcd.setCursor(0,3); lcd.print("Realy is OFF"); } EthernetClient client = server.available(); if (client) { boolean currentLineIsBlank = true; while (client.connected()) { if (client.available()) { char c = client.read(); Serial.println(c); readString += c; if (c == '\n' && currentLineIsBlank) { if (readString.lastIndexOf(auth_hash)>-1) { if (readString.lastIndexOf("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 Home Server</title>")); // char* params; // if (params = (client.connected()) client.print("<H2>Температура датчика 1 на плате = "); client.print(sensors.getTempCByIndex(0)); client.print("C°"); client.print("<br><H2>Температура датчика 2 на плате = "); client.print(sensors.getTempCByIndex(2)); client.print("C°"); client.print("<br><H2>Температура внешнего датчика 1 = "); client.print(sensors.getTempCByIndex(3)); client.print("C°"); client.print("<br><H2>Температура внешнего датчика 2 = "); client.print(sensors.getTempCByIndex(1)); client.print("C°"); client.print("<br>"); client.print("<br>"); client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>"); /* if (strcmp( "rel=on") == 0) {digitalWrite(40, LOW); } if (strcmp(params, "rel=off") == 0) {digitalWrite(40, HIGH); } */ client.print("<br>"); client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>"); client.print("<br>"); /* if (strcmp(params, "lcd=100") == 0) {analogWrite(brightness, 255); a = 255; } if (strcmp(params, "lcd=0") == 0) {analogWrite(brightness, 0); a = 0; } if (strcmp(params, "lcd=50") == 0) {analogWrite(brightness, 127); a = 127; } */ if (digitalRead (40) == LOW) {client.print("<H1><br>Нагрузка включена");} else {client.print("<H1><br>Нагрузка отключена");} client.print("<br>"); if (a == 0) {client.print("<br>Подсветка LCD отключена");} if (a == 127) {client.print("<br>Подсветка LCD 50%");} if (a == 255) {client.print("<br>Подсветка LCD включена");} client.println(F("</body></html>")); } } else { client.println(F("HTTP/1.0 401 Unauthorized")); client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\"")); } break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(10); readString = ""; client.stop(); } } /* Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим */ String auth_update(char login[], char password[]) { // Строка для будущего хэша String hash = strcat(strcat(login, ":"),password); int buf_size = hash.length()+1; char buf_char[buf_size]; // Переводим строку в char для дальнейшей обработки base64 hash.toCharArray(buf_char, buf_size); char encoded[base64_enc_len(buf_size-1)]; // Получаем хэш для авторизации base64_encode(encoded, buf_char, buf_size-1); // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST return "Authorization: Basic " + String(encoded); }
Кажеться разобрался, код теперь работает, но команды Код (C++): if (readString.lastIndexOf("rel=on")>-1) и Код (C++): if (readString.lastIndexOf("lcd=100")>-1) срабатывают только после второго нажатия в браузере, при том что остальные обрабатываються с первого, например Код (C++): if (readString.lastIndexOf("rel=off")>-1) { digitalWrite(40, HIGH); } if (readString.lastIndexOf("lcd=0")>-1) {analogWrite(brightness, 0); if (readString.lastIndexOf("lcd=50")>-1) {analogWrite(brightness, 127); В чем может быть причина?
Вот весь код: Код (C++): #include <SPI.h> #include <UIPEthernet.h> // Used for client #include <Base64.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> /* Настройки сети */ byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 }; IPAddress ip(192, 168, 0, 109); EthernetServer server(80); /* Переменные для авторизации через web */ boolean incoming = 0; String readString; // Буфер для данных от пользователя Web сервера String auth_hash; // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ=" char login[] = "admin"; // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM char password[] = "admin"; // Пароль по умолчанию. -/- /* SETUP */ LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int brightness = 3; int a = 255; void setup() { lcd.begin(20,4); lcd.setCursor(3,1); lcd.print("Starting UP..."); analogWrite(brightness, a); pinMode(40, OUTPUT); digitalWrite(40, HIGH); pinMode(brightness, OUTPUT); auth_hash = auth_update(login, password); // Поднимаем сеть Ethernet.begin(mac, ip); server.begin(); delay(450); lcd.clear(); Serial.print("started at ip "); Serial.print(Ethernet.localIP()); } /* LOOP */ void loop() { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print("bT1="); lcd.setCursor(4,0); lcd.print(sensors.getTempCByIndex(0)); lcd.setCursor(11,0); lcd.print("bT2="); lcd.setCursor(15,0); lcd.print(sensors.getTempCByIndex(2)); lcd.setCursor(0,1); lcd.print("pT1="); lcd.setCursor(4,1); lcd.print(sensors.getTempCByIndex(3)); lcd.setCursor(11,1); lcd.print("pT2="); lcd.setCursor(15,1); lcd.print(sensors.getTempCByIndex(1)); lcd.setCursor(0,2); lcd.print("ip is"); lcd.setCursor(6,2); lcd.print(Ethernet.localIP()); if (digitalRead (40) == LOW) {lcd.setCursor(0,3); lcd.print("Realy == ON ");} else {lcd.setCursor(0,3); lcd.print("Realy == OFF"); } EthernetClient 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(auth_hash)>-1) { if (readString.lastIndexOf("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 Home Server</title>")); client.print("<H2>Температура датчика 1 на плате = "); client.print(sensors.getTempCByIndex(0)); client.print("C°"); client.print("<br><H2>Температура датчика 2 на плате = "); client.print(sensors.getTempCByIndex(2)); client.print("C°"); client.print("<br><H2>Температура внешнего датчика 1 = "); client.print(sensors.getTempCByIndex(3)); client.print("C°"); client.print("<br><H2>Температура внешнего датчика 2 = "); client.print(sensors.getTempCByIndex(1)); client.print("C°"); client.print("<br>"); client.print("<br>"); client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>"); if (readString.lastIndexOf("rel=on")>-1) { digitalWrite(40, LOW); } if (readString.lastIndexOf("rel=off")>-1) { digitalWrite(40, HIGH); } client.print("<br>"); client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>"); client.print("<br>"); if (readString.lastIndexOf("lcd=100")>-1) {analogWrite(brightness, 255); a = 255; } if (readString.lastIndexOf("lcd=0")>-1) {analogWrite(brightness, 0); a = 0; } if (readString.lastIndexOf("lcd=50")>-1) {analogWrite(brightness, 127); a = 127; } if (digitalRead (40) == LOW) {client.print("<H1><br>Нагрузка включена");} else {client.print("<H1><br>Нагрузка отключена");} client.print("<br>"); if (a == 0) {client.print("<br>Подсветка LCD отключена");} if (a == 127) {client.print("<br>Подсветка LCD 50%");} if (a == 255) {client.print("<br>Подсветка LCD включена");} client.println(F("</body></html>")); } } else { client.println(F("HTTP/1.0 401 Unauthorized")); client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\"")); } break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(30); readString = ""; client.stop(); } } /* Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим */ String auth_update(char login[], char password[]) { // Строка для будущего хэша String hash = strcat(strcat(login, ":"),password); int buf_size = hash.length()+1; char buf_char[buf_size]; // Переводим строку в char для дальнейшей обработки base64 hash.toCharArray(buf_char, buf_size); char encoded[base64_enc_len(buf_size-1)]; // Получаем хэш для авторизации base64_encode(encoded, buf_char, buf_size-1); // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST return "Authorization: Basic " + String(encoded); }
Есть идея! Как сюда добавить переадресацию на главную страницу (192.168.0.109) после выполнения условия? Код (C++): if (readString.lastIndexOf("rel=on")>-1) { digitalWrite(40, LOW); }
Всем спасибо, разоблрался! =) Код (C++): #include <SPI.h> #include <UIPEthernet.h> // Used for client #include <Base64.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> /* Настройки сети */ byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x32 }; IPAddress ip(192, 168, 0, 109); EthernetServer server(80); /* Переменные для авторизации через web */ String readString; // Буфер для данных от пользователя Web сервера String auth_hash; // Тут храним полноценную строку авторизации, которую ожидаем от браузера в таком виде "Authorization: Basic bG9naW46cGFzc3dvcmQ=" char login[] = "admin"; // Логин по дефолту. В дальнейшем необходимо измененные данные авторизации в Web морде хранить в EPROM char password[] = "admin"; // Пароль по умолчанию. -/- /* SETUP */ LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); int brightness = 3; int a = 255; void setup() { lcd.begin(20,4); lcd.setCursor(3,0); lcd.print("Starting UP..."); analogWrite(brightness, a); pinMode(40, OUTPUT); digitalWrite(40, HIGH); pinMode(brightness, OUTPUT); auth_hash = auth_update(login, password); // Поднимаем сеть Ethernet.begin(mac, ip); server.begin(); lcd.setCursor(5,2); lcd.print("Local ip is"); lcd.setCursor(4,3); lcd.print(Ethernet.localIP()); delay(1200); lcd.clear(); } /* LOOP */ void loop() { sensors.requestTemperatures(); lcd.setCursor(0,0); lcd.print("bT1="); lcd.setCursor(4,0); lcd.print(sensors.getTempCByIndex(0)); lcd.setCursor(11,0); lcd.print("bT2="); lcd.setCursor(15,0); lcd.print(sensors.getTempCByIndex(2)); lcd.setCursor(0,1); lcd.print("pT1="); lcd.setCursor(4,1); lcd.print(sensors.getTempCByIndex(3)); lcd.setCursor(11,1); lcd.print("pT2="); lcd.setCursor(15,1); lcd.print(sensors.getTempCByIndex(1)); lcd.setCursor(0,2); lcd.print("ip is"); lcd.setCursor(6,2); lcd.print(Ethernet.localIP()); if (digitalRead (40) == LOW) {lcd.setCursor(0,3); lcd.print("Realy == ON ");} else {lcd.setCursor(0,3); lcd.print("Realy == OFF"); } EthernetClient 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(auth_hash)>-1) { if (readString.lastIndexOf("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>Управляющий контроллер</title>")); client.print("<H3>Локальный IP адрес = "); client.print(Ethernet.localIP()); client.print("<H2><br>Температура датчика 1 на плате = "); if (sensors.getTempCByIndex(0) > 26) { client.print("<font color='red' >"); client.print(sensors.getTempCByIndex(0)); client.print("</font>"); } else { client.print("<font color='green' >"); client.print(sensors.getTempCByIndex(0)); client.print("</font>"); } client.print("C°"); client.print("<br><H2>Температура датчика 2 на плате = "); if (sensors.getTempCByIndex(2) > 26) { client.print("<font color='red' >"); client.print(sensors.getTempCByIndex(2)); client.print("</font>"); } else { client.print("<font color='green' >"); client.print(sensors.getTempCByIndex(2)); client.print("</font>"); } client.print("C°"); client.print("<br><H2>Температура внешнего датчика 1 = "); if (sensors.getTempCByIndex(3) > 26) { client.print("<font color='red' >"); client.print(sensors.getTempCByIndex(3)); client.print("</font>"); } else { client.print("<font color='green' >"); client.print(sensors.getTempCByIndex(3)); client.print("</font>"); } client.print("C°"); client.print("<br><H2>Температура внешнего датчика 2 = "); if (sensors.getTempCByIndex(1) > 26) { client.print("<font color='red' >"); client.print(sensors.getTempCByIndex(1)); client.print("</font>"); } else { client.print("<font color='green' >"); client.print(sensors.getTempCByIndex(1)); client.print("</font>"); } client.print("C°"); client.print("<br>"); client.print("<br>"); client.print("<H1><a href=\"/rel=on\"><button>Включить нагрузку</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/rel=off\"><button>Отключить нагрузку</button></a>"); if (readString.lastIndexOf("rel=on")>-1) { digitalWrite(40, LOW); client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>"); } if (readString.lastIndexOf("rel=off")>-1) { digitalWrite(40, HIGH); client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>"); } client.print("<br>"); client.print("<H1><a href=\"/lcd=100\"><button>Включить подсветку LCD на 100%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=50\"><button>Включить подсветку LCD на 50%</button></a>"); client.print("<br>"); client.print("<H1><a href=\"/lcd=0\"><button>Отключить подсветку LCD</button></a>"); client.print("<br>"); if (readString.lastIndexOf("lcd=100")>-1) { analogWrite(brightness, 255); a = 255; client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>"); } if (readString.lastIndexOf("lcd=0")>-1) { analogWrite(brightness, 0); a = 0; client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>"); } if (readString.lastIndexOf("lcd=50")>-1) { analogWrite(brightness, 127); a = 127; client.print("<meta HTTP-EQUIV='REFRESH' CONTENT='0; URL=http://192.168.0.109'>"); } if (digitalRead (40) == LOW) {client.print("<H1><br>Нагрузка <font color='red' >включена</font>");} else {client.print("<H1><br>Нагрузка <font color='green' >отключена</font>");} client.print("<br>"); if (a == 0) {client.print("<br>Подсветка LCD отключена");} if (a == 127) {client.print("<br>Подсветка LCD 50%");} if (a == 255) {client.print("<br>Подсветка LCD включена");} client.println(F("</body></html>")); } } else { client.println(F("HTTP/1.0 401 Unauthorized")); client.println(F("WWW-Authenticate: Basic realm=\"Please log in!\"")); } break; } if (c == '\n') { currentLineIsBlank = true; } else if (c != '\r') { currentLineIsBlank = false; } } } delay(30); readString = ""; client.stop(); } } /* Функция подготавливает строку авторизации с хэшем учетных данных, для сравнения её с данными в HEADER браузера которые мы получим */ String auth_update(char login[], char password[]) { // Строка для будущего хэша String hash = strcat(strcat(login, ":"),password); int buf_size = hash.length()+1; char buf_char[buf_size]; // Переводим строку в char для дальнейшей обработки base64 hash.toCharArray(buf_char, buf_size); char encoded[base64_enc_len(buf_size-1)]; // Получаем хэш для авторизации base64_encode(encoded, buf_char, buf_size-1); // Формируем полную строку поиска "Authorization: Basic <BASE64-HASH>" чтобы не могли подсунуть хэш в GET или POST return "Authorization: Basic " + String(encoded); }