Продолжаем тему передачи данных по беспроводной сети. На данном уроке мы попробуем теперь передать какие-то осознанные данные. Для этого мы воспользуемся транспортным протоколом UDP, так как для этого в IDF всё имеется в наличии и нам не потребуется самостоятельно формировать наши пакеты. На данном уроке мы попытаемся сочинить простенький UDP-клиент, который будет передавать в сеть на определённый адрес и порт постоянно инкрементирующиеся 16-разрядные знаковые величины. Причём сочинить даже громко сказано, так как мы это уже проделывали с контроллером ESP8266 в уроке 24.
Для создания UDP-клиента мы будем использовать библиотеку LWIP, с которой мы также очень хорошо знакомы и которая также входит в состав IDF.
На данном уроке мы пока будем только передавать данные, приёмом займёмся позже, чтобы идти поступательно и чтобы материал легче укладывался в сознании.
Схема у нас будет та же самая — отладочная плата, подключенная к USB компьютера
Проект мы создадим из проекта прошлого урока с именем WIFI_STA и назовём его WIFI_STA_UDP_CLIENT_TX.
Откроем наш проект в Espressif IDE и добавим в файл Kconfig.projbuild ещё три пункта, один для IP-адреса сервера, два других — для портов сервера и клиента
Добавим также ещё один модуль для работы с протоколом UDP, состоящий из двух файлов следующего содержания
udp.h
udp.c
Подключим нашу библиотеку в 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.
Всем спасибо за внимание!
Оригинал статьи находится здесь.
<<Предыдущий урок | Следующий урок>>
TCP UDP client-server for Android
QR-код на скачивание приложения:
Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32
Видео в RuTube
Видео в Дзен
Видео в Youtube