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();
Terminal de VSCode con PlatformIO mostrando que la ESP32-CAM se ha conectado al WiFi y ha enviado paquetes UDP a Python

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

Código C++, terminal de VSCode y CMD con script de Python. Se muestra que la ESP32-CAM con CPP está enviando paquetes UDP y Python los está recibiendo correctamente

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:

Si el post ha sido de tu agrado te invito a que me sigas para saber cuando haya escrito un nuevo post, haya actualizado algún sistema o publicado un nuevo software. Facebook | X | Instagram | Telegram | También estoy a tus órdenes para cualquier contratación en mi página de contacto