|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

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);
}

 

 

 

_______________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información