ESP32 Урок 20. Wi-Fi. STA. UDP Client. Передача данных



Продолжаем тему передачи данных по беспроводной сети. На данном уроке мы попробуем теперь передать какие-то осознанные данные. Для этого мы воспользуемся транспортным протоколом UDP, так как для этого в IDF всё имеется в наличии и нам не потребуется самостоятельно формировать наши пакеты. На данном уроке мы попытаемся сочинить простенький UDP-клиент, который будет передавать в сеть на определённый адрес и порт постоянно инкрементирующиеся 16-разрядные знаковые величины. Причём сочинить даже громко сказано, так как мы это уже проделывали с контроллером ESP8266 в уроке 24.

Для создания UDP-клиента мы будем использовать библиотеку LWIP, с которой мы также очень хорошо знакомы и которая также входит в состав IDF.

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

Схема у нас будет та же самая — отладочная плата, подключенная к USB компьютера

 

 

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

Откроем наш проект в Espressif IDE и добавим в файл Kconfig.projbuild ещё три пункта, один для IP-адреса сервера, два других — для портов сервера и клиента

 

 

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

 

 

 

Подключим нашу библиотеку в main.h

 

 

Не забываем про CMakeLists.txt

 

set(COMPONENT_SRCS "main.c wifi.c udp.c")

 

Сохраним все файлы и попробуем собрать проект.

Если всё нормально собралось, то объявим и проинициализируем глобальный символьный массив для имени лога и добавим функцию для задачи обмена по протоколу UDP в файле udp.c

 

 

Создадим для данной функции прототип и создадим такую задачу в функции app_main файла main.c

 

 

В конфигураторе проверим и при необходимости настроим адреса

 

 

 

В файле udp.h подключим библиотеки для работы с стеком протоколов LWIP

 

 

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

 

 

Выведем соответствующее сообщение в лог и попытаемся создать сокет

 

 

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

 

 

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

 

 

Заполним информацию о сервере

 

 

Запишем время в переменную для задержки

 

 

 

А далее в цикле, который получится бесконечным, мы отправляем пакет с числом на сервер раз в 10 милисекунд

 

 

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

 

 

Вот и готов наш клиент.

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

 

 

Судя по сообщениям, к точке доступа мы подключились, сокет создан и связан с клиентом. Также у нас успешно работает параллельная задача.

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

Проверим сначала, как наши пакеты приходят в приложение в смартфоне.

Для этого устанавливаем приложение (ссылка и QR-код для установки внизу страницы, возможно они могут не работать, тогда ищем в Play Market UDP TCP vlad_emb и приложение найдётся) на смартфон (или планшет), запускаем его и жмём единственную кнопку Start. Соответственно, наше мобильное устройство должно быть подключено к той же сети и его адрес должен быть конфигураторе.

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

 

 

Можно нажать кнопку Stop, в которую превратилась кнопка Start и прекратить приём чисел.

Теперь давайте запустим приложение на компьютере (ссылка также внизу страницы), которое достаточно просто запустить, установка не требуется. Далее вместо IP-адреса мобильного устройства мы заносим в конфигуратор IP-адрес компьютера, собираем и прошиваем код, и также нажимаем кнопку Start

 

 

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

Запустим анализатор пакетов WireShark, чтобы также убедиться, что пакеты наши безошибочные (контрольная сумма в порядке).

Для этого отфильтруем пакеты по IP-адресу нашего ESP32 (а его мы видели в терминальной программе в момент соединения с точкой доступа)

 

 

Итак, на данном занятии нам удалось создать простой UDP-клиент с использованием библиотеки LWIP. Пусть этот клиент умеет пока только передавать данные, но самое главное, что мы с данного урока начали обмен данными по беспроводной сети с использованием контроллера ESP32.

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

 

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

 

 

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

 

Исходный код

 

TCP UDP client-server for Android

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

 

UDP server for Windows

 

 

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

 

 

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

ESP32 Wi-Fi. STA. UDP Client. Передача данных

 

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

ESP32 Wi-Fi. STA. UDP Client. Передача данных

Один комментарий на “ESP32 Урок 20. Wi-Fi. STA. UDP Client. Передача данных
  1. александр:

    void udp_task(void *pvParameters)
    {
    // portTickType
    uint32_t xLastWakeTime; ///<<<<<<<<
    //
    :
    :
    //
    vTaskDelayUntil( &xLastWakeTime, ( 20 / 5)); //portTICK_RATE_MS ) );
    }
    :
    :

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

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

*