Extraire une sous chaine de caractere

Bonjour à tous,

Je cherche a récupérer des infos d'une URL de type :

http://192.168.0.31/Mode=0&boucle=6&vitesse=200&duree=3000

Je dois arriver a récupérer le 6 de boucle=6, le 200 de vitesse=200 et le 3000 de duree=3000.
Une difficulté supplémentaire est que les trois nombres a récupérer peuvent avoir un nombre de chiffre variant, c'est a dire que 6 peut avoir comme valeur 14 ou 112.

Je comptais utiliser substring, mais je ne peux pas définir une position fixe de début ou de fin, donc ça ne fonctionne pas.

Donc si vous avez une idée je suis preneur.
Merci d'avance

1 Like

Bonsoir Treza88

Voici comment, déjà, extraire boucle=nnn:

String httpText = "http://192.168.0.31/Mode=0&boucle=6&vitesse=200&duree=3000";

void setup()
{
	Serial.begin(115200);

	int flagFirst = httpText.indexOf("&", 0);     // Recherche du premier flag
	int flagSecond = httpText.indexOf("&", flagFirst +1);     // Recherche du premier flag
	String textExtract = httpText.substring(flagFirst +1, flagSecond);

	Serial.println("Premier flag = " + String(flagFirst));
	Serial.println("Second flag = " + String(flagSecond));
	Serial.println("Extraction = " + textExtract);

}

void loop()
{

}

C'est la même "mécanique" pour les autres paramètres :wink:

Cordialement
jpbbricole

tu peux utiliser substring, il faut "juste" récupérer les index de tes charactères de début, qui serait "=" et de fin "&". Pour ça tu peux utiliser indexof()

myString.indexOf(val)
myString.indexOf(val, from)

documentation

EDIT : grillé par jpbbricole ^^

On peut aussi chercher non pas la sous chaine &, mais la sous-chaine &boucle=

Cela ferait un truc du genre

int flagFirst = httpText.indexOf("&boucle", 0);     // Recherche champ "boucle"
int flagSecond = httpText.indexOf("&", flagFirst +1);     // Recherche de la fin de ce champ
String textExtract = httpText.substring(flagFirst +7, flagSecond);

Attention le code proposé suppose que la chaine est toujours dans le même format.
Il est bon de prendre en compte que indexOf puisse renvoyer -1, car la sous chaine n'a pas était trouvé :slight_smile:
On peut aussi noté que la solution de @vileroi est plus pérenne car pas dépendant de l'ordre des paramètres qui peut être fluctuant suivant le client utilisé pour appeler l'URL.

Bonsoir terwal

Euh non?
Qu'il y aie 1 ou 4 ou 6 chiffres, ça fonctionne.
Ou j'ai pas compris ta remarque?

Cordialement
jpbbricole

ca ce n'est pas le format de la chaine.
Le code ne fonctionnera pas sur http://192.168.0.31/boucle=6 ou d'autre combinaison comme
http://192.168.0.31/Mode=0&vitesse=200&duree=3000&boucle=6

Ma remarque est juste de ne pas oublier de tester le retour de la fonction.

Quel Arduino?
Utilisez vous une bibliothèque orientée Web? Certaines permettent d’extraire directement les paramètres.

Merci jpbbricole, ewaca, vileroi et terwal,

Désolé pour pour le retour tardif, mais vraiment merci pour vos approches différentes et à chacun de vous pour les améliorations ou évolutions qu'elles apportent.

J'ai réussi à produire le résultat voulu, reste juste à le faire évoluer avec vos différentes propositions.

Sinon J-M-L, j'utilise un ESP01et la seule bibliothèque que j'utilise est :
ESP8266WiFi.h
Mais si ça peut correspondre, n’hésite pas à développer.

OK donc pas un truc évolué - faut faire à la main :slight_smile:

Ok merci J-M-L,

Oui j'avais cet ESP01, il est suffisant pour ce que j'ai à faire avec du Wifi et j'ai pas beaucoup de place.
De plus je vais certainement tester de le faire fonctionner en OTA.

Voici mon code final :


String httpText = "http://192.168.0.31/Mode=0&boucle=6&vitesse=200&duree=3000";

void setup()
{
	Serial.begin(115200);

  int debut1 = httpText.indexOf("=", 30);     
  int fin1 = httpText.indexOf("&", debut1 +1);  
  int debut2 = httpText.indexOf("=", fin1 +1);
  int fin2 = httpText.indexOf("&", debut2 +1);
  int debut3 = httpText.indexOf("=", fin2 +1);
  String textExtract = httpText.substring(debut1 +1, fin1);
  String textExtract2 = httpText.substring(debut2 +1, fin2);
  String textExtract3 = httpText.substring(debut3 +1);


	
  Serial.println("Extraction 1 = " + textExtract);
  Serial.println("Extraction 2 = " + textExtract2);
  Serial.println("Extraction 3 = " + textExtract3);

}

void loop()
{
 
}

Qui fonctionne parfaitement, mais plus pour un soucis de lisibilité que de format de chaine.
Car mon format ne changera pas, je l'ai donc modifier comme ceci :


String httpText = "http://192.168.0.31/Mode=0&boucle=6&vitesse=200&duree=3000";

void setup()
{
	Serial.begin(115200);
if (httpText.indexOf("boucle=") != -1 || httpText.indexOf("vitesse=") != -1 || httpText.indexOf("duree=") != -1)
  {
  int debut1 = httpText.indexOf("boucle=");     
  int fin1 = httpText.indexOf("&", debut1 +1);    
  int debut2 = httpText.indexOf("vitesse=");
  int fin2 = httpText.indexOf("&", debut2 +1);
  int debut3 = httpText.indexOf("duree=");
  String paramBoucle = httpText.substring(debut1 +7, fin1);
  String paramVitesse = httpText.substring(debut2 +8, fin2);
  String paramDuree = httpText.substring(debut3 +6);
  

	
  Serial.println("Paramètre du nombre de boucle = " + paramBoucle);
  Serial.println("Paramètre de vitesse = " + paramVitesse);
  Serial.println("Paramètre de durée = " + paramDuree);
  }
}

void loop()
{
 
}

Merci pour vos interventions à tous, qui m'ont permis de bien comprendre et maitriser "indexOf"

Pour information : le jour où l'ESP8266 ne sera plus suffisant et l'encombrement sera une contrainte forte tu trouvera des toutes petites cartes avec ESP32 (un exemple parmi d'autres...)
image

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