Sauvegarder une IP pour client.connect(ip,2000)

Bonjour à tous ,
je reviens vers vous car je Progress en Arduino mais pas encore assez apparemment.
je bloque pour un projet en gros je veut transmettre en 232 l'adresse IP ,que mon esp32 doit prendre pour se connecté a une serveur et le sauvegarder en mémoire .tous fonctionne Nikel a l'exception que l'esp32 ne se connecte plus a mon serveur.

//#include "WiFi.h"
#include <WiFi.h>
#include <Preferences.h>
#include <AM2320.h>
#include <Arduino.h> 
WiFiClient client;
       // the fix IP address of the server
Preferences preferences;
AM2320 th(&Wire);



//#define TFT_GREY 0x5AEB // New colour
#define ADC_EN              14  //ADC_EN is the ADC detection enable port
#define ADC_PIN             34
#define BUTTON_1            35
#define BUTTON_2            0

// identfication du réseau wifi local




String msg = "  ";
int vref = 1100;
int compteurwifi=0;
WiFiClient wifiClient;
float temptemp=0;
String wifitemp="";
String mdptemp="";
int temppause=10000000 ;

byte ip[] = {192,168,0,40 };   //adresse par defaut de mon serveur







float showVoltage()
{
//    static uint64_t timeStamp = 0;
//    if (millis() - timeStamp > 1000) {
//        timeStamp = millis();
        uint16_t v = analogRead(ADC_PIN);
        float battery_voltage = ((float)v / 4095.0) * 2.0 * 3.3 * (vref / 1000.0);
        return battery_voltage;       
 //   }
}






void setup(void) {

  delay(100);
  Wire.begin();
  preferences.begin("myfile", false);
  Serial.begin(115200);
Serial.print(preferences.getUInt("IP1",192));
Serial.print(preferences.getUInt("IP2",192));
Serial.print(preferences.getUInt("IP3",192));
Serial.print(preferences.getUInt("IP4",192));
ip[1]=byte(preferences.getUInt("IP1",192));
ip[2]=byte(preferences.getUInt("IP2",168));
ip[3]=byte(preferences.getUInt("IP3",0));
ip[4]=byte(preferences.getUInt("IP4",22));

String wifitemp = preferences.getString("nomwifi","non trouvé");
String mdptemp=preferences.getString("mdpwifi","non trouvé");
temppause=preferences.getUInt("temppause",1)*1000000;
 #define WIFI_SSID wifitemp.c_str()
  #define WIFI_PASSWORD mdptemp.c_str()
  String WifiSTR="";

  
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    WifiSTR = WifiSTR + ".";
    Serial.print(WifiSTR);
    ++compteurwifi;
    if (compteurwifi>20){
      break;
    }
    delay(200);
  }
  if(WiFi.status() == WL_CONNECTED){
  Serial.println("connecté");
  }
  String nomwifi="";
  String mdpwifi="";
  preferences.end();
  delay(200);
 
}

void loop() {
  temptemp=showVoltage();
if (temptemp<4.7) {
switch(th.Read()) {
case 2:
  //tft.println(" CRC failed");
break;
case 1:
  //tft.println(" Sensor offline");
break;
case 0:
  client.connect(ip,2000);   // Connection to the server
  client.print(WiFi.macAddress());
  Serial.println(WiFi.macAddress());
  client.print("@@@");
  Serial.println("@@@");
  client.print(th.cTemp);
  Serial.println(th.cTemp);
  client.print("@@@");
  Serial.println("@@@");
  client.print(th.Humidity);
  Serial.println(th.Humidity);
  client.print("@@@");
  Serial.println("@@@");
  delay(100);
  
  client.print(String(temptemp));
  Serial.println(String(temptemp));
  delay(100);
  client.print("\r");
  Serial.println("\r");
  client.flush();
  client.stop();
  delay(100);
  esp_sleep_enable_timer_wakeup(temppause);
  esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);
  esp_deep_sleep_start();
break;
}
} 


if (Serial.available() ) 
{ 
msg = Serial.readString(); //Stocke le message sous forme de String dans msg
int longueur=msg.length(); //On calcul la longueur
 msg=msg.substring(0,longueur-2);
Serial.print("--");
Serial.print(msg); //Puis votre message
Serial.println("--");

////enregistre le SSID
if (msg.indexOf("@wifi")>0)
{
preferences.begin("myfile", false);
preferences.putString("nomwifi",msg.substring(6));//
preferences.end();
Serial.println("enregistrer");
}

///demande du SSID
if (msg.indexOf("@?wifi")>0)
{
preferences.begin("myfile", false);
Serial.print("''");
Serial.print(preferences.getString("nomwifi","non trouvé"));
Serial.println("''");
 preferences.end();
}


if (msg.indexOf("@mdp")>0){
preferences.begin("myfile", false);
preferences.putString("mdpwifi",msg.substring(5));//
preferences.end();
Serial.println("enregistrer");
}
if (msg.indexOf("@?mdp")>0){
preferences.begin("myfile", false);
Serial.print("''");
Serial.print(preferences.getString("mdpwifi","non trouvé"));
Serial.println("''");
preferences.end();
}

if (msg.indexOf("@temppause")>0){
String tempmsg=msg.substring(11);
preferences.begin("myfile", false);
preferences.putUInt("temppause",tempmsg.toInt());//
preferences.end();
temppause=tempmsg.toInt()*1000000;
Serial.println("enregistrer");
}
if (msg.indexOf("@?temppause")>0){
preferences.begin("myfile", false);
Serial.print("''");
Serial.print(preferences.getUInt("temppause",0));
Serial.println("''");
preferences.end();
}

if (msg.indexOf("@?mac")>0){
Serial.print("''");
Serial.print(WiFi.macAddress());
Serial.println("''");
}

if (msg.indexOf("@serveur")>0){
String tempip=msg.substring(9);
preferences.begin("myfile", false);
String groupe1=tempip.substring(0,3);
String groupe2=tempip.substring(3,6);
String groupe3=tempip.substring(6,9);
String groupe4=tempip.substring(9,12);
preferences.putUInt("IP1",groupe1.toInt());
preferences.putUInt("IP2",groupe2.toInt());
preferences.putUInt("IP3",groupe3.toInt());
preferences.putUInt("IP4",groupe4.toInt());
preferences.end();
Serial.print(tempip);

Serial.println("enregistrer");

}

if (msg.indexOf("@?serveur")>0){
String tempip=msg.substring(10);
preferences.begin("myfile", false);
Serial.print(preferences.getUInt("IP1",0));
Serial.print(".");
Serial.print(preferences.getUInt("IP2",0));
Serial.print(".");
Serial.print(preferences.getUInt("IP3",0));
Serial.print(".");
Serial.println(preferences.getUInt("IP4",0));
preferences.end();
Serial.print(tempip);

Serial.println("enregistrer");

}


}
}

en gros il faudrait que le String que je reçoit sur mon port série (exemple de reception:192168000040=> correspond a 192.168.0.40) je puisse le sauvegarder et le mettre en paramètre dans le client.connect(ip,2000); car je pense que c'est le format de "ip" qui ne vas pas.

    int connect(IPAddress ip, uint16_t port);
    int connect(const char *host, uint16_t port);

Je ne vois que 2 méthodes connect() pour la classe WifiClient. Aucune n'accepte un tableau de bytes en paramètre.
Il est probable que le compilateur choisisse la deuxième méthode, à laquelle on doit passer un paramètre littéral "xxx.xxx.xxx.xxx", ou un nom de host, une C string (terminée par ZÉRO).
Donc 4 bytes ne conviennent pas.

merci de votre réponse ,pouvez vous me dire comment modifier "IPAddress" car je n'y suis pas parvenue .
IPAddress serveur(192.168.0.20);
dans l'init mais après je ne parvient pas a passé la nouvelle IP a la variable serveur....

