Go Down

Topic: Paramètres de connection Wifi sur carte sd (Read 571 times) previous topic - next topic

Claude56

Bon j'essaye d'avancer dans ma compréhension des char mais il y a toujours quelque chose en plus : [ ] par exemple, ou en moins * par exemple pour le lien donné précédemment.
 Pour l'instant je n'ai pas réussi à trouver une doc qui soit vraiment exhaustive sur le sujet.

Sinon la bonne nouvelle c'est maintenant le code compile.

La mauvaise nouvelle c'est que la connexion wifi ne se fait pas. Je pense que les arguments ssid et/ou password ne sont pas corrects car avec la connexion se fait avec le même code si on utilise les identifiants provenant du code au lieu de ceux provenant de la carte sd.

Pourtant ce je vois en sortie de Serial.print est identique.

Je vais tenter d'autres méthodes pour comparer les chaines .  strcmp( ssid, ssid2) par exemple

Claude56

Dans les deux cas (ssid et password) la comparaison avec strcmp () me retourne la 13 .
Si j'ai bien compris ce retour est la différence entre les valeurs ASCII à l'emplacement où les chaines deviennent différentes.
est ce que cela veut dire que l'une des deux chaines comparées se termine par /0 et l'autre par CR (13 en ascii) ?

dbrion06

readStringUntil('\n') doit lire jusqu'à \n inclus (je l'interprète comme ça; la doc n'est pas claire)
Si mon interprétation est valide (et j'espère qu'il n'y a pas de '\r' pour compliquer les choses), le derneir caractère lu est donc \n (et derrière, il y a \0)
la chaine c qui en est déduite devrait se terminer par \0 et non par \n
chaine[strlen[chaine) -2 ] = '\0' ; // devrait règler le problème..

hbachetti

#18
Apr 02, 2019, 03:47 pm Last Edit: Apr 02, 2019, 03:48 pm by hbachetti
Non, j'ai regardé dans le code, le '\n' n'est pas inclus.

Je fais tilt en retard :

Si tu es sous Windows, un éditeur comme notepad ajoute '\r' + '\n' à la fin de chaque ligne.

Conserve quand même le readStringUntil('\n') car le '\n' sera présent quel que soit l'éditeur.

Quand la lecture de tes paramètres SD est faite :

Code: [Select]

  // trim() sur la String
  wifiSSID = myFile.readStringUntil('\n');
  wifiSSID.trim();                     // ça enlève les blancs et je pense aussi les '\n' et '\r'
  ssid = wifiSSID.c_str();


Fais la même chose pour password.
C'est juste un soupçon.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Si c'est un soupçon, c'est bien trouvé:

:trim retire les espaces en début et en fin de chaîne; pour ce faire, il fait appel à isspace, dont le manuel dit "man isspace"
Quote
RETURNS
       `isspace'  returns  non-zero if C is a space, tab, carriage return, new
       line, vertical tab, or formfeed (`0x09'-`0x0D', `0x20').
Si les fonctions liées à l'IDE Arduino obeissent au manuel, on peut être sûr que les \n et \r éventuels seront enlevés....

hbachetti

Oui j'ai fait un essai, c'est bien le cas.

C'est vrai que quand on travaille sous LINUX, les fins de lignes sont des '\n'. Sous Windows c'est souvent '\r' et '\n', et cela dépend de l'éditeur.
Mais comme je suppose du Windows pour ce projet ...

Il est fort probable que WiFi.begin n'apprécie pas un '\r' qui traîne en fin de ssid ou de password.
On va attendre confirmation.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Est ce qu'il existe en standard une fonction qui afficherait , pour un c_str() donné, la valeur (en hexa ou decimal) de chaque caractère, permettant de voir les charactères "invisibles" qui peuvent faire tourner en bourrique ?

du genre (non testé)

for (uint8_t iii = 0; iii < strlen(truc.c_str();  iii++){
  Serial.println(truc.c_str()[iii], HEX);
}

hbachetti

Au vu des méthodes de la classe Print je ne pense pas.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Claude56

Bonsoir,

j' ai fait la modif en placant les 2 trim ()
Code: [Select]
wifiSSID.trim();  // enlève les espaces au début et fin de chaines
   wifiPass.trim();


Dans les deux cas (ssid et password) la comparaison avec strcmp () me retourne 0 . Mon code précédent fonctionnait aussi mais trim est plus simple.

Après la bonne nouvelle la mauvaise . Pour obtenir une connexion wifi il faut que je neutralise la partie de mon code (voir ci-dessous) qui gère la carte sd et le traitement des données obtenues.  Les identifiants de connexion sont alors soit écrits soit directement dans le Wifi.begin, soit à partir de const char *ssid2      = "Livebox-XXXX"; et const char *password2      = "YYYYYY"; déclarés en global avant le setup. 
Code: [Select]


/*
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  // open the file. note that only one file can be open at a time,so you have to close this one before opening another.
  File myFile = SD.open("wifi.txt");

  // if the file is available, write to it:
  if (myFile) {
    while (myFile.available()) {
      //Serial.write(myFile.read());
      wifiSSID = myFile.readStringUntil('\n');  // copie la chaine jusqu'au retour chariot
      wifiPass = myFile.readStringUntil('\n');
  Serveur = myFile.readStringUntil('\n');
 
   wifiSSID.trim();  // enlève les espaces au début et fin de chaines
   wifiPass.trim();
 
ssid = wifiSSID.c_str();
password=wifiPass.c_str();
 
    }
    myFile.close();
}
 
int resultat = strcmp( ssid, ssid2 ) ;
Serial.println (resultat);

int resultat2 = strcmp(  password, password2 ) ;
Serial.println (resultat2);

        Serial.println(""); 

*/


Claude56

Ca y est, ça fonctionne .

En fait le wemos comme apparemment tout les ESP8266 reste connecté au wifi même plusieurs heures après avoir été débranché. Ce qui évidemment d'aide pas aux tests de connexion répétés .

J'ai donc ajouté un WiFi.disconnect();  ce qui permet de teste la connexion plusieurs fois de suite mais aussi de changer de réseau wifi quand plusieurs réseaux sont présents.

Merci à tous pour votre aide et en particulier à hbachetti


J'ai également réussi à faire fonctionner WiFiManager . Mon code ne compilait pas et les différents exemples de librairies "WifiManager" ne le faisait pas plus.

La solution est a chercher ici : https://github.com/tzapu/WiFiManager/issues/576

Il faut aller jusqu'en bas de la page pour trouver un lien pour télécharger un correctif et remplacer le WifiManager.cpp




al1fch

#25
Apr 04, 2019, 09:17 am Last Edit: Apr 04, 2019, 09:20 am by al1fch
Bonjour
Quote
Quote
En fait le wemos comme apparemment tout les ESP8266 reste connecté au wifi même plusieurs heures après avoir été débranché. Ce qui évidemment d'aide pas aux tests de connexion répétés .
En fait l'ESP8266 conserve par défaut dans une mémoire non volatile les paramètres du dernier point d'accès auquel il s'est connecté avec succès. A défaut d'effacement de cette mémoire la conservation est illimitée.

Merci pour le lien vers le correctif à apporter à WiFiManager en attendant sa mise à jour

CelticLord

Entre parenthèses, ca fait deja un moment que je t ai dit d utiliser wifimanager... et effectivement le ssid password de la dernière connection effectuée sont stockés en spiff

Go Up