NodeMCU en español
NodeMCU - Juan Antonio Villalpando
-- Tutorial de NodeMCU en español --
Volver al índice del tutorial NodeMCU
____________________________
118.- Wemos D1 R32 ESP32. Envía y recibe por UDP.
- El envío de información por el protocolo UDP no tiene confirmación de llegada, en el TCP/IP el receptor comprueba si han llegado todos los paquetes y en caso de que falte alguno, se lo vuelve a pedir al transmisor.
- El UDP tiene varias modalidades.
- En Unicast se envía la información a un cliente.
- En Broadcast a toda la red.
- En Multicast a algunos clientes.
- Nosotros utilizaremos el Unicast, indicaremos la IP a la que va dirigida la información.
_______________________________________________________
1.- El ESP32 envía información por UDP.
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/examples/WiFiUDPClient/WiFiUDPClient.ino
- En este ejemplo la información irá al 192.168.1.8 que será la otra tarjeta, en mi caso una tarjeta con ESP8266
envia.ino |
/*
* This sketch sends random data over UDP on a ESP32 device
*
*/
#include <WiFi.h>
#include <WiFiUdp.h>
// IP address to send UDP data to:
// either use the ip address of the server or
// a network broadcast address
const char * udpAddress = "192.168.1.8";
const int udpPort = 3333;
//Are we currently connected?
boolean connected = false;
//The udp library class
WiFiUDP udp;
void setup(){
// Initilize hardware serial:
Serial.begin(115200);
//Connect to the WiFi network
connectToWiFi("Nombre_de_tu_red_wifi", "La_clave_de_tu_red_wifi");
}
void loop(){
//only send data when connected
if(connected){
//Send a packet
udp.beginPacket(udpAddress,udpPort);
udp.printf("Seconds since boot: %u", millis()/1000);
udp.endPacket();
}
//Wait for 1 second
delay(1000);
}
void connectToWiFi(const char * ssid, const char * pwd){
Serial.println("Connecting to WiFi network: " + String(ssid));
// delete old config
WiFi.disconnect(true);
//register event handler
WiFi.onEvent(WiFiEvent);
//Initiate connection
WiFi.begin(ssid, pwd);
Serial.println("Waiting for WIFI connection...");
}
//wifi event handler
void WiFiEvent(WiFiEvent_t event){
switch(event) {
case SYSTEM_EVENT_STA_GOT_IP:
//When connected set
Serial.print("WiFi connected! IP address: ");
Serial.println(WiFi.localIP());
//initializes the UDP state
//This initializes the transfer buffer
udp.begin(WiFi.localIP(),udpPort);
connected = true;
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("WiFi lost connection");
connected = false;
break;
}
}
|
_______________________________________________________
2.- El ESP8266 recibe información por UDP.
- En este caso voy a utilizar otro chip, concretamente el ESP8266
- Será la dirección 192.168.1.8
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/udp-examples.html
- Este código es válido para el ESP8266 como para el ESP32 cambiando dos líneas:
#include <WiFi.h>
...
udp.print(replyPacket);
recibe.ino |
#include <ESP8266WiFi.h>
// #include <WiFi.h> // Si utilizas el ESP32, debes ponerlo así.
#include <WiFiUdp.h>
const char* ssid = "Nombre_de_tu_red_wifi";
const char* password = "La_clave_de_tu_red_wifi";
WiFiUDP Udp;
unsigned int localUdpPort = 3333; // local port to listen on
char incomingPacket[255]; // buffer for incoming packets
char replyPacket[] = "Hi there! Got the message :-)"; // a reply string to send back
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.printf("Connecting to %s ", ssid);
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);
}
void loop()
{
int packetSize = Udp.parsePacket();
if (packetSize)
{
// receive incoming UDP packets
Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = 0;
}
Serial.printf("UDP packet contents: %s\n", incomingPacket);
// send back a reply, to the IP address and port we got the packet from
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(replyPacket);
// Udp.print(replyPacket); // Si utilizas el ESP32, debes ponerlo así.
Udp.endPacket();
}
}
|
_______________________________________________________
3.- Desde Windows enviamos un paquete UDP al ESP8266.
- En el ESP8266, dejamos el mismo código, el recibe.ino
- Bajamos esta aplicación: https://packetsender.com/download#show
recibe_ESP32.ino |
#include <WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "Nombre_de_tu_red_wifi";
const char* password = "La_clave_de_tu_red_wifi";
WiFiUDP Udp;
unsigned int localUdpPort = 3333;
char incomingPacket[255]; // Buffer
char replyPacket[] = "Mensaje recibido.";
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.printf("Conectando con %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" Conectado.");
Udp.begin(localUdpPort);
Serial.printf("Escuchando la IP %s, puerto UDP %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}
void loop()
{
int packetSize = Udp.parsePacket();
if (packetSize)
{
// Paquete recibido
Serial.printf("Recibido %d bytes de %s, puerto %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = 0;
}
Serial.printf("Contenido del paquete: %s\n", incomingPacket);
// Envía una respuesta.
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.print(replyPacket);
Udp.endPacket();
}
}
|
___________________________________
4.- Otro ejemplo.
https://www.esp8266.com/viewtopic.php?f=29&t=4006
servidor.ino |
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp;
char packetBuffer[255];
unsigned int localPort = 9999;
const char *ssid = "Your SSID";
const char *password = "Your password";
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, password);
Udp.begin(localPort);
}
void loop() {
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.print("Recibido(IP/Size/Data): ");
Serial.print(Udp.remoteIP());
Serial.print(" / ");
Serial.print(packetSize);
Serial.print(" / ");
Serial.println(packetBuffer);
Udp.beginPacket(Udp.remoteIP(),Udp.remotePort());
Udp.write("recived: ");
Udp.write(packetBuffer);
Udp.write("\r\n");
Udp.endPacket();
}
}
|
cliente.ino |
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp;
const char *ssid = "Your SSID"; //
const char *password = "Your Password";
char packetBuffer[255];
unsigned int localPort = 9999;
IPAddress ipServidor(192, 168, 4, 1);
IPAddress ipCliente(192, 168, 4, 10);
IPAddress Subnet(255, 255, 255, 0);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA); // para que solo sea STA y no genere la IP 192.168.4.1
WiFi.config(ipCliente, ipServidor, Subnet);
Udp.begin(localPort);
}
void loop() {
unsigned long Tiempo_Envio = millis();
//ENVIO
Udp.beginPacket(ipServidor,9999);
Udp.write("Millis: ");
char buf[20];
unsigned long testID = millis();
sprintf(buf, "%lu", testID);
Udp.write(buf);
Udp.write("\r\n");
Udp.endPacket();
Serial.print("enviando: ");
Serial.println(buf);
delay(10); // para que le de tiempo a recibir la respuesta al envio anterior
//RECEPCION
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.print("RECIBIDO(IP/Port/Size/Datos): ");
Serial.print(Udp.remoteIP());Serial.print(" / ");
Serial.print(Udp.remotePort()); Serial.print(" / ");
Serial.print(packetSize);Serial.print(" / ");
Serial.println(packetBuffer);
}
Serial.println("");
delay(500);
}
|
___________________________________
5.- Otro ejemplo más.
- Es muy importante que tanto el servidor como el cliente tenga una buena alimentación de potencia.
- Servidor como Punto de acceso.
servidor.ino |
// Juan A. Villalpando
// kio4.com
// Creación de Punto de Acceso
// Envío por UDP
#include <WiFi.h>
#include <WiFiUdp.h>
#include <WiFiAP.h>
WiFiUDP Udp;
char packetBuffer[255];
unsigned int udpPort = 3333;
// Datos del Punto de Acceso
const char* ssid = "Juan";
const char* password = "123456789";
// A quien le va a enviar datos:
const char * udpAddress = "192.168.4.4";
// El udp
WiFiUDP udp;
void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("Configurando Punto de Acceso: ");
Serial.println(ssid);
// Creación del Punto de Acceso.
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.println(myIP);
udp.begin(WiFi.softAPIP(),udpPort);
delay(20);
}
void loop(){
// Envia paquete por UDP
udp.beginPacket(udpAddress,udpPort);
udp.printf("Tiempo: %u", millis()/1000);
udp.endPacket();
delay(5000);
}
|
- Cliente con IP fija.
cliente.ino |
// Juan A. Villalpando
// kio4.com
// Recibe por UDP
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
WiFiUDP Udp;
const char *ssid = "Juan";
const char *password = "123456789";
char packetBuffer[255];
unsigned int localPort = 3333;
// Configuración de la IP estática.
IPAddress local_IP(192, 168, 4, 4);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8); //optional
IPAddress secondaryDNS(8, 8, 4, 4); //optional
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" Conectado.");
if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
Serial.println("Fallo en la configuración.");
}
Udp.begin(localPort);
}
void loop() {
// Recibe datos
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(packetBuffer, 255);
if (len > 0) packetBuffer[len-1] = 0;
Serial.println("IP/Puerto/Tamaño/Mensaje: ");
Serial.print(Udp.remoteIP());
Serial.print(" / ");
Serial.print(Udp.remotePort());
Serial.print(" / ");
Serial.print(packetSize);
Serial.print(" / ");
Serial.println(packetBuffer);
}
delay(500);
}
|
_______________________________
|