udp-diffusion.ino

Arduino MKR WiFi 1010 · Archivo : udp-diffusion.ino · Lenguaje : Arduino · Uso : Découvrir et discuter entre cartes sur le LAN

Varias MKR WiFi 1010 en la misma red pueden descubrirse sin servidor: este sketch difunde un anuncio cada cinco segundos en broadcast UDP e imprime los de las vecinas. La base de una red de sensores local o de domótica entre iguales.

Hardware

Una Arduino MKR WiFi 1010 (microcontrolador SAMD21, módulo Wi-Fi WINC1500, sin Bluetooth, alimentación USB o LiPo en J6). Dos MKR WiFi 1010 (o una placa + un PC de prueba) en la misma LAN WiFi.

Cableado

Sin cableado; el broadcast 255.255.255.255 funciona en WiFi doméstico clásico (no en redes con clientes aislados).

Funcionamiento

WiFiUDP enlaza el puerto 4210; parsePacket lee los anuncios entrantes, beginPacket a la dirección broadcast los difunde a todos. El uptime detecta una placa que reinicia.

Ejecución

Instala Arduino SAMD Boards y la librería WiFi101, selecciona la placa y carga. El Wi-Fi funciona solo en 2,4 GHz: comprueba que tu punto de acceso no sea solo de 5 GHz.

Variantes

Sustituye el broadcast por una dirección multicast 239.x para atravesar ciertos routers o añade una elección de rol para designar un relé.

udp-diffusion.ino

// Decouverte par broadcast UDP : les MKR WiFi s'annoncent toutes les 5 s.
// Trame : "mkr-<ip courte>;<uptime>" sur le port 4210.
#include <SPI.h>
#include <WiFi101.h>

const char SSID[] = "MonReseau";
const char PASS[] = "motdepassewifi";

WiFiUDP udp;
const int PORT = 4210;
unsigned long dernier = 0;

void setup() {
  Serial.begin(9600);
  WiFi.begin(WPA_PASS_PHRASE, SSID, PASS);
  while (WiFi.status() != WL_CONNECTED) delay(100);
  Serial.println(WiFi.localIP());
  udp.begin(PORT);
}

void loop() {
  // 1) écho des annonces recues
  int taille = udp.parsePacket();
  if (taille) {
    char buf[64];
    int n = udp.read(buf, sizeof(buf) - 1);
    buf[n > 0 ? n : 0] = 0;
    Serial.print(udp.remoteIP());
    Serial.print(" : ");
    Serial.println(buf);
  }
  // 2) annonce periodique en broadcast
  if (millis() - dernier >= 5000) {
    dernier = millis();
    udp.beginPacket(IPAddress(255, 255, 255, 255), PORT);
    udp.print("mkr-");
    udp.print(WiFi.localIP()[3]);
    udp.print(";up=");
    udp.print(millis() / 1000);
    udp.endPacket();
  }
}

← Volver a la ficha