ESP32 Урок 23. Wi-Fi. STA. UDP Server



Продолжая тему передачи данных по беспроводной сети посредством протокола UDP, на данном уроке мы попробуем создать простой сервер, который будет слушать постоянно какой-нибудь порт, и если вдруг получит на него пакет с числом, то должен будет ответить отправителю подобным пакетом с числом, составляющим разность числа 32767 с данным числом. То есть это та же задача, которую выполняли приложения, которые мы использовали на смартфоне и ПК.  Соответственно к сети WiFi мы будем подключаться с использованием библиотеки написанной в прошлом уроке.

Схема урока будет с использованием дисплея, как и в уроке 21

 

 

И проект также был сделан из проекта урока 21 с именем WIFI_STA_UDP_CLIENT_RX и назван был WIFI_STA_UDP_SERVER.

Прежде чем открыть данный проект в среде, давайте кое-что с ним сделаем, чтобы библиотека соединения с точкой доступа у нас была уже новая. Поэтому из проекта прошлого урока с именем WIFI_STA_SMART скопируем с заменой файлы wifi.h и wifi.c и откроем наш проект в среде Espressif IDE.

В файле Kconfig.projbuild удалим пункт меню ESP_MAXIMUM_RETRY, и также в том месте где был данный пункт добавим вместо некоторые нужные пункты

 

 

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

 

 

Порт клиента может быть любой, кто подключится, с тем и работаем.

Сохраним конфигурацию, попробуем собрать проект, который скорей всего теперь соберётся, и перейдём в файл udp.c, в котором функцию recv_task удалим вместе с телом.

В функции udp_task удалим переменную для задачи приёма пакетов

 

TaskHandle_t xLCDTaskHandle = NULL, xRecvTask = NULL;

 

Также удалим объявление данной переменной

 

portTickType xLastWakeTime;

 

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

 

 

После строки

 

xTaskCreate(vLCDTask, "vLCDTask", 2048, NULL, 2, &xLCDTaskHandle);

 

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

 

 

Далее организуем бесконечный цикл, в котором попытаемся создать сокет, если данная операция пройдёт неудачно, то выведем в терминале соответствующее сообщение и выйдем из цикла, а при успешном создании выведем другое сообщение

 

 

Очистим память полей переменных типов структур и проинициализируем переменную для адреса сервера

 

 

Попытаемся связать сокет с адресом сервера

 

 

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

 

 

Выйдем из данного бесконечного цикла (хотя реально, скорее всего, мы из него никогда не выйдем) и, если сокет существует, то попробуем его закрыть и, так как на верхнем уровне у нас также бесконечный цикл, то будет предпринята попытка заново создать сокет

 

 

 

Выйдем из всех циклов, удалим задачу дисплея, текущую задачу и очередь (вот сюда мы вполне можем попасть так как в цикле присутствует break

 

 

В файле wifi.c в функции wifi_stop удалим одну строку, а то почему-то их получилось две одинаковые

 

ESP_LOGI(TAG, "esp_wifi_clear_default_wifi_driver_and_handlers : %d", ret);

 

Также в функции wifi_init_sta в цикле, котором перебираются интерфейсы и выводится информация о них, уберём вот эту скобку

 

for (int i = 0; i < esp_netif_get_nr_of_ifs(); ++i) {
  netif = esp_netif_next(netif);
}

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

 

 

В функции app_main файла main.c удалим объявление данной переменной

 

wifi_ap_record_t info;

 

Также полностью удалим бесконечный цикл со всем телом.

Произведём инициализацию сетевого интерфейса и создадим цикл событий по умолчанию

 

 

Добавим возврат параметра в вызов функции инициализации wifi

 

ret = wifi_init_sta();

 

Ниже выведем в терминал код ошибки

 

 

Соберём код, прошьём контроллер, запустим программу на смартфоне и внесём там настройки нашего сервера, для этого нужно знать кроме порта также IP-адрес нашего ESP32, который можно посмотреть в терминале при старте программы

 

 

 

Применим настройки и запустим клиент

 

 

И мы увидим, как начнут изменяться цифры — верхняя будет декрементироваться, а нижняя — инкрементироваться

 

 

На дисплее, который подключен к нашей плате, мы также увидим приходящие с клиента числа

 

 

Остановим наш клиент на смартфоне и запустим программу для Windows (ссылка внизу страницы), зайдём там в настройки и также настроим программу на адрес и порт нашего сервера

 

  

 

Нажмём кнопку Start, тем самым запустив клиент

 

 

И если всё нормально, пойдёт тот же самый процесс, что и со смартфоном

 

 

Я не стал заморачиваться с отображением отправляемых чисел на экране в программе, а отобразил только принятые, так как отправленные мы видим на экране дисплея, подключенного к плате ESP.

Таким образом, на данном уроке нам удалось создать нехитрый сервер, работающий по протоколу UDP, который слушает определённый порт, и, приняв пакет, отправляет отправившему клиенту обратный.

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

 

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

 

 

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

 

Исходный код

 

TCP UDP client-server for Android

QR-код на скачивание приложения:

 

UDP client for Windows

 

 

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

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

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

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

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

Дисплей LCD 16×2 (AliExpress)

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

Дисплей символьный LCD 1602 с впаянным переходником на шину I2C (Яндекс.Маркет)

 

 

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

ESP32 Wi-Fi. STA. UDP Server

 

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

ESP32 Wi-Fi. STA. UDP Server

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

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

*