ESP8266:Прошивки/Arduino/Библиотеки/Библиотека ESP8266WiFi/Класс UDP/UDP-коммуникация между ESP8266 и внешней программой: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показана 1 промежуточная версия этого же участника) | |||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=UDP-коммуникация между ESP8266 и внешней программой<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/udp-examples.html arduino-esp8266.readthedocs.io - UDP]</ref>= | =UDP-коммуникация между ESP8266 и внешней программой<ref>[http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/udp-examples.html arduino-esp8266.readthedocs.io - UDP]</ref>= | ||
Строка 13: | Строка 13: | ||
Вначале скетча подключаем две библиотеки: | Вначале скетча подключаем две библиотеки: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <ESP8266WiFi.h> | #include <ESP8266WiFi.h> | ||
#include <WiFiUdp.h> | #include <WiFiUdp.h> | ||
Строка 22: | Строка 22: | ||
Подключив библиотеки, создаем экземпляр класса WiFiUDP. Затем указываем порт для прослушки входящих пакетов. Стандартные номера портов для [[TCP]] и [[UDP]] можно посмотреть по [https://ru.wikipedia.org/wiki/Список_портов_TCP_и_UDP этой ссылке]. Наконец, создаем буфер для входящих пакетов и задаем ответное сообщение. | Подключив библиотеки, создаем экземпляр класса WiFiUDP. Затем указываем порт для прослушки входящих пакетов. Стандартные номера портов для [[TCP]] и [[UDP]] можно посмотреть по [https://ru.wikipedia.org/wiki/Список_портов_TCP_и_UDP этой ссылке]. Наконец, создаем буфер для входящих пакетов и задаем ответное сообщение. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
WiFiUDP Udp; | WiFiUDP Udp; | ||
unsigned int localUdpPort = 4210; | unsigned int localUdpPort = 4210; | ||
Строка 38: | Строка 38: | ||
Установив соединение, начинаем прослушивать входящие пакеты. | Установив соединение, начинаем прослушивать входящие пакеты. | ||
<syntaxhighlight lang="c | <syntaxhighlight lang="c"> | ||
Udp.begin(localUdpPort); | Udp.begin(localUdpPort); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 48: | Строка 48: | ||
Для ожидания входящего [[UDP-пакет]]а требуется вот такой код: | Для ожидания входящего [[UDP-пакет]]а требуется вот такой код: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
int packetSize = Udp.parsePacket(); | int packetSize = Udp.parsePacket(); | ||
if (packetSize) | if (packetSize) | ||
Строка 71: | Строка 71: | ||
После получения каждого пакета [[скетч]] будет отправлять обратно подтверждающий пакет. | После получения каждого пакета [[скетч]] будет отправлять обратно подтверждающий пакет. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); | Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); | ||
Udp.write(replyPacekt); | Udp.write(replyPacekt); | ||
Строка 83: | Строка 83: | ||
Полная версия [[скетч]]а показана ниже: | Полная версия [[скетч]]а показана ниже: | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <ESP8266WiFi.h> | #include <ESP8266WiFi.h> | ||
#include <WiFiUdp.h> | #include <WiFiUdp.h> | ||
Строка 145: | Строка 145: | ||
Загрузите [[скетч]] на модуль и откройте монитор порта. В нем должно появиться подтверждение, что [[ESP8266]] подключился к [[WiFi]] и начал прослушивать [[UDP-пакет]]ы: | Загрузите [[скетч]] на модуль и откройте монитор порта. В нем должно появиться подтверждение, что [[ESP8266]] подключился к [[WiFi]] и начал прослушивать [[UDP-пакет]]ы: | ||
<syntaxhighlight lang="html5 | <syntaxhighlight lang="html5"> | ||
Connecting to twc-net-3 ........ connected | Connecting to twc-net-3 ........ connected | ||
Now listening at IP 192.168.1.104, UDP port 4210 | Now listening at IP 192.168.1.104, UDP port 4210 | ||
Строка 168: | Строка 168: | ||
Теперь нажмите на кнопку '''«Send»'''. Сразу после этого в мониторе порта должно появиться следующее: | Теперь нажмите на кнопку '''«Send»'''. Сразу после этого в мониторе порта должно появиться следующее: | ||
<syntaxhighlight lang="html5 | <syntaxhighlight lang="html5"> | ||
Received 12 bytes from 192.168.1.106, port 55056 | Received 12 bytes from 192.168.1.106, port 55056 | ||
UDP packet contents: Hello World! | UDP packet contents: Hello World! |
Текущая версия от 12:51, 18 июня 2023
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 смотрите по [ссылка этой ссылке].