Toute ce qui suit était avant que je découvre la librairie EEPROM (mais ça, j'en parlerai après).
L'affectation des adresses IP est prévue grâce à un serveur DHCP (j'aime bien ce type de configuration qui permet de gérer l'ensemble de mes adresses IP dans une seule table). Seulement, que ce passe t'il si il est injoignable ou si il y a une coupure de courant. Au rétablissement du courant, les arduino auront largement finis les 15 requêtes DHCP discover avant que le serveur DHCP soit de nouveau en ligne. Je me suis dit qu'elles devaient être assez grandes pour se débrouiller toutes seules à partir du moment ou elles peuvent discuter ensemble.
D’où la première trame ASK qui dit voici mon adresse MAC, j'aimerai bien prendre cette adresse IP.
ASK MaMACaddress MonTempsDeFct MonIPchoisie/Demande si adresse IP disponible
3 6 4 4 /17 bytes
const byte ASK_BOUCLE=10;
byte askBoucle = ASK_BOUCLE;
IPAddress monIP(10, 0, 0, 2);
IPAddress monBroadcast(10, 255, 255, 255);
byte maMac[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
const unsigned int udpPort = 10666;
..............................................
void ask(void)
{
byte i;
byte tempsDeFct[4];
askBoucle--;
udp.beginPacket(monBroadcast, udpPort);
udp.write("ASK");
udp.write(maMac,6);
millis2JHMS(millis(),tempsDeFct);
udp.write(tempsDeFct,4);
for (i=0;i<4;i++)
{
udp.write(monIP[i]);
}
udp.endPacket();
}
Dans le setup, après 15 DHCP discover infructueux, la fonction ask est appelée un maximum de 10 fois (ASK_BOUCLE) toute les 5 secondes. Sans réponse monIP est affectée à la carte, sinon askBoucle est remise à la valeur ASK_BOUCLE et monIP passe à l'IP suivante.
IPAddress ipPlus1(IPAddress tip)
{
tip[3]++;
if(tip[3] > 254)
{
tip[3] = 1;
tip[2]++;
if(tip[2] > 254)
{
tip[2] = 0;
tip[1]++;
if(tip[1] > 254)
{
tip[3] = 2;
tip[2] = 0;
tip[1] = 0;
}
}
}
return tip;
}