КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

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

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

В этом проекте 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
G GND
V 5V
S 3

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

// Подключем библиотеки
#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);
}

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями