Цель этого урока - объяснить, как настроить веб-сервер HTTP на ESP8266 и делать к нему простые запросы с помощью веб-браузера.
В уроке будем использовать библиотеки ESP8266 для Arduino IDE. Как настроить Arduino IDE для поддержки ESP8266, узнать можно здесь.
Тесты проводились с использованием платы NodeMCU, очень дешевая и простая в использовании плата ESP8266.
Код простого HTTP веб-сервера на ESP8266.
Прежде всего, подключим библиотеку ESP8266WiFi, которая содержит необходимые функции для подключения ESP8266 к сети Wi-Fi. Вы можете прочитать более подробное описание того, как подключить ESP8266 к сети Wi-Fi в предыдущем уроке.
Затем подключим библиотеку ESP8266WebServer, которая сделает доступным класс ESP8266WebServer, его будем использовать в данном примере. Естественно, у этого класса есть несколько доступных методов, которые помогут нам настроить сервер и обрабатывать входящие HTTP-запросы, не беспокоясь о деталях реализации на низком уровне. Вы можете посмотреть возможности библиотеки здесь.
#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"
Далее объявляем глобальную объектную переменную из ранее упомянутого класса, чтобы мы могли получить к ней доступ в наших функциях.
В качестве аргумента для конструктора этого класса мы передадим порт, который сервер будет слушать. Поскольку 80 - порт по умолчанию для HTTP. Будем использовать это значение, поэтому нам не нужно будет указывать номер порта в URL-адресе при доступе к нашему серверу ESP8266 с помощью браузера.
ESP8266WebServer server(80);
Нам нужно предварительно настроить HTTP-сервер перед его запуском.
Также открываем последовательное соединение для отладки.
Serial.begin(115200);
Затем будет подключаться к сети Wi-Fi, как показано в приведенном ниже коде. Если вам нужно подробное объяснение того, как подключиться к сети Wi-Fi ESP8266, посмотрите предыдущий урок по данной теме.
#include <ESP8266WiFi.h>
const char* ssid = "NetworkName"; const char* password = "NetworkPass";
byte tries = 10; // Попыткок подключения к точке доступа void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (--tries && WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Non Connecting to WiFi..");
}
else
{
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
}
Поскольку мы собираемся выполнять HTTP запросы, нам нужно знать IP-адрес, на котором ESP8266 прослушивает входящие запросы, это будет локальным IP-адресом назначенным в сети Wi-Fi.
Чтобы получить это значение просто вызываем метод localIP для глобальной переменной WiFi и затем выведем его в последовательный порт, чтобы мы знали, какой URL-адрес вызывать в нашем веб-браузере.
Serial.println(WiFi.localIP());
Затем начнем указывать, какой код выполнять, когда HTTP-запрос выполняется для каждого пути. Чтобы сделать это, вызываем метод для ранее объявленного глобального объекта сервера.
Более элегантный метод заключается в определении функции обработки где-нибудь в нашем коде и передаче ее функции on вместе с URL-адресом, который будет запускать выполнение этой функции.
server.on("/", handleRootPath);
Таким образом, код указывает, что когда HTTP-запрос получен по корневому («/») пути, он инициирует выполнение функции «handleRootPath». Обратите внимание, что мы не указываем IP-адрес или порт, на который ESP8266 прослушивает, а только путь URL-адреса с этого момента.
Для простоты предположим, что функция «handleRootPath» отвечает только текстом «Greetings from the site arduino-tex.ru» на входящий HTTP-запрос. Итак, чтобы определить ответ на запрос, мы вызываем метод send.
Хотя метод может быть вызван с другим набором аргументов, его простейшая форма состоит в получении кода ответа HTTP, типа и содержимого.
void handleRootPath() { //Обработчик для корневого пути
server.send(200, "text/plain", "Greetings from the site arduino-tex.ru");
}
В этом случае мы отправляем код 200, который соответствует ответу «ОК». Затем мы указываем тип контента как «text/plain», поскольку мы отвечаем только простым «Greetings from the site arduino-tex.ru» фактическим текстом ответа.
Естественно, эту функцию нужно объявить вне функции настройки.
Мы также можем указать функцию обработки при вызове метода on. В этом случае нам не нужно объявлять отдельную функцию, и мы можем делать все в функции настройки, как показано ниже.
server.on("/other", []() { //Определите функцию обработки для пути
server.send(200, "text / plain", "Additional page");
});
В этом случае, если мы получим HTTP-запрос по пути «/other», мы ответим выражением «Additional page».
Теперь, чтобы запустить наш сервер, мы вызываем метод begin объекта server. Это последняя строка кода, которую нам нужно включить в нашу функцию настройки.
server.begin();
Наконец, чтобы обрабатывать фактический входящий HTTP-запрос, нам нужно вызвать метод handleClient в функции основного цикла.
void loop() {
server.handleClient();
}
Скетч простого HTTP веб-сервера на ESP8266 получится следующим.
#include "ESP8266WiFi.h"
#include "ESP8266WebServer.h"
ESP8266WebServer server(80);
const char* ssid = "NetworkName";
const char* password = "NetworkPass";
byte tries = 10; // Попыткок подключения к точке доступа
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (--tries && WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
if (WiFi.status() != WL_CONNECTED)
{
Serial.println("Non Connecting to WiFi..");
}
else
{
// Иначе удалось подключиться отправляем сообщение
// о подключении и выводим адрес IP
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
server.on("/other", []() { //Определите функцию обработки для пути
server.send(200, "text / plain", "Additional page");
});
server.on("/", handleRootPath); //Свяжем функцию обработчика с путем
server.begin(); //Запускаем сервер
Serial.println("Server listening");
}
void loop() {
server.handleClient(); //Обработка входящих запросов
}
void handleRootPath() { //Обработчик для корневого пути
server.send(200, "text/plain", "Greetings from the site arduino-tex.ru");
}
Проверка HTTP веб-сервера на ESP8266.
Чтобы протестировать код, нам просто нужно открыть наш браузер и сделать HTTP-запрос на IP-адрес ESP8266, по пути, который мы определили ранее. Формат показан ниже:
http://serverIP:port/path
Как указывалось ранее, мы прослушиваем порт 80, браузер примет его по умолчанию, поэтому нам не нужно его указывать:
http://serverIP/path
Итак, заменяем serverIP на IP, который получаем в мониторе порта, и делаем запрос, как показано на рисунке ниже.
В этом случае отображается только IP, потому что браузер удалил «/» из корневого пути. Кроме того, браузер удалил http: //. Хотя некоторые браузеры выполняют запрос, когда мы указываем только IP, другие предполагают, что мы хотим найти что-то в поисковой системе. Итак, самый безопасный способ - всегда указывать http: // перед IP.
Пример на рисунке ниже показывает запрос по пути «/other», который мы также прописали в коде.
Наконец, обратите внимание, что если мы укажем путь, который не определен, ESP вернет сообщение, указывающее, что ресурс не был найден, как мы можем видеть на рисунке ниже, где отправили HTTP-запрос по пути «/not».
Важно! IP-адрес, который будет выводить ESP8266 в монитор порта, является локальным IP-адресом в сети. Клиент вне сети не сможет связаться по этому IP-адресу (и, следовательно, URL-адрес не будет работать). Чтобы клиент мог связаться с ESP8266 из-за пределов своей сети, ему необходимо будет использовать внешний IP-адрес сети, а маршрутизатор должен быть настроен для переадресации запросов с общедоступного IP-адреса на локальный IP ESP8266. Поскольку переадресация портов зависит от используемого маршрутизатора, объяснение того, как это сделать выходит за рамки этого урока.
Понравился ESP8266 уроки.
Настройка простого HTTP веб-сервера? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Файлы для скачивания
|
Скетч простого HTTP веб-сервера на ESP8266 .ino | 2 Kb | 883 |
Скачать
Вы можете скачать файл.
|
Комментарии