Icono del sitio AranaCorp

Comunicación entre dos ESP32 a través de UDP

,

El NodeMCU ESP32 es un pequeño microcontrolador con un chip WiFi. Es posible establecer comunicación entre dos ESP32 cuando utilizan la misma red. En este tutorial, veremos una arquitectura con dos NodeMCUs intercambiando datos utilizando el protocolo UDP.

Si no tiene acceso a un segundo ESP32, puede probar la comunicación utilizando el software Remitente del paquete.

Hardware

Código ESP32 Servidor UDP

Para el microcontrolador Servidor, vamos a crear un servidor que gestione las peticiones de los microcontroladores clientes. Vamos a utilizar la librería WiFi.h, que gestiona el chip WiFi de las tarjetas ESP32, y la librería WiFiUdp.h, que gestiona las peticiones UDP.

N.B.: No olvides cambiar los valores de ssid y password por el nombre y password de la red wifi que quieras utilizar.

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "**********";
const char *password = "**********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP server : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
    udp.beginPacket(udp.remoteIP(), udp.remotePort());
    udp.printf("UDP packet was received OK\r\n");
    udp.endPacket();
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Server Connected] ");
  Serial.println (WiFi.localIP());
}

Una vez cargado el código, puedes recuperar la dirección IP y el puerto de la tarjeta servidor desde el monitor serie y copiarlos en el código cliente (aquí, 192.168.1.97:9999).

ESP32 Código de cliente UDP

En el código del cliente, vamos a conectarnos al servidor utilizando la dirección IP utilizada anteriormente (en este caso 192.168.1.97)

N.B.: No olvide modificar y utilizar los mismos valores de ssid y contraseña que en el módulo Servidor para que las dos tarjetas ESP32 se conecten a la misma red.

#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "******";
const char *password = "********";

void setup() {
  Serial.begin(115200);
  // Connect to Wifi network.
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED){
    delay(500); Serial.print(F("."));
  }
  udp.begin(localPort);
  Serial.printf("UDP Client : %s:%i \n", WiFi.localIP().toString().c_str(), localPort);
}

void loop() {
  int packetSize = udp.parsePacket();
  Serial.print(" Received packet from : "); Serial.println(udp.remoteIP());
  Serial.print(" Size : "); Serial.println(packetSize);
  if (packetSize) {
    int len = udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len - 1] = 0;
    Serial.printf("Data : %s\n", packetBuffer);
  }
  Serial.println("\n");
  delay(500);
  Serial.print("[Client Connected] ");
  Serial.println(WiFi.localIP());
  udp.beginPacket("192.168.1.97", localPort);
  udp.printf("Send millis: ");
  char buf[20];
  unsigned long testID = millis();
  sprintf(buf, "%lu", testID);
  udp.printf(buf);
  udp.printf("\r\n");
  udp.endPacket();
}

N.B.: En este ejemplo, el puerto utilizado en el cliente es el mismo que el puerto utilizado en el servidor. Estos valores pueden ser diferentes.

Resultados

Cuando los microcontroladores se conectan a WiFi y se establece la comunicación entre los dos ESP32, podemos ver que se intercambia información entre las dos tarjetas. Entonces es posible controlar un dispositivo conectado al cliente desde el servidor o viceversa.

Aplicaciones

Fuentes

Salir de la versión móvil