Главная chevron_right Наши уроки chevron_right ESP32 chevron_right Обмен данными по UDP (Piranha ESP32 в качестве сервера)

Обмен данными по UDP (Piranha ESP32 в качестве сервера)

Подключаем Piranha ESP32 как точку доступа WiFi и настраиваем UDP-сервер: при получении байта управляем светодиодом. Разбираем асинхронную обработку пакетов в Arduino IDE.

Общие сведения:

В этом проекте Piranha ESP32 будет работать как точка доступа WiFi и ждать данных по UDP протоколу. При получении байта с нулевым значением подключенный светодиод будет выключаться, при получении байта с ненулевым значением светодиод будет включаться. Нажмите здесь для перехода на страницу проекта клиента.

При использовании двух Piranha ESP32, на одной из которых работает проект сервера (этот проект), а на другой проект клиента, будет загораться светодиод подключенный к одной Piranha ESP32 при нажатии на модуль кнопки подключенный к другой Piranha ESP32.

Для работы этого проекта необходимо использовать библиотеку AsyncUDP. Библиотека устанавливается вместе с пакетом поддержки ESP32 для Arduino IDE. Если у Вас ещё не установлена поддержка ESP32, то узнать как это сделать можно по этой ссылке.

Сервер UDP работает асинхронно, для обработки пакетов достаточно один раз вызвать метод udp.onPacket() указав в качестве параметра указатель на функцию обработки пакета (в данном случае функция parsePacket). Функция parsePacket() будет вызываться каждый раз при получении нового пакета UDP.

UDP (англ. User Datagram Protocol) — протокол пользовательских датаграмм. UDP предоставляет ненадёжный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа. UDP подразумевает, что проверка ошибок и исправление либо не нужны, либо должны исполняться в приложении.

Видео:

редактируется ...

Нам понадобится:

Подключение:

Модуль СветодиодPiranha ESP32
GGND
V5V
S3

Скетч проекта:

// Подключем библиотеки
#include <AsyncUDP.h>
#include <WiFi.h>
#include <WiFiAP.h>

// Определяем вывод светодиода
const uint8_t LED_PIN = 3;

// Определяем название и пароль точки доступа
const char* ssid = "esp32asAP";
const char* password = "password12345";

// Создаём объект UDP cоединения
AsyncUDP udp;

// Определяем порт
const uint16_t port = 49152;

// Определяем callback функцию обработки пакета
void parsePacket(AsyncUDPPacket packet)
{

    // Записываем адрес начала данных в памяти
    const uint8_t* msg = packet.data();
    // Записываем размер данных
    const size_t len = packet.length();
    // Объект для хранения состояния светодиода в строковом формате
    String state;

    // Если адрес данных не равен нулю и размер данных больше нуля...
    if (msg != NULL && len > 0) {

        // Если первый байт данных содержит 0x1
        if (msg[0] == HIGH) {

            // записываем строку в объект String
            state = "включён";
        }
        // Если первый байт данных содержит 0x0
        else if (msg[0] == LOW) {

            // записываем строку в объект String
            state = "выключен";
        }

        // Меняем состояние встроенного в плату светодиода
        digitalWrite(LED_PIN, msg[0]);

        // Отправляем данные клиенту
        packet.printf("Светодиод %s", state.c_str());

        // Выводим состояние светодиода в последовательный порт
        Serial.println("Светодиод " + state);
    }
}

void setup()
{

    // Устанавливаем режим работы вывода светодиода
    pinMode(LED_PIN, OUTPUT);

    // Инициируем последовательный порт
    Serial.begin(115200);
    Serial.println();
    Serial.println("Инициируем точку доступа WiFi");

    // Инициируем точку доступа WiFi
    WiFi.softAP(ssid, password);
    IPAddress myIP = WiFi.softAPIP();

    // Выводим IP-адрес
    Serial.print("IP-адрес точки доступа: ");
    Serial.println(myIP);

    // Инициируем сервер
    if(udp.listen(port)) {
        // При получении пакета вызываем callback функцию
        udp.onPacket(parsePacket);
    }

    Serial.println("Сервер запущен.");
}

void loop()
{
    delay(10);
}

Ссылки

Комплект для повторения проекта

Что понадобится

Это быстрый ориентир по основным модулям и деталям. Полный список для повторения проекта смотрите в самой статье.

3 позиции
Все уроки ESP32