ESP8266 Урок 30. FreeRTOS. Wi-Fi. STA. Простой HTTP Server



Продолжаем работать с программированием микроконтроллера ESP8266 с использованием операционной системы реального времени FREEFTOS, и на данном уроке мы уже попытаемся создать простенький HTTP сервер, который позволит нам принять запрос документа от клиента, обработать его и в ответ направить клиенту нужную информацию. Также позволю себе лишний раз напомнить, что мы раньше подобные задачи решали с использованием других контроллеров, поэтому думаю, что с данной задачей мы без особого труда справимся.

Дисплей я решил отключить, так как он нам сильно не нужен, в целях экономии кучи ибо создавать лишнюю задачу под дисплей уже не придётся. По желанию вы можете дисплей оставить. Также плату я тоже решил сменить и подключил другую, подобную, чтобы показать, что мы можем для наших задач использовать любые платы с контроллером ESP8266 на борту

 

 

 

Также у меня есть такая же плата, той же фирмы, но уже с OLED-дисплеем разрешением 128х32, которую мы впоследствии, возможно, также будем использовать в наших уроках.

Ссылку на покупку данной платы и платы с дисплеем я не даю, так как на Aliexpress я таких не нашел, есть в других магазинах и торговых ресурсах, но там они то появляются, то исчезают. Поэтому, если у вас будет возможность найти данные платы, то советую приобрести.

Подключим нашу плату к USP-шине компьютера

 

 

Проект мы, как обычно, за основу возьмём из прошлого урока с именем WIFI_STA_TCP_SERVER_RTOS и дадим ему новое имя WIFI_STA_HTTP_SERVER_RTOS. Откроем наш проект в Eclipse.

Так как дисплей мы не используем, мы можем спокойно удалить файлы lcd.h и lcd.c из дерева проекта, а также удалить их и физически из каталога с проектом.

В файлах main.h и wifi.h удалим подключение данной библиотеки

 

#include «lcd.h»

 

В функции user_init удалим следующие строки

 

i2c_mas_gpio_init();
I2C_MASTER_SDA_LOW_SCL_LOW();
LCD_ini();
LCD_SetPos(0,0);

 

Перейдём в файл wifi.c и удалим функцию vLCDTask вместе с телом.

Функцию client_socket_task мы также удалим вместе с телом ибо мы не будем создавать отдельных задач для работы с подключенными клиентами.

 

 

В функции tcp_task удалим вот эти строки объявления очереди и инициализации переменной структуры для дисплея

 

qData xLCDData;

xLCDData.y_pos = 1;

xLCDData.str = str1;

 

Все вот эти глобальные объявления также удалим

 

typedef struct

{

  unsigned char y_pos;

  char *str;

} qData;

//————————————————

typedef struct struct_recv_socket_t {

  int sock;

  unsigned char y_pos;

} struct_recv_socket;

struct_recv_socket recv_socket01;

typedef struct struct_client_socket_t {

  struct sockaddr_in remotehost;

  socklen_t sockaddrsize;

  int accept_sock;

  uint16_t y_pos;

} struct_client_socket;

struct_client_socket client_socket01;

//————————————————

xQueueHandle xQueue;

 

Вернёмся в функцию tcp_task и объявим размер буфера, а также массив для него

 

 

Вот здесь мы пока в очередь будем ставить только одного клиента, так как мы будем передавать в браузер только одну страницу без рисунков, иконок и всего прочего

 

listen(sockfd, 1);

 

В теле следующего условия пока также удалим весь код

 

if(accept_sock >= 0)

{

  client_socket01.accept_sock = accept_sock;

  client_socket01.remotehost = remotehost;

  client_socket01.sockaddrsize = sockaddrsize;

  client_socket01.y_pos = accept_sock-1;

  xTaskCreate(client_socket_task, «client_socket_task», 4096, (void*)&client_socket01, 5, NULL);

 

Вот эти строки также удалим

 

close(sockfd);

snprintf(str1, sizeof(str1), «Disonnected»);

xQueueSendToBack(xQueue, &xLCDData, 0);

 

В функции инициализации init_esp_wifi удалим также создание очереди и задачи для работы с дисплеем

 

xQueue = xQueueCreate(10, sizeof(qData));

xTaskCreate(vLCDTask, «vLCDTask», 256, NULL, 2, NULL);

 

Теперь у нас, по крайней мере, проект будет собираться.

 

 

Вернёмся в функцию tcp_task и добавим объявление ещё одной переменной, которая будет хранить результат приёма пакета

 

int sockfd, accept_sock, ret;

 

Попытаемся принять пакет с запросом от клиента

 

 

Теперь самое главное. Перед нами встаёт вопрос, где мы будем брать контент для отправки клиенту, то есть веб-страницу, ведь у нас же нет никаких инициализированных накопителей, файловая система SPIFFS ещё в плане к изучению. А сделаем мы так, как делали раньше с AVR. Содержимое страницы и заголовка HTTP мы поместим в глобальные массивы

 

 

Вернёмся в функцию tcp_task и поместим всё это в буфер, перед этим отфильтровав всё ненужное

 

 

Отправим подготовленный пакет клиенту

 

 

Не забываем разъединиться с клиентом

 

 

Также у нас не будет работать приём запросов, если мы не изменим порт.

Поэтому перейдём в файл user_config.h и внесём данные изменения

 

#define SERVER_PORT 80

 

Вот и всё. Собираем проект, прошиваем контроллер и узнаём IP адрес нашей платы в терминальной программе

 

 

Попытаемся в браузере запросить страницу

 

 

Если всё нормально, то мы должны получить вот такую картину

 

 

В анализаторе трафика Wireshark мы также можем наблюдать, что обмен пакетами с сервером у нас происходит корректно, в том числе соединение с ним и его разрыв

 

Итак, на данном уроке нам удалось создать простейший HTTP-сервер, который может обрабатывать запрос страницы от клиента и передавать ему данную страницу в форме пакета HTTP.

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

 

 

Предыдущий урок Программирование МК ESP8266 Следующий урок

 

Исходный код

 

 

Утилита для получения двоичного кода страниц и других файлов: makefsdata

 

 

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 FreeRTOS. Wi-Fi. STA. Простой HTTP Server

 

3 комментария на “ESP8266 Урок 30. FreeRTOS. Wi-Fi. STA. Простой HTTP Server
  1. megger380:

    Поправте ссылку на видео.

  2. megger380:

    Добрый день! CGI/SSI будет?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*