ESP32 Урок 28. Wi-Fi. STA. HTTP Server IDF



Продолжаем работу с нашим сервером HTTP и на данном уроке для ответа клиенту мы будем использовать функционал библиотеки IDF. Благодаря данной библиотеке нам не придётся писать код для многих рутинных процессов, присущих протоколу HTTP.

Схема наша, как и в прошлом занятии, будет состоять только из отладочной платы с контроллером ESP32, подключенной к USB-порту компьютера

 

 

Проект мы будем использовать из прошлого урока с именем WIFI_STA_HTTP_SERVER и присвоим ему имя WIFI_STA_HTTP_SERVER_IDF.

Откроем проект в Espressif IDE и в функции app_main файла main.c удалим строку с созданием задачи для сервера, так как она нам будет не нужна и сервер будет запускаться несколько по-другому

 

xTaskCreate(http_task, "http_task", 4096, NULL, 5, NULL);

 

В файле http.c также удалим функцию данной задачи http_task вместе с телом, не забывая также о прототипе в заголовочном файле.

Объявления глобальных массивов http_headerindex_htm и favicon_ico также удалим, мы их добавим позже, так как в них будут некоторые изменения.

В заголовочном файле http.h удалим подключение библиотек отвечающих за работу со стеком протоколов

 

#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include <lwip/netdb.h>

 

Подключим библиотеку для работы с протоколом http

 

 

Вернёмся в файл http.c и добавим функцию, которая будет запускать наш сервер

 

 

Ниже добавим функцию, которая будет сервер останавливать

 

 

Объявим прототипы для обеих этих функций в заголовочном файле http.h, а в заголовочном файле wifi.h подключим данный заголовочный файл

 

 

В функции wifi_start в файле wifi.c объявим переменную типа указателя на экземпляр HTTP-сервера

 

 

Далее при регистрации обработчиков передадим в параметрах указатель на нашу переменную

 

ret = esp_event_handler_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, &on_wifi_disconnect, &server);

...

ret = esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &on_got_ip, &server);

 

В функции on_got_ip получим наш указатель и, предварительно убедившись, что сервер не запущен, вызовем функцию запуска сервера

 

 

А в функции on_wifi_disconnect аналогичным образом мы наш сервер остановим

 

 

Вернёмся в файл http.c и в функции start_webserver объявим и инициализируем по умолчанию переменную типа структуры для конфигурации сервера HTTP, а также включим опцию очистки наименее использующихся соединений

 

 

 

Выше функции start_webserver добавим функцию-обработчик для обработки события запроса сервером главной страницы (ввод в браузере только адреса сервера)

 

 

Узнаем длину заголовка в запросе, увеличив её сразу на 1 для завершения нулём

 

 

Скопируем заголовок в буфер и выведем его в лог, затем освободим память, запрошенную под буфер

 

 

Объявим локальный указатель и присвоим ему адрес контекста из входного параметра

 

 

Объявим и инициализируем глобальный строковый массив с содержимым главной страницы, причём прямо в текстовом виде без всякого заголовка, заголовки формирует библиотека

 

 

Вернёмся в функцию all_get_handler и отправим нашу страницу клиенту

 

 

Убедимся в отсутствии других запросов, попытавшись прочитать заголовок

 

 

Надо нам теперь наш обработчик как-то зарегистрировать. Для этого ниже него объявим и инициализируем переменную типа структуры идентификатора ресурса (URI)

 

 

А в функции start_webserver попытаемся запустить сервер. Если всё нормально, то здесь мы и зарегистрируем наш обработчик и выйдем из функции с возвратом указателя на экземпляр сервера

 

 

 

А для иконки объявим бинарный глобальный массив

 

 

Ниже функции all_get_handler добавим аналогичный обработчик для запроса иконки, хотя, в принципе, можно было бы объединить всё в одном запросе, но в разных, я думаю, будет понятнее и нагляднее

 

 

Пока в теле находится только аналогичный код, а дальше уже будут расхождения.

Сначала установим в заголовке тип передаваемого документа, так как по умолчанию текстовый

 

 

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

 

 

И далее аналогично проверим  отсутствие других запросов, попытавшись прочитать заголовок

 

 

Выше функции start_webserver объявим и инициализируем переменную типа структуры идентификатора ресурса (URI) для иконки

 

 

В функции start_webserver зарегистрируем и этот обработчик

 

 

В принципе, можем начать проверку.

В конфигураторе у нас ничего не меняется, поэтому можем ничего не настраивать.

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

 

 

Запустим Wireshark, отфильтровавшись по данному адресу, и попробуем сделать запрос главной страницы в браузере

 

 

Всё отлично! Страничка загрузилась и иконка, как видим, тоже.

Посмотрим обмен в Wireshark

 

 

Здесь также всё соединяется и разъединяется.

При закрытии браузера происходит окончательное разъединение с портом

 

 

Итак, сегодня нам удалось модифицировать наш HTTP-сервер. Теперь он работает с использованием функционала комплекта IDF.

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

 

 

Данная статья в Дзен.

 

 

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

 

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

 

 

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

ESP32 Wi-Fi. STA. HTTP Server IDF

 

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

ESP32 Wi-Fi. STA. HTTP Server IDF

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

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

*