Al comenzar a trabajar con UDP en la ESP32-CAM es importante hacer pruebas básicas al inicio antes de comenzar a transmitir el audio, el video o transmitir audio y video al mismo tiempo.
Necesitamos revisar que la conexión a la red sea WiFi sea correcta así como la IP del receptor.
Para este ejemplo básico de transmisión UDP de la ESP32-CAM a Python vamos a enviar 2 bytes estáticos, solo para probar que el WiFi está bien, que los puertos, direcciones y código son correctos.
Entonces cargamos el código y se va a conectar imprimiendo la IP de la ESP32-CAM. Por ahora no la necesitamos pero es bueno tenerla.
Código de credenciales queda así, está en credenciales.h que
luego vamos a incluir con #include:
#define NOMBRE_RED_WIFI "Tu red wifi"
#define PASSWORD_RED_WIFI "tu contraseña"
Y el main.cpp queda así:
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiUdp.h>
#include "credenciales.h"
#define PUERTO_UDP 12345
#define PUERTO_RECEPTOR_ICS 12345
#define UDP_PACKET_SIZE 2
WiFiUDP udp;
void conectar_wifi()
{
Serial.println("Conectando wifi...");
WiFi.mode(WIFI_STA);
WiFi.disconnect(true, true);
delay(100);
wl_status_t resultado = WiFi.begin(NOMBRE_RED_WIFI, PASSWORD_RED_WIFI);
Serial.printf("El resultado al conectar wifi es %d", resultado);
WiFi.setTxPower(WIFI_POWER_8_5dBm);
while (WiFi.status() != WL_CONNECTED)
{
delay(300);
Serial.print(".");
}
Serial.println(WiFi.localIP());
}
void setup()
{
Serial.begin(115200);
ledcSetup(0, 5000, 8);
ledcAttachPin(4, 0);
conectar_wifi();
udp.begin(PUERTO_UDP);
ledcWrite(0, 128);
delay(1000);
}
void loop()
{
ledcWrite(0, 0);
delay(200);
ledcWrite(0, 1);
static uint8_t buffer[UDP_PACKET_SIZE] = {0xfa, 0x10};
udp.beginPacket("192.168.0.5", PUERTO_RECEPTOR_ICS);
udp.write(buffer, UDP_PACKET_SIZE);
udp.endPacket();
delay(1000);
Serial.println("Escrito");
}
Hay que entender lo que estamos haciendo. Vamos a enviar desde la ESP32-CAM hacia una PC de escritorio que ejecuta Python.
No te preocupes, más adelante vamos a poder enviarlo a cualquier otro dispositivo y lenguaje de programación compatible, pero vamos paso por paso.
Entonces cuando invocamos a beginPacket con
la dirección 192.168.0.5, esta dirección es la IP de escucha
donde está Python, misma que he obtenido con ipconfig en Windows.
El PUERTO_RECEPTOR_ICS es el puerto en donde el programa de Python
escucha paquetes UDP, que sería 12345.
Por ahora la IP de la ESP32-CAM no es relevante, pues no vamos a enviarle nada, solo va a enviar a Python los 2 bytes estáticos y por ello debemos configurar la IP del receptor.
El fragmento de código que hace eso es:
udp.beginPacket("192.168.0.5", PUERTO_RECEPTOR_ICS);
udp.write(buffer, UDP_PACKET_SIZE);
udp.endPacket();

También nota que se está escribiendo Escrito cada cierto tiempo, esto es porque ha escrito el paquete correctamente.
Luego en Python tenemos el receptor que nos va a decir de dónde está recibiendo, así como la cantidad de datos y los datos en sí.
Obviamente en este caso solamente estamos enviando 2 bytes: 0xfa y 0x10

El código Python queda así. Asegúrate de ajustar la IP y puerto tanto en el código de la ESP32-CAM como en el script de Python.
import socket
#Debe coincidir con:
#udp.beginPacket("192.168.0.5", PUERTO_RECEPTOR_ICS);
LOCAL_IP = "192.168.0.5"
# Debe coincidir con
# #define PUERTO_RECEPTOR_ICS 12345
LOCAL_PORT = 12345
# Debe coincidir con
# #define UDP_PACKET_SIZE 2
BUFFER_SIZE = 2
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
sock.bind((LOCAL_IP, LOCAL_PORT))
print(f"Servidor UDP iniciado y escuchando en {LOCAL_IP}:{LOCAL_PORT}")
except Exception as e:
print(f"Error al asignar el socket: {e}")
exit()
while True:
try:
bytes_data, address = sock.recvfrom(BUFFER_SIZE)
print(f"Recibimos {len(bytes_data)} bytes de {address} y son {bytes_data}")
except KeyboardInterrupt:
print("\nCerrando servidor UDP...")
break
except Exception as e:
print(f"Error durante la recepción: {e}")
break
sock.close()
Y una vez que has hecho esta prueba ya puedes moverte a los siguientes tutoriales más avanzados:
- Transmitir audio de micrófono por UDP usando ESP32-CAM
- Transmitir video de OV2640 por UDP usando ESP32-CAM
- Transmitir audio y vídeo por UDP usando ESP32-CAM