udp-diffusion.ino
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();
}
}