[HELP] Récupération données avec Methode Get avec Webduino

Bonsoir à toute la communauté du Forum Arduino FR.
Alors voilà , je vous expose mon problème.
Je dispose d’une page Web qui gère de façon automatique la gestion d’une cuve d’eau dans le but de redistribuer l’eau non potable récupérer dans l’habitation.
En réalité , j’ai deux page web , la première est une page d’accueil où un liens est dispo pour nous amener vers la page de gestion. Lorsque l’on clique sur le lien , une pop up apparaît où l’on doit rentrer nom d’utilisateur et mdp paramétré dans le programme en BASIC-64.
Tous sa est gérer par le programme “Web-Authentification” qui se situe dans la librairie Webduino.
Après cette intro , passons au vif du sujet.

Voici l’image de ma page WEB: ICI
Alors , tous fonctionne , sauf la partie réglage du niveau intermédiaire.
Je m’explique. Le niveau intermédiaire est un niveau “limite”. Admet on , je règle ce dernier sur 40%. Lorsque le niveau de la cuve passera en dessous de 40% , alors , un relais active une électrovanne qui remplira la cuve en eau potable jusqu’au niveau intermédiaire , ici 40% , ce qui permet un service continue pour l’utilisateur. J’ai donc réussi à mettre en place ce système à l’aide de 2 variables.
La première , la variable que j’ai appelé “niveau”.
La deuxième, la variable que j’ai appelé “niveauinter”.

La variable “niveau”. Cette variable varie de 0 à 100 en fonction de la distance entre le capteur ultrason et l’eau.
La variable’'niveauinter"quand à elle est fixe. Ici , dans mon programme je l’ai réglé à 50.

Voici donc ce que j’ai fait ,
j’ai dit , lorsque niveau<niveauinter ALORS RELAIS ON ce qui active l’électrovanne.

Ce qui fonctionne très bien ! Mais le problème , c’est que dans mon cahier des charges , il est préciser que le l’utilisateur peut réglé le niveau intermédiaire de 5%à90%.
Donc , j’ai décidé d’utiliser une méthode GET afin de pouvoir récupérer les données de la case “reglage du niveau inter”. → voir image de la page ci dessus.
Donc , lorsque je rentre par exemple , 40 dans la case et que j’appuie sur ENTRER.
Alors , j’ai bien dans l’URL “gestion.html?valeur=40”
Et c’est ici que ça coince.
J’aimerais que le programme identifie “valeur=” et donc qu’il analyse ensuite le “40” (ou la valeur que l’on rentre) et que ensuite il récupère le 40 et qu’il l’assigne à la variable “niveauinter”.

Il me manque uniquement cette partie , et mon projet serait totalement fini.

Alors j’avais vue que Webduino gérer les données en interne , et donc qu’il était impossible d’utiliser une méthode GET. J’ai donc essayer avec la méthode POST en intégrant à mon programme (que vous pouvez télécharger en piece-joint) ce petit bout de code.

" if (type == WebServer::POST)
{
bool repeat;
char name[16], value[16];
do
{
/* readPOSTparam returns false when there are no more parameters

  • to read from the input. We pass in buffers for it to store
  • the name and value strings along with the length of those
  • buffers. */
    repeat = server.readPOSTparam(name, 16, value, 16);

String valueString = String(value);

} while (repeat);
// after procesing the POST data, tell the web browser to reload
// the page using a GET method.
server.httpSeeOther(PREFIX);
return;
}
"
Avec cette partie de code , je pensais pouvoir récupérer une valeur issu de “value[16]” et ensuite l’assigner à la variable “niveauinter”. Mais ça ne fonctionne pas , ou alors je m’y suis mal pris et ce sera à vous de me le dire! :stuck_out_tongue:

Merci de m’avoir lu , n’hésitez pas si vous avez des questions !

Cordialement

Web_Authentication.ino (9.68 KB)

pour ce que tu cherche a faire il faut récupéré la requette et l'analysé dans une requette get les variable sont transmise dans la requette aprés un '?' sous la forme

GET/jhggghj.comm?clef=valeur

il te sufi d'analysé la chaine, tu detecte le ? et tu lit la suite , avant le = c'est ta clef ou non de la variable apres c'est la valeur de celle si .

tu aura besoin de convertire les suite de caractere en variable de type char pour ta clef par exemple et en in pour ta valeur

a mon avis le plus simple tu fait 2 tableau de char un pour chaque tu compare avec

strcmp(Tab_clef, "rtch") //renvoi 0 si comparaison est egale

