ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс UDP/UDP-коммуникация между ESP8266 и внешней программой

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.



UDP-коммуникация между ESP8266 и внешней программой[1]

Цель этого скетча – продемонстрировать, как настроить UDP-коммуникацию между ESP8266 и внешним клиентом. Внутри блока loop() скетч (выполняющий роль сервера) будет проверять, пришел ли UDP-пакет. Если пришел, и если это корректный пакет, скетч отправит клиенту подтверждающий пакет – на тот же порт, с которого пакет был прислан.

Объявление библиотек, констант и переменных

Вначале скетча подключаем две библиотеки:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

Первая библиотека (ESP8266WiFi.h) нужна в любом случае, т.к. мы используем ESP8266 и передачу данных по WiFi. Вторая (WiFiUdp.h) будет использоваться для программирования UDP-функционала.

Подключив библиотеки, создаем экземпляр класса WiFiUDP. Затем указываем порт для прослушки входящих пакетов. Стандартные номера портов для TCP и UDP можно посмотреть по этой ссылке. Наконец, создаем буфер для входящих пакетов и задаем ответное сообщение.

WiFiUDP Udp;
unsigned int localUdpPort = 4210;
char incomingPacket[255];
char  replyPacekt[] = "Hi there! Got the message :-)";
                  //  "Привет! Сообщение получено :-)"

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

В начале блока setup() пишем стандартный код для подключения к точке доступа. Его можно найти, к примеру, в заглавной статье в разделе «Быстрый старт».

Настройка UDP

Установив соединение, начинаем прослушивать входящие пакеты.

Udp.begin(localUdpPort);

В принципе, все. Теперь переходим к блоку loop(), в котором будет обрабатываться UDP-коммуникация.

Получение UDP-пакета

Для ожидания входящего UDP-пакета требуется вот такой код:

int packetSize = Udp.parsePacket();
if (packetSize)
{
  Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
            //  "Получено %d байт от %s, порт %d%"
  int len = Udp.read(incomingPacket, 255);
  if (len > 0)
  {
    incomingPacket[len] = 0;
  }
  Serial.printf("UDP packet contents: %s\n", incomingPacket);
            //  "Содержимое UDP-пакета: %s"
  (...)
}

После получения пакета скетч напечатает в мониторе порта IP-адрес, порт отправителя и размер присланного пакета. Если пакет не пуст, будет напечатано и его содержимое.

Отправка подтверждения

После получения каждого пакета скетч будет отправлять обратно подтверждающий пакет.

Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(replyPacekt);
Udp.endPacket();

Обратите внимание, что отправка ответа на IP-адрес и порт отправителя выполняется при помощи функций Udp.remoteIP() и Udp.remotePort().

Скетч целиком

Полная версия скетча показана ниже:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "********";
const char* password = "********";

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // локальный порт для прослушки 
char incomingPacket[255];          // буфер для входящих пакетов
char  replyPacekt[] = "Hi there! Got the message :-)";  // ответ
                  //  "Привет! Сообщение получено :-)"

void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
            //  "Подключение к %s "
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
             //  " подключено "

  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
            //  "Теперь прослушиваем IP-адрес %s, UDP-порт %d"
}

void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // получаем входящие UDP-пакеты:
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
              //  "Получено %d байт от %s, порт %d%"
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
              //  "Содержимое UDP-пакета: %s"

    // отправляем ответ на IP-адрес и порт, с которых пришел пакет: 
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacekt);
    Udp.endPacket();
  }
}

Как проверить?

Загрузите скетч на модуль и откройте монитор порта. В нем должно появиться подтверждение, что ESP8266 подключился к WiFi и начал прослушивать UDP-пакеты:

Connecting to twc-net-3 ........ connected
Now listening at IP 192.168.1.104, UDP port 4210

Теперь нам понадобится еще одна программа для отправки пакетов на IP-адрес и порт, показанные выше.

Здесь можно обойтись без дополнительного ESP8266, вместо нее воспользовавшись специальной программой. К примеру, Packet Sender, доступной в версиях для Windows, Mac и Linux. Загрузите ее, установите и запустите.

Открыв Packet Sender, введите следующую информацию:

  • Название пакета (поле «Name»)
  • Текст, который будет внутри пакета (поле «ASCII»)
  • IP-адрес, показанный в мониторе порта (поле «IP-address»)
  • Порт, показанный в мониторе порта (поле «Port»)

Затем в выпадающем меню справа выберите пункт «UDP».

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

Теперь нажмите на кнопку «Send». Сразу после этого в мониторе порта должно появиться следующее:

Received 12 bytes from 192.168.1.106, port 55056
UDP packet contents: Hello World!

Текст 192.168.1.106, port 55056 указывает на ПК, с которого были присланы пакеты. У вас, скорее всего, будут другие значения. После этого ESP8266 отошлет обратно пакет с подтверждающим сообщением, которое вы должны увидеть в логах в нижней части Packet Sender.

Итого

Этот простой скетч демонстрирует, как отправлять и получать UDP-пакеты между ESP8266 и внешней программой. Это минимум для UDP-коммуникации, но, разобравшись в нем, вы поймете, как запрограммировать ESP8266 на «общение» с любым другим UDP-устройством. Если у вас не получается установить соединение с новым устройством, для отладки можно воспользоваться программой Packet Sender, о которой рассказывалось выше.

Список функций для работы с классом WiFiUDP смотрите по [ссылка этой ссылке].

См.также

Внешние ссылки