String currentLine = "";
while (client.connected()) {
if (client.available()) { // Есть непрочитанные данные
char c = client.read(); // читаем 1 байт
Serial.write(c);
if (c == '\n') { // Символ перевода строки
// 2 пустые строки - признак конца запроса, посылаем ответ
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
client.print("<html><head> <title>ESP32 Server</title> </head>”);
client.print("<body>Hello world</body> </html>");
client.println();
break;
} else {
// Очистить строку
currentLine = "";
}
} else if (c != '\r') { // if you got anything else but a carriage return character,
currentLine += c; // add it to the end of the currentLine
}
}
}
// Закрыть соединение:
client.stop();
}
}
Рассмотрим код подробнее.
Мы создаем объект WiFiServer, который “слушает” входящие соединения на определенном порту (в нашем случае 8000). Тот, кто подсоединяется к нашему серверу, называется “клиентом”. За взаимодействие с ним отвечает класс WiFiClient.
Далее, мы побайтно читаем данные с помощью вызова функции client.read(), и складываем данные в строку currentLine. К примеру, строка запроса может быть такой - GET / HTTP/1.1, здесь “GET” это тип запроса, “/” - это адрес главной страницы, 1.1 - тип стандарта. Но сам запрос мы не анализируем, а просто посылаем всегда один и тот же ответ - заглавную страницу с HTML-текстом “Hello world”. Строки типа “HTTP/1.1 200 OK” - это служебная информация, которая нужна браузеру (клиенту) чтобы понять, что мы ответили (200 - это код возврата OK, говорящий о том что все нормально). Строка “Content-type:text/html” говорит клиенту о том, что возвращаться будет HTML-страница.
Наша страница имеет следующий вид:
<html>
<head>
<title>ESP32 Server</title>
</head>
<body>Hello world</body>
</html>
Как можно видеть, она содержит “заголовок” (header) и “тело” (body). Заголовок содержит тег title - в нем хранится строка, которая будет выведена в