Importation d'IP

Bonsoir à tous.

Je suis entrain de me faire un thermostat connecté; tous les paramètres sont importés depuis deux fichiers textes qui sont insérés grâce à LittleFS.
Le premier fichier contient tous les paramètres pour le fonctionnement du thermostat, et tout fonctionne.
Le second fichier contient les paramètres wifi (SSID, Clé, IP, Mask, Passerelle et DNS).

Le problème vient de l’importation des adresses IP. Tout semble fonctionner correctement : je n’ai pas de message d’erreur et les adresses IP sont remontées comme fonctionnelles grâce à la classe “IPAddress”.

Voilà le code utilisé.

#include <LittleFS.h> // Permet d'écrire dans la mémoire de l'ESP
#include <IPAddress.h>  // Permet la conversion d'un Int en IP valide
#include <ESP8266WiFi.h>  // Permet la connection wifi

int AdresseIP[4][4]; // Contient l'IP, le Mask, la Passerelle et le DNS
int NumLigneConf = 1; // Numéro de la ligne actuelle dans le fichier de configuration des paramètres wifi
String Wifi[2]; // Contient le SSID et la clé de sécurité
String Ligne;  // Ligne lue dans le fichier de configuration
int NbOctets; // Nombre de chiffres dans l'octet (par ex. '3' pour '192')
int i = 0;
int j = 0;
  

void setup() {
  Serial.begin(115200);
  delay(1500);
  
  if (!LittleFS.begin()){ // Erreur lors du chargement du système de fichier
    Serial.println("Erreur lors de l'ouverture du fichier de paramétrage...");
    return;
  }else{
    RecupConfigIP();
    ConnectionWifi();
  }
}

void loop() {
}


//####################################################################
//#               Récupération de la configuration IP                #
//####################################################################
void RecupConfigIP(){
  File Fichier = LittleFS.open("/ParametresWifi.txt", "r");  // Ouverture du fichier en lecture seule
    
  if (!Fichier){  // Erreur lors de l'ouverture du fichier
    Serial.println("Erreur lors de l'ouverture du fichier...");
    return;
  }else{
    while (Fichier.available()){
      Ligne = Fichier.readStringUntil('\n');  // Récupération de la ligne en cours
      Ligne.remove(Ligne.indexOf('\t'), Ligne.indexOf('\n')); // On supprime tout ce qui se trouve après la tabulation
      Serial.println(Ligne);
      if (NumLigneConf < 3){
        Wifi[NumLigneConf - 1] = Ligne;
      }else{
        for (j=0; j<4; j++){  // On boucle 4 fois car il y a 4 octets
          AdresseIP[i][j] = (Ligne.substring(0, Ligne.indexOf('.')).toInt());
          if (j<3){
            if (AdresseIP[i][j] < 256){  // L'IP ne peut pas avoir un octet supérieur à 255
              NbOctets = 3;
            }
            if (AdresseIP[i][j] < 100){
              NbOctets = 2;
            }
            if (AdresseIP[i][j] < 10){
              NbOctets = 1;
            }
            Ligne.remove(0, (NbOctets + 1)); // On ajoute '1' car il y a un '.' entre chaque octet
            Serial.println(Ligne);
          }
        }
        i++;  // On passe à la ligne suivante du tableau
      }
      NumLigneConf ++;
    }

    Fichier.close();
    Serial.println("Importation des IP réussie !");

    for (i=0; i<4; i++){
      for (j=0; j<4; j++){
        Serial.print("Tableau ");
        Serial.print(i);
        Serial.print("|");
        Serial.print(j);
        Serial.print(" : ");
        Serial.println(AdresseIP[i][j]);
      }
    }
  }
}


//####################################################################
//#            Connection au wifi et attribution de l'IP             #
//####################################################################
void ConnectionWifi(){
  IPAddress IP(AdresseIP[0][0],AdresseIP[0][1],AdresseIP[0][2],AdresseIP[0][3]);
  IPAddress Mask(AdresseIP[1][0],AdresseIP[1][1],AdresseIP[1][2],AdresseIP[1][3]);
  IPAddress Gateway(AdresseIP[2][0],AdresseIP[2][1],AdresseIP[2][2],AdresseIP[2][3]);
  IPAddress DNS(AdresseIP[3][0],AdresseIP[3][1],AdresseIP[3][2],AdresseIP[3][3]);
  
  Serial.print("IP : ");
  Serial.println(IP);
  Serial.print("Mask : ");
  Serial.println(Mask);
  Serial.print("Passerelle : ");
  Serial.println(Gateway);
  Serial.print("DNS : ");
  Serial.println(DNS);
  
  Serial.print("Connection en cours");
  WiFi.begin(Wifi[0], Wifi[1]);  // Se connecte au wifi
  //WiFi.config(IP, Mask, Gateway, DNS);  // Affecte une IP fixe au wifi
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("Connecté !!");
  Serial.println(WiFi.localIP());
}

J’ai été obligé de commenter la ligne “WiFi.Config” car le wifi ne se connectait pas.

Auriez-vous une idée de l’origine du problème?

Merci d’avance pour votre aide.

Selon la doc de la librairie Wifi les arguments de config sont:
WiFi.config(ip, dns, gateway, subnet);
Oupss, j'avais pas fait attention au 8266

Même si les 2 options sont possibles, il me parait plus logique d'appeler config() avant begin()

Attention, pour un ESP8266, l'ordre des paramètres est différent de celui de l'Arduino, pointé par fdufnews :

//The argument order for ESP is not the same as for Arduino. However, there is compatibility code under the hood
//to detect Arduino arg order, and handle it correctly. Be aware that the Arduino default value handling doesn't
//work here (see Arduino docs for gway/subnet defaults). In other words: at least 3 args must always be given.
 
bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);

Il semble que l'ordre des instructions qui suit fonctionne bien :

WiFi.mode(WIFI_STA);
WiFi.hostname(deviceName);      // DHCP Hostname (useful for finding device for static lease)
WiFi.config(staticIP, gateway, subnet);  // (DNS not required)
WiFi.begin(ssid, password);

On voit aussi parfois le mode entre config et begin

J'ai placé le WiFi.config juste avant le WiFi.begin comme préconisé, mais cela ne fonctionnait toujours pas.
Je suis allé dans le fichier de réglages et j'ai remis la clé de sécurité du wifi en clair (je l'avais encodée en Base64) et là ça fonctionne.
C'est bizarre car lors de mes tests, la clé encodée en Base64 fonctionnait correctement...
Sans mettre le DNS fonctionne aussi, par contre j'ai été obligé de le rajouter car l'heure en NTP ne remontait pas. Avec le DNS elle est bien remontée.

Merci pour l'aide :slight_smile:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.