udp-diffusion.ino

Arduino MKR WiFi 1010 · Fichier : udp-diffusion.ino · Langage : Arduino · Usage : Découvrir et discuter entre cartes sur le LAN

Plusieurs MKR WiFi 1010 sur le même réseau peuvent se découvrir sans serveur : ce croquis diffuse une annonce toutes les cinq secondes en broadcast UDP et affiche celles des voisines. La base d'un réseau de capteurs locaux ou d'un système domotique pair à pair.

Matériel requis

Une Arduino MKR WiFi 1010 (microcontrôleur SAMD21, module Wi-Fi WINC1500, pas de Bluetooth, alimentation USB ou LiPo sur J6). Deux MKR WiFi 1010 (ou une carte + un PC testeur) sur le même LAN WiFi.

Câblage

Aucun câblage ; le broadcast 255.255.255.255 fonctionne en WiFi domestique classique (pas en réseau client-isolé).

Fonctionnement

WiFiUDP lie le port 4210 ; parsePacket lit les annonces entrantes, beginPacket vers l'adresse broadcast les diffuse à tous. L'uptime permet de repérer une carte qui redémarre.

Exécution

Installez Arduino SAMD Boards et la bibliothèque WiFi101, sélectionnez la carte, téléversez. Le Wi-Fi fonctionne en 2,4 GHz uniquement : vérifiez que votre point d'accès n'est pas en 5 GHz seul.

Variantes

Remplacez le broadcast par une adresse multicast 239.x pour traverser certains routeurs, ou ajoutez un rôle élection pour désigner un relais.

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

← Retour à la fiche