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 смотрите по [ссылка этой ссылке].