Урок ESP8266. Настройка простого HTTP веб-сервера.

Цель этого урока - объяснить, как настроить веб-сервер HTTP на ESP8266 и делать к нему простые запросы с помощью веб-браузера.

В уроке будем использовать библиотеки ESP8266 для Arduino IDE. Как настроить Arduino IDE для поддержки ESP8266, узнать можно здесь.

В уроке будем использовать библиотеки ESP8266 для Arduino IDE.

Тесты проводились с использованием платы 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());

Чтобы получить это значение просто вызываем метод localIP для глобальной переменной WiFi

Затем начнем указывать, какой код выполнять, когда 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, который получаем в мониторе порта, и делаем запрос, как показано на рисунке ниже.

Итак, заменяем serverIP на IP, который получаем в мониторе порта, и делаем запрос

В этом случае отображается только IP, потому что браузер удалил «/» из корневого пути. Кроме того, браузер удалил http: //. Хотя некоторые браузеры выполняют запрос, когда мы указываем только IP, другие предполагают, что мы хотим найти что-то в поисковой системе. Итак, самый безопасный способ - всегда указывать http: // перед IP.

Пример на рисунке ниже показывает запрос по пути «/other», который мы также прописали в коде.

ример на рисунке ниже показывает запрос по пути «/ other», который мы также прописали в коде.

Наконец, обратите внимание, что если мы укажем путь, который не определен, ESP вернет сообщение, указывающее, что ресурс не был найден, как мы можем видеть на рисунке ниже, где отправили HTTP-запрос по пути «/not».

если мы укажем путь, который не определен, ESP вернет сообщение, указывающее, что ресурс не был найден

Важно! IP-адрес, который будет выводить ESP8266 в монитор порта, является локальным IP-адресом в сети. Клиент вне сети не сможет связаться по этому IP-адресу (и, следовательно, URL-адрес не будет работать). Чтобы клиент мог связаться с ESP8266 из-за пределов своей сети, ему необходимо будет использовать внешний IP-адрес сети, а маршрутизатор должен быть настроен для переадресации запросов с общедоступного IP-адреса на локальный IP ESP8266. Поскольку переадресация портов зависит от используемого маршрутизатора, объяснение того, как это сделать выходит за рамки этого урока.

Понравился ESP8266 уроки. Настройка простого HTTP веб-сервера? Не забудь поделиться с друзьями в соц. сетях.

А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

Спасибо за внимание!

Технологии начинаются с простого!


Фотографии к статье

Файлы для скачивания

Скетч простого HTTP веб-сервера на ESP8266 Скетч простого HTTP веб-сервера на ESP8266 .ino2 Kb 10 Скачать

Комментарии

Ваше Имя*