La variable byte ip[4] peut être conservée, et peut servir à construire un objet IPAddress.
Ensuite :

    IPAddress ipaddr(ip);
    client.connect(ipaddr, 2000);   // Connection to the server

merci énormément de votre aide ,j'essaie dés ce soir.

C'est décrit ici : il y a plusieurs possibilités.

    IPAddress(uint8_t first_octet, uint8_t second_octet, uint8_t third_octet, uint8_t fourth_octet);
    IPAddress(uint32_t address);
    IPAddress(const uint8_t *address);

Et address est défini comme suit

    union {
        uint8_t bytes[4];  // IPv4 address
        uint32_t dword;
    } _address

Le plus simple est de passer 4 octets (premier choix)

mais IPAdress doit être obligatoirement dans la partie déclaration(au dessus de la boucle setup) du coup je ne peut allais lire la mémoire a ce moment la !!!non??
Désolé de toute ces questions mais j'essaie de me formé au mieux ,heureusement que vous êtes là pour les débutants comme moi .Encore un grand merci a vous tous.

Pas du tout, mais c'est possible.

Non tu peux déclarer l'adresse IP dans le bloc où tu l'utilises, dans le setup par exemple si tu l'utilises ici

bon je sèche....j'ai fait comme vous m'avais dit en remplissant IP :

int toto1=preferences.getUInt("IP1",192);
int toto2=preferences.getUInt("IP2",192);
int toto3=preferences.getUInt("IP3",192);
int toto4=preferences.getUInt("IP4",192);
byte to1=byte(toto1);
byte to2=byte(toto2);
byte to3=byte(toto3);
byte to4=byte(toto4);
ip[1]=to1;
ip[2]=to2;
ip[3]=to3;
ip[4]=to4;

apres juste avant l'appelle a la fonction client.connect je le passe a IPAdress:

IPAddress ipaddr(ip);
int etatconnexion=client.connect(ipaddr, 2000);
Serial.print("***//////////**");
Serial.print(etatconnexion);
Serial.println("***/////////**");

et la il se connecte pas client.connect me renvoie "0".........

alors que si je fais :

byte ip[] = {192,168,0,40 };

le ca marche
???????????? je devient fou !!!!!!!!!!!! on est bien d'accord que mon tableau "ip" est bien un tableau de byte!!!!!!!! ou je me trompe complètement et j'ai rien compris

si vous avez une solution simple pour sauvegarder une adresse ip avec la librarie preference que je reçois sur le port série "192.168.0.40" et que IPAdress prenne cette ip

Essaye

byte toto1=preferences.getUChar("IP1",192);
byte toto2=preferences.getUChar("IP2",168);
byte toto3=preferences.getUChar("IP3",0);
byte toto4=preferences.getUChar("IP4",0);
IPAddress ipaddr(toto1, toto2, toto3, toto4);

j'essaie desuite

marche pas avec le code suivant:

preferences.begin("myfile", false);

preferences.putUChar("IP1",192);
preferences.putUChar("IP2",168);
preferences.putUChar("IP3",0);
preferences.putUChar("IP4",40);

byte toto1=preferences.getUChar("IP1",192);
byte toto2=preferences.getUChar("IP2",168);
byte toto3=preferences.getUChar("IP3",0);
byte toto4=preferences.getUChar("IP4",0);
IPAddress ipaddr(toto1, toto2, toto3, toto4);
preferences.end();

int etatconnexion=client.connect(ipaddr, 2000);
Serial.print("***//////////**");
Serial.print(etatconnexion);
Serial.println("***/////////**");

Que veut dire "ça ne marche pas" ?
Ca compile ? Ca exécute ? Ca ne connecte pas ?

oui désolé tous se compile mais pas de connexion

pouvez vous m'expliquer quel et la différence entre:
preferences.putUChar("IP1",192)); et preferences.putUChar("IP1",int("192"));

2000 c'est le numéro du port ?

oui
mais j'ai corriger une erreur du coup le code que vous m'aviez donner fonctionne

par contre ca ne marche que lorsque je met directement preferences.getUChar("IP1",192)