Найти в Дзене
narod stream

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 и номер порта сервера, запустим сервер на смартфоне и, если всё правильно, то мы должны будем увидеть декриментирующиеся числа, пришедшие с сервера, на дисплее

-2

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

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

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

-3

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

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

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

Оригинал статьи находится здесь.

<<Предыдущий урок | Следующий урок>>

Исходный код

TCP UDP client-server for Android

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

Добавьте описание
Добавьте описание

UDP server for Windows

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

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

Дисплей LCD 20x4 можно приобрести тут

Дисплей LCD 16x2 можно приобрести тут

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

Видео в RuTube

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

Видео в Дзен

Видео в Youtube