ESP8266 : Changer l'adresse IP

Je ne sais pas si c'est possible : changer d'IP un ESP8266.

Voila le scénario : je crée un serveur sur un ESP8266 (un module Sonoff S26, prise connectée) auquel je donne une adresse IP fixe (ex : 192.168.0.51). ça, ça marche.

IPAddress staticIP(192, 168, 0, 51 + ThisSonoff); //ESP static ip
IPAddress gateway(192, 168, 0, 254); //IP Address of WiFi Router
IPAddress subnet(255, 255, 255, 0);  //Subnet mask
IPAddress dns(192, 168, 0, 254);     //DNS

...

  WiFi.config(staticIP, dns, gateway, subnet);
  WiFi.mode(WIFI_STA); //WiFi mode station (connect to wifi router only
  WiFi.begin(ssid, password);

Je voudrais maintenant changer cette adresse IP en une autre adresse, disons 192.168.0.52

Pour ça, je déconnecte le wifi

  WiFi.disconnect();

puis je déclare la nouvelle ip (tableau de 4 bytes) :

  IPAddress staticIP(ip[0],ip[1],ip[2],ip[3]); //ESP static ip

et je refais les mêmes instructions qu'avant...

Et bien, lorsque j'affiche la nouvelle adresse IP, elle n'a pas changé : c'est toujours l'ancienne.
Qu'est-ce que j'ai loupé ?

Il faut peut être couper plus profondément ?
l'ESP8266 s'accroche ferme à la dernière configuration WiFi réussie !!
essaies (sans garantie !!) par :

WiFi.mode(WIFI_OFF);
puis .
WiFi.mode(WIFI_STA);

Quel est l'intérêt pour une station, avec son adresse MAC constante, de chercher à changer d'adresse IP 'au vol' ?......pas certain que la box apprécie cette gymnastique.....

Pas d'intérêt particulier, c'est pour le sport. Si ça ne marche pas, j'abandonnerai...

Bonjour,
Pas d'ESP sous la main.
Mais lorsque tu faits :

IPAddress staticIP(ip[0],ip[1],ip[2],ip[3]); //ESP static ip

Tu faits bien suivre de :

WiFi.config(staticIP, dns, gateway, subnet);
WiFi.mode(WIFI_STA); //WiFi mode station (connect to wifi router only
WiFi.begin(ssid, password);

As-tu fait un essai avec une adresse en dur en remplaçant ip[0] à ip[3] par des valeurs numériques ?
J'ai déjà eu des problèmes avec ce genre de situation.

Oui, je fais les instructions dans cet ordre.
Non, je n'ai pas essayé en dur, je vais tester.

et sur ta box les 4 baux statiques ont été activés ?
bail statique Fbox.jpg

bail statique Fbox.jpg

ça ne marche pas mieux en dur, je laisse tomber.
je vais regarder ces baux statiques, c'est quoi ?

ça peut 'faire la différence' : ta box aurait la consigne impérative de toujours attribuer une adresse ip déterminée à une station (identifiée par son adresse MAC individuelle)

Sans bail statique la box décide peut être de réattribuer l'adresse ip précédente (à adresse MAC constante) malgré ta demande formulée dans le code Arduino (simple hypothèse, je ne connais pas en détail le fonctionnement du serveur DHCP !!)

Aucun bail statique activé sur ma freebox.

en fait , par 'sport' tu cherches un peu à brouiller les pistes (paires MAC-IP) , il faut aider la box a suivre 'ton' schéma !

Bonjour,

Essai en ajoutant un delay(100) après les wifi.mode().
J'ai eu des problèmes de plantage dans un projet.

Dans mon cas, je ne changeais pas d'ip mais je coupais le WiFi pour le réactiver seulement en cas de besoin.

ça marche pas !

Voici le code :

      // change IP address accordingly
      WiFi.mode(WIFI_OFF);
      WiFi.disconnect();
      IPAddress staticIP(192, 168, 0, 52 + ThisSonoff); //ESP static ip
      wifiConnect();

et

void wifiConnect() {
  // Connexion wifi
  Serial.println();
  Serial.print("Connecting to ");
  Serial.print(ssid);

  WiFi.hostname(deviceName[ThisSonoff]);   // DHCP Hostname (useful for finding device for static lease)
  WiFi.config(staticIP, dns, gateway, subnet);
  WiFi.mode(WIFI_STA); //WiFi mode station
  delay(100);
  WiFi.begin(ssid, password);
  // connexion  en cours ...
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  // Wifi connected, blink led
  Serial.println("WiFi is connected");
  ledBlink(5, 200);

  server.begin();
  Serial.print("Use this URL for connection : http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
}

avec les define

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

Des idées ?

Il faut inverser wifi.mode(WIFI_OFF) et wifi.disconnect().

Ajoute aussi un delay après wifi.mode(WIFI_OFF).

même avis que Zlika...WIFI_OFF à faire en dernier à la coupure : on se déconnect proprement d'unAP avant d'abandonner le mode Station !

de plus après le WiFi.mode(WIFI_OFF) je voyais d'abord un WiFi.mode(WIFI_STA) avant tout élément nécessaire à la reconnection. il me semble que ton WiFi.mode(WIFI_STA) intervient un peu tard dans la séquence de remise en route de la station WiFi. Je pense qu'à l'inverse de la coupure WIFI_STA arrive en premier au rétablissement.
On se positionne en mode Station avant de tenter la connection,de manière symétrique à la coupure

@Zlika : Toujours rien, l'IP reste à sa valeur précédente : 192.168.0.52 alors que je demande 192.168.0.56

@Al1 : J'essaye avec WiFi.mode(WIFI_STA) avant l'appel à wifiConnect()

Oui, d'accord avec al1fch. Il serait préférable de placer cette instruction en premier avant de manipuler les autres paramètres.

Toujours pareil...

Bonjour

Perso j'insisterais pas trop. Le cas d'usage est borderline.
Les box ont tendance à fixer l'adresse ip d'un même périphérique, même quand on ne le leur demande pas précisément.

Ceci étant dit, qu'est-ce qui t'indiques que l'adresse ip n'a pas changé ?
Si c'est l'ESP lui-même qui t'affiche son adresse ip, tu es peut-être à la merci d'une variable interne dont la réinitialisation n'a pas été prévue dans le core pour ce cas borderline.
Il vaut mieux aller dans le panneau d'admin de la box et consulter les périphériques connectés.

C'est l'instruction

 Serial.print(WiFi.localIP());

qui me l'indique, et quand j'essaye de me connecter sur la nouvelle adresse, elle ne répond pas.

Perso j'insisterais pas trop. Le cas d'usage est borderline.
Les box ont tendance à fixer l'adresse ip d'un même périphérique, même quand on ne le leur demande pas précisément.

Même avis... on demande à une box une continuité , pas le jonglage ou le zapping des adresses ip

Pour de qui est de l'adresse ip réellement attribuée (ou pas attribuée....) le mieux est de demander à la Box elle même