Je suis toujours dans le cas ou le serveur DHCP n'est pas joignable. Sur une remise en tension après coupure de courant, toutes les cartes démarrent ensemble. Toutes ont par défaut l'adresse IP 10.0.0.0, l'IP 10.0.0.1 est réservée à la passerelle Linux. Lorsque une demande ASK arrive, si les deux cartes demandent la même IP, la carte compare son adresse MAC avec celle de l'autre carte, si son adresse MAC est plus petite, elle demande à l'autre carte de changer d'IP par la demande CHG.
void chg(void)
{
byte tempsDeFct[4];
byte i;
udp.beginPacket(monBroadcast, udpPort);
udp.write("CHG");
udp.write(maMac,6);
millis2JHMS(millis(),tempsDeFct);
udp.write(tempsDeFct,4);
for (i=0;i<4;i++)
{
udp.write(sonIP[i]);
}
udp.write(saMac,6);
udp.endPacket();
}
La commande CHG est aussi appliquée si la carte a déjà son IP de choisie et que l'autre carte veut la même IP.
Comparaison des deux adresses MAC.
boolean plusGrand(byte *tmac1, byte *tmac2)
{
byte i;
for(i=0;i<6;i++)
{
if ( tmac1[i] < tmac2[i] )
{
return false;
}
if ( tmac1[i] > tmac2[i] )
{
return true;
}
}
}
A ce stade, je suis tombé sur un problème puisque je commençais par affecter une première IP.
IPAddress IPTemp(10, 0, 0, 0);
IPAddress IPgateDNS(10, 0, 0, 1);
IPAddress monIP(10, 0, 0, 2);
IPAddress monBroadcast(10, 255, 255, 255);
IPAddress monMask(255, 0, 0 ,0);
Ethernet.begin(maMac, IPTemp, IPgateDNS, IPgateDNS, monMask);
Et lorsque la carte, pour une même monIP, n'avait pas reçu de réponse à ses 10 demandes ASK, je lui changeais son IP avec :
Ethernet.begin(maMac, monIP, IPgateDNS, IPgateDNS, monMask);
Lors d'envoi de nouvelles trames UDP, le programme restait bloqué sur l'instruction
udp.endPacket();
Le changement d'IP à chaud ne lui faisait pas plaisir.
En regardant dans le code de la librairie EthernetUDP il y a une instruction qui n'est nulle part commentée : stop()
Il faut donc faire:
Ethernet.begin(maMac, monIP, IPgateDNS, IPgateDNS, monMask); //changement IP à chaud
udp.stop(); //stopper
udp.begin(udpPort); //redémarrer