le premier et tu convertie le deuxieme avec

 valeur =atoi(Tab_valeur);

voici un exemple

if( strcmp(m_clef, "rtch") == 0 ) // comparaison de chaine de carracter
            {
               
                rtcH.h =atoi(m_valeur);

            }

D’abord , merci d’avoir pris le temps me lire et de me répondre.
J’aurais quelques questions.

Déjà , tu m’indiques qu’il faudrait identifier le “?” pour ensuite lire la requête.
Je suis d’accord , mais comment faire?
Ensuite , je n’arrive pas vraiment à comprendre ton code que tu me proposes.
Tu ma certes , éclairé sur le fait qu’il faut rentrer ma clef dans une variable de type “char” et ma valeur dans une variable de type “in”. Mais je ne vois pas comment faire !

Disons que c’est la partie que je gère le moins , je t’avoue que je suis un peu perdu lorsque l’on me parle d’analyse de tram , etc…
Je suis conscient que le serveur reçois une trame et qu’il faut l’analyser et en tirer ce qui nous intéresse uniquement. Mais je ne vois pas comment faire.
J’ai déjà pourtant réussi à le faire sur un autre projet en utilisant ce bout de code qui analyse la tram et détecte le fameux “?”. Mais lorsque je veux l’intégrer à mon programme utilisant WebDuino , cela ne fonctionne pas et dans la fenêtre de debug , je n’ai uniquement un “F” ou quelque chose comme qui apparaît à la place de la trame.

Voici le code en question:

