[Résolu] Changer l'adresse IP du W5100 dans le setup()

Je cherche à changer l'IP du W5100 dans le setup() du sketch.

Pour ça j'affecte une ip avec un Ethernet.begin(mac, IP).

Un Serial.println(Ethernet.localIP()) me confirme la bonne affectation de l'IP.

J'envoie quelques trames UDP en broadcast avec une serie de : udp.beginPacket(IPBroadcast, udpPort) udp.write("-----") udp.endPacket() Wireshark me confirme le bon envoi des paquets UDP.

Je change l'IP avec un Ethernet.begin(mac, autreIP).

Un Serial.println(Ethernet.localIP()) me confirme le changement d'IP. Par contre, les trames : udp.beginPacket(IPBroadcast, udpPort) udp.write("-----") udp.endPacket() ne passent plus (plus de trace dans Wireshark).

Y a t'il quelque chose de plus à réinitialiser ou le changement d'IP à chaud est impossible?

bonjour, tu es toujours dans la même plage ip? ex: 192.168.1.xxx

Un exemple valant mieux qu’un long discourt.

#include <SPI.h> 
#include <Ethernet.h>
#include <EthernetUDP.h>

const unsigned int udpPort = 30666;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x01, 0x01, 0x01 };
IPAddress IPgateDNS(10, 0, 0, 1);
IPAddress IP2(10, 0, 0, 2);
IPAddress IP3(10, 0, 0, 3);
IPAddress mask(255, 0, 0 ,0);
IPAddress broadcast(10, 255, 255, 255);
unsigned long monTimer = 0;
byte maBoucle = 0;
EthernetUDP udp;

void udpPacket(void);

void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, IP2, IPgateDNS, IPgateDNS, mask);
  udp.begin(udpPort);
  udpPacket();
  while(Ethernet.localIP()==IP2)
  {
    if (millis()-monTimer>10000)
    {
      monTimer=millis();
      maBoucle++;
      Serial.println("Boucle");
      Serial.println(Ethernet.localIP());
      if (maBoucle>2)
      {
        Ethernet.begin(mac, IP3, IPgateDNS, IPgateDNS, mask);
      }
      else
      {
        udpPacket();
      }
    }      
  }
  Serial.println("FinBoucle");
  Serial.println(Ethernet.localIP());

  udp.beginPacket(broadcast, udpPort);
  Serial.println("Tag1"); 
  udp.write("VRB");
  Serial.println("Tag2");
  udp.write(mac,6);
  Serial.println("Tag3");
  udp.endPacket();
  Serial.println("Tag4");
}

void loop()
{
 Serial.println("TheEnd");
 delay(15000);
}

void udpPacket(void)
{
  udp.beginPacket(broadcast, udpPort);
  udp.write("ASK");
  udp.write(mac,6);
  udp.endPacket(); 
}

Sortie série:

Boucle
10.0.0.2
Boucle
10.0.0.2
Boucle
10.0.0.2
FinBoucle
10.0.0.3
Tag1
Tag2
Tag3

Je ne passe pas le Tag4.

tu n'aurais pas un pc qui aurait la même ip?

Merci pour tes réponses.

Mon LAN est en 192.168.x.y

LAN-------en1-MacBook-en0--------ArduinoEthernetR3

en1 192.168.x.y en0 10.0.0.1

Pas d'autre équipement sur le sous réseau 10.255.255.255.

pourquoi ne passes tu pas par ton lan directement?

Pour l'instant je suis en mode "plateforme de développement", je ne souhaite pas perturber mon LAN. Mon projet est que plusieurs arduino puissent s'auto-affecter des adresses IP lorsque le serveur DHCP n'est pas joingnable en se découvrant les uns les autres via des trames UDP. Je sais que les ip pourraient être affectées dans le sketch mais ça ne serait pas marrant.

Je pense que le problème vient plutôt de la librairie EthernetUDP.h que j'utilise mal ou qui ne permet pas le changement d'IP à chaud.

Bon le problème est résolu, en allant farfouiller dans EthernetUDP.h, j'ai trouvé la class stop() qui n'est pas documentée sur le site arduino.

Donc après le : Ethernet.begin(mac, IP3, IPgateDNS, IPgateDNS, mask); Je fais : udp.stop(); //ferme le socket udp.begin(udpPort); //ré-ouvre le socket