ESP32 Урок 21. Wi-Fi. STA. UDP Client. Приём данных



Продолжая тему передачи данных по беспроводной сети посредством протокола UDP, мы теперь попробуем принять данные с сервера. До сих пор мы пока только передавали пакеты с нашего клиента. Поэтому я добавил в мои программки для Android и для Windows ответы на наши пакеты. Программу для Windows я прикрепил внизу страницы, а приложение для Android достаточно будет просто обновить из Play Market. Сервер будет на 16-разрядное целое знаковое число отвечать подобным числом, но являющимся разностью числа 32767 и полученного числа. Также для того, чтобы нам нагляднее отследить пришедшие на наш клиент данные, мы к нашей плате подключим символьный дисплей, и схема наша примет следующий вид

 

Проект был сделан из проекта прошлого урока с именем WIFI_STA_UDP_CLIENT_TX и был назван WIFI_STA_UDP_CLIENT_RX.

Откроем наш проект в Espressif IDE, затем в соответствующий каталог нового проекта скопируем файлы lcd2004.hlcd2004.ci2c_user.h и i2c_user.c из проекта урока 18 с именем EVENT_GROUP_LCD.

Обновим дерево проектов и добавим данные модули в файле CMakeLists.txt

 

set(COMPONENT_SRCS «main.c wifi.c udp.c i2c_user.c lcd2004.c«)

 

Затем в файле Kconfig.projbuild добавим два пункта меню для ножек I2C

 

 

В файле main.h подключим библиотеку нашего дисплея

 

 

В файле main.c произведём инициализацию дисплея

 

 

В файле udp.h также подключим библиотеку для дисплея

 

 

 

В файле udp.c объявим структуру для данных, которые мы будем посылать в очередь на дисплей и саму очередь

 

 

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

 

 

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

 

 

 

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

 

 

Создадим очередь и задачу для дисплея

 

 

Удалим их в случае невозможности связать сокет с адресом клиента

 

 

Создадим задачу для приёма пакетов, в которую в качестве параметра передадим идентификатор сокета

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

Всё отлично работает.

Также мы можем теперь менять порт в приложении сервера (и не только, так как приложение время от времени обновляется). Попробуем его изменить и изменить его в заголовочном файле нашей программы. После этого также всё отлично передаётся и принимается.

Затем можно также проверить работу нашей программы и с сервером для Windows, в котором также теперь можно менять номер порта

 

Изменим IP-адрес и номер порта в программе и увидим, что у нас по-прежнему всё работает.

Итак, на данном занятии мы усовершенствовали свой клиент UDP, который теперь умеет также и принимать пакеты.

 

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

 

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

 

 

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

 

Исходный код

 

TCP UDP client-server for Android

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

 

UDP server for Windows

 

 

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

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

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

Дисплей LCD 16×2

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

 

 

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

ESP32 Wi-Fi. STA. UDP Client. Приём данных

 

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

ESP32 Wi-Fi. STA. UDP Client. Приём данных

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

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

*