if (client) {
    Serial.println("new client");
    chaineRecue=""; // vide le String de reception
    comptChar=0; // compteur de caractères en réception à 0 
    

    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      while (client.available()) {
        char c = client.read();
        comptChar=comptChar+1; // incrémente le compteur de caractère reçus

                //--- on ne mémorise que les n premiers caractères de la requete reçue
                //--- afin de ne pas surcharger la RAM et car cela suffit pour l'analyse de la requete
        if (comptChar<=8) chaineRecue=chaineRecue+c; // ajoute le caractère reçu au String pour les N premiers caractères

        Serial.write(c);
      }

        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        
      Serial.print (F("Chaine prise en compte pour analyse : "));
      Serial.println(chaineRecue); // affiche le String de la requete pris en compte pour analyse
      Serial.println ("");
  
      // variables pour analyse de la requete reçue
    String chaineAnalyse=""; // crée un string utilisé pour analyser la requete
    int indexChaine=0; // variable index pour parcourir la chaine reçue

    //----- longeur de la chaine recue
    int longeurChaine=chaineRecue.length(); // variable de la longeur de la chaine reçue
    Serial.print(F("La longueur de la chaine est : ")), Serial.println(longeurChaine);
    
     //------ type de la requete reçue --------
    if (chaineRecue.startsWith("GET")) { // si la chaine recue commence par "GET"
     Serial.println (F("La requete recue est une GET"));
    }
  //------------- analyse si présence données formulaire ---------

    //-- analyse la présence du ? => présent si appui sur bouton envoi coté client
    indexChaine=5; // analyse le 6ème caractère
    chaineAnalyse=chaineRecue.substring(indexChaine,indexChaine+1); // extrait le 6ème caractère
    Serial.print(F("Le 6eme caractere est : ")), Serial.println(chaineAnalyse);
    
     if (chaineAnalyse == "?") { // test si le 6ème caractère est un ?

      Serial.println(F("Donnees de formulaire disponibles !")); } // si c'est le cas, des données de formulaire sont disponibles

        indexChaine=6; // analyse le 6ème caractère
        chaineAnalyse=chaineRecue.substring(indexChaine,indexChaine+2); // extrait le 7 et 8ème caractère
         Serial.print(F("Les  7 et 8eme caracteres sont : ")), Serial.println(chaineAnalyse);
  //**********************************************************************
 // analyse commande et actions
 //**********************************************************************

         if (chaineAnalyse == "on"){ Serial.println("Envoi trame 1381717");
         mySwitch.send(1381717, 24);}
         
         if (chaineAnalyse == "of") { Serial.println(" Envoi trame 1381716");
         mySwitch.send(1381716, 24);}

Ici , le code analyse d’abord si il y a ou non un point interrogation. Si il y en a un , alors il analyse le 7 et 8 eme caractères . si il a “ON” , alors il allumé une prise à distance , et si “OF” , alors il l’éteint.

Merci encore pour ton aide.
Bonne soirée
Cordialement.

ARATIX: Déjà , tu m'indiques qu'il faudrait identifier le "?" pour ensuite lire la requête. Je suis d'accord , mais comment faire?

c'est exactement ce que fait ton code si dessu , en gros il lit les carractere un a un et lorsque qu'i fait sa comparaison , quand il trouve un ? il lit ton 7 eme et 8em caractere.

ce qui serai plus simpatyque sachant qu'entre la clef et la valeur de la clef il y a un =, c'est de lire les caractere comme ce que fait deja le programe, de place ces carractere dans un tableau de charcater puis de comparé ce tableau a ca que tu cherche comme cléf avec strcmp().

cette fonction te revoi 1 si c'est different de ce que tu cherche et 0 si c'est la meme chose

exemple simple si tu reçoi get/XXXXXX/xx?prise1=ON

quand on arive a detecter le ? on commance a remplre un tableau de charactere que l'on appelle aussi un buffer ou zone tampon avec prise1 , j'usqua ce que le programe trouve un '=' la il remplie un secon buffer avec ON

une foi qu'il n'y a plus de carracter donc que l'on a reçu toute la trame, on commence l'analyse

// je considere que tu a cree 2 tableau buffer l'un Buffer_clef et l'autre Buffer_valeur
if( strcmp(Buffer_clef , "prise1") == 0 ) // comparaison de chaine de carracter
            {// si on trouve une clef =PRISE1
               
                if( strcmp(Buffer_valeur, "ON") == 0 ) // comparaison de chaine de carracter
            {//si on trouve une valeur =ON
               
               //passage de la prise a ON

            }

            }[\CODE]

voila j'esper que ce sera plus claire
c'est sur qu'au debut c'est pas evident j'y ai passé des heure a comprndre comment faire mais on y arrive ! :grin:

Merci de ton aide , j'essayerai cela en milieu de semaine.

Mais j'ai encore quelques questions.

Comme je l'ai précisé dans le premier post , je voudrais recueillir des valeurs. En effet , si on a par exemple : get/XXXX/xxx?valeur=70

Et bien , je peux donc utiliser un buffer pour analyser (trouver) la partie "valeur=" dans ma trame(comme tu m'as expliqué) , et si je trouve cette partie alors , j'aurais aimer savoir si je pouvais également utilisé un buffer pour analysé le nombre qui est présent après "valeur=" (ici , 70) et le récupérer pour changer la valeur d'une de mes variables. Parce que dans ton exemple , on recherche des mots bien précis dans la trame afin d'allumer la prise , on a pas de lecture puis récupération d'un texte ou autre. Hors , ici je veux récupérer une valeur que l'utilisateur rentrera sur le site (ici , l'utilisateur aurais rentrer 70) afin de la mettre dans une variable.

Enfin , deuxième question ,lorsque tu dis "je considere que tu a cree 2 tableau buffer l'un Buffer_clef et l'autre Buffer_valeur" , y a t-il une manière particulière pour les créer. Ce que je veux dire par là , c'est , es ce qu'il sont définis comme des variables ou autres?

Merci encore à toi ! Bonne journée

Cordialement

les buffer sont des tableaux de char tout simples on les appellent buffer car ce sont des tableau de reception, mais tu peut les appeller comme tu veux ça reste des tableau de caractere, exemple:

char buffer_clef[taille];

ou taille et la longeur de la chaine de caractere la plus grande susseptible d'etre reçu +1 caractere de fin de chaine '\0'(obligatoir dans une chaine)! le plus simple tu prend 21 et tu poura mettre une chaine de 20 carracters!

ensuite pour la varriable que tu veu recupéré , si tu reçoi

get/XXXX/xxx?valeur=70

tu vas effectivement remplire deux tableau de carracteres, le premier avec ta clef, ici "valeur" , le second avec "70", mais pour le moment ce n'est qu'une suite de caracteres pas une variable utilisable . Pour cela tu va convertir ce tableau de carracteres avec une fonction speciale, qui va transcrire cette suite en une variable: on utilise atoi(); http://www.cplusplus.com/reference/cstdlib/atoi/ elle prend en argument un tableau de caracterre et retourne une valeur de type int.

dans ton cas:

if(strcmp(buffer_clef,"valeur")==0){// on regarde si on a reçu la clef
int ta_variable_reglante=atoi(buffer_valeur);// convertie le tableau buffer_valeur en en variable de type int
}

tu aurra ta variable reglante qui vaudrat 70! ç'est tout simple ( enfin quand on sait biensur :grin: )

Merci beaucoup pour ton aide , j’en ai beaucoup appris , j’essaye ceci demain !
je te tiens au courant !

Cordialement :slight_smile: