Go Down

Topic: [Résolu] Changer l'adresse IP du W5100 dans le setup() (Read 861 times) previous topic - next topic

Pac2Kro

Dec 28, 2012, 11:28 pm Last Edit: Dec 29, 2012, 01:29 pm by Pac2Kro Reason: 1
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?

infobarquee

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

Pac2Kro

Un exemple valant mieux qu'un long discourt.
Code: [Select]
#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:
Quote
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.

infobarquee

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

Pac2Kro

#4
Dec 29, 2012, 10:19 am Last Edit: Dec 29, 2012, 10:21 am by Pac2Kro Reason: 1
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.

infobarquee

pourquoi ne passes tu pas par ton lan directement?

Pac2Kro

#6
Dec 29, 2012, 10:40 am Last Edit: Dec 29, 2012, 11:16 am by Pac2Kro Reason: 1
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.

Pac2Kro

#7
Dec 29, 2012, 01:26 pm Last Edit: Dec 29, 2012, 05:04 pm by Pac2Kro Reason: 1
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

Go Up