[Résolu] Traitement requete GET avec webduino

Bonjour ,
Donc comme est dit dans le titre je recherche a traiter une requete GET avec la librairie webduino , rien ne vaut un exemple pour illustrer :
Je cherche a récuperer les information après le '/' et mes informations seront séparer par un ';' comme ceci :
192.168.X.X/newsimu;consigne;type;P;I;D;intervalle

personnellement je pensais à faire comme ceci :

void StartSimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if ( type == WebServer::GET )
  {
    int i ;
    i = 0 ;
    char tab[10] ;//créer un tableau
    char c ;
    c = server.read();
    while( c != ';' ){//ranger les parametres dans ce tableau avec le séparateur ';'
      c = tab[i] ;
    }    
    i++ ;    
    // comparer les chaines que je veux 
  }
}

Est ce faisable ? Comme c'est assez pressé je préfère vous demandez d'abord pour que je ne trompe pas :slight_smile:
Bonne journée

Bonjour,

Charge la ligne "de commande" dans un char[] (fait attention de ne pas dépasser la taille du tableau) et utilise sscanf() pour récupérer les champs.

Ok j'ai compris le principe cependant il n'y a que le "newimu" qui va rester constant le reste va être remplacer par de valeurs numériques.
Donc en fait je ne peux pas comparer mot a mot :* .
Désolé j'ai oublié de le préciser :sweat_smile: .

Ah j'ai trouvé ton ardicle sur ton blog j'essai de me débrouiller si il y a un truc que je ne comprend pas je reviens vers toi :smiley:
Merci

Bonjour ,

Je sais pas si j'ai bien compris ton code mais j'ai fait ça :

void StartSimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if ( type == WebServer::GET )
  {
    double consigne , intervalle , p , i , d ;
    int type ;
    int j ;
    j = 0 ;
    char tab[33] ;
    char c ;
    c = server.read();
    do {
       while(server.available() < 7);/* Attente de la chaine "newsimu" */   
    }while(server.read() != 'newsimu' );/* Tant que chaine != newsimu */
    while( c != '!' ){
      c = tab[j] ;
      if ( c ='!'){
        tab[j+1] = '\0';
      }
      i++ ;
    }   
    if(sscanf(tab, "newsimu;%d;%d;%d;%d;%d;%d!", consigne, type, p , i , d , intervalle ) = 6){
      Serial.println(consigne);
      Serial.println(type);
      Serial.print(p);
      Serial.print(i);
      Serial.print(d);
      Serial.print(intervalle);
    }
  }
}

a la ligne du sscanf il me met une erreur :"error: lvalue required as left operand of assignment"

le ) = 6){

Il manque un = :wink:
= -> assignation
== -> test

Yes merci :slight_smile:

Et encore une dernière chose , comment je peux lancer cette requête la ?
Parcque , la je l'ai mise dans une fonction et donc ca fait comme ceci :

webserver.addCommand("newsimu",&newsimu);

Mais du coup je fais comment pour avoir mes valeurs que je dois récupérer ?
J' y ai réfléchi mais franchement je ne vois pas comment je peux faire , ou alors on peut appeler la fonction dans le setup enfin je vois pas et je pense que je m'embrouille tout seul enfin si t'as une solution merci :slight_smile:
Enfin je ne sais pas si je m'exprime bien donc si tu comprend pas dit le moi x)

Ah oui et question a part est ce possible de tracer la courbe grâce a mes données sur le site web ?

Roxas77:
Et encore une dernière chose , comment je peux lancer cette requête la ?
Parcque , la je l'ai mise dans une fonction et donc ca fait comme ceci :

webserver.addCommand("newsimu",&newsimu);

Colle ta commande en tant que commande par defaut : setDefaultCommand()
Et fait des requêtes du style : 192.168.X.X/**?**newsimu;consigne;type;P;I;D;intervalle
(ne pas oublier le "?")

Roxas77:
Ah oui et question a part est ce possible de tracer la courbe grâce a mes données sur le site web ?

En javascript tu peut, sinon google fourni un API pour ça :

Colle ta commande en tant que commande par defaut : setDefaultCommand()

Oui ca fonctionnerait mais j'ai deja un setDefaultCommand() qui affiche ma page web principale .

(ne pas oublier le "?")

Je ne comprend pas pourquoi .

Et je te remercie pour l'API je vais regarder ca ^^ .

Roxas77:
Oui ca fonctionnerait mais j'ai deja un setDefaultCommand() qui affiche ma page web principale .

Dans ce cas tu doit faire une sous page du style :

192.168.X.X/**commande?**newsimu;consigne;type;P;I;D;intervalle

Et faire un :

webserver.addCommand("commande",&newsimu);

Roxas77:
Je ne comprend pas pourquoi .

Base du formatage d'URL :

protocole://adresse/chemin/fichier.extension?argument=valeur&argument2=valeur2...

Salut ,
désolé de te déranger encore mais mon code ne fonctionne toujours pas j'ai mis campagne comme tu m'as dit , je l'ai rajouté a la chaine de sscanf je pense que je n'ai pas compris quelque chose qui me bloque , voila ce que j'ai changé :

void newsimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete)
{
  if ( type == WebServer::GET )
  {
    double consigne , intervalle , p , i , d ;
    int type ;
    int j ;
    j = 0 ;
    char tab[52] ;
    char c ;
    c = server.read();
    do {
       while(server.available() < 8);/* Attente de la chaine "campagne" */   
    }while(server.read() != 'campagne' );/* Tant que chaine != campagne */
    while( c != '!' ){
      c = tab[j] ;
      if ( c ='!'){
        tab[j] = '\0';
      }
      j++ ;
    }   
if(sscanf(tab, "campagne?newsimu;%d;%d;%d;%d;%d;%d!", consigne, type, p , i , d , intervalle )== 6){
      Serial.println(consigne);
      Serial.println(type);
      Serial.print(p);
      Serial.print(i);
      Serial.print(d);
      Serial.print(intervalle);
 }

Merci d'avance

Webduino gére la récupération de l'url en interne.

Exemple de code : http://playground.arduino.cc//Main/WebduinoFileServer
Cf doc ligne 162 : Webduino/WebServer.h at master · sirleech/Webduino · GitHub

Essaye ça :

void newsimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) {
  if (type == WebServer::GET && tail_complete) {
    double consigne , intervalle , p , i , d ;
    int type ;
    if(sscanf(url_tail, "?newsimu;%lf;%d;%lf;%lf;%lf;%lf", &consigne, &type, &p , &i , &d , &intervalle) == 6) {
      Serial.println(consigne);
      Serial.println(type);
      Serial.print(p);
      Serial.print(i);
      Serial.print(d);
      Serial.print(intervalle);
    }
  }
 }

Tout d'abord je te remercie pour le lien ça m'a aider pour autre chose ^^ .

Ca ne fonctionne toujours pas , pourtant je fais comme tu m'as dit et essayer d'autres choses comme :

if(sscanf(url_tail, "?newsimu;%lf;%d;%lf;%lf;%lf;%lf", consigne, type, p , i , d , intervalle) == 6) // ce que tu m'as dit 
//if(sscanf(url_tail, "commande?newsimu;%lf;%d;%lf;%lf;%lf;%lf", consigne, type, p , i , d , intervalle) == 6) // ce que j'ai essayer désespérément

void setup(){
//...
 webserver.addCommand("commande", &newsimu);
//...
}

après peut être c'est moi qui test mal ,
et ce que je tape dans l'URL : http://169.254.235.2/commande?newsimu;25;0;14;15;16;0

Fait un truc bateau dans ta fonction : affiche le contenu de url_tail avec Serial.println() pour voir à quoi il ressemble et si ton callback est bien appelé :wink:

Je dis peut-être une bêtise, mais pourquoi tu ne récupères pas de la manière classique?
Du genre http://mon adresse?var1=x&var2=y

Logan21:
Je dis peut-être une bêtise, mais pourquoi tu ne récupères pas de la manière classique?
Du genre http://mon adresse?var1=x&var2=y

C'est ce qu'il fait, mais la librairie Webduino gère déjà en interne la récupération de l'url :wink:

Oui oui c'est ce que je fait ^^ , et je rentre dans ma fonction mais il ne recupere pas mes valeurs :

if(sscanf(url_tail, "newsimu;%d;%d;%d;%d;%d;%d", consigne, type, p , i , d , intervalle) ) {
      server.println("je suis la");
      Serial.println(consigne);
      Serial.println(type);
      Serial.print(p);
      Serial.print(i);
      Serial.print(d);
      Serial.print(intervalle);
    }

J'ai testé le url_tail et j'obtiens :newsimu;25;0;25;24;26 , c'est pourquoi j'ai enlever le "?" que tu avais mis devant .

Roxas77:

if(sscanf(url_tail, "newsimu;%d;%d;%d;%d;%d;%d", &consigne, &type, &p , &i , &d , &intervalle) ) {

Bon manifestement tu n'as pas remarqué un truc dans mon code :wink:
%c -> char
%d -> int
%f -> float
%lf -> double

Soit tu changes le type de tes valeurs consigne, type, p , i , d , intervalle en int soit tu utilises %lf pour les types double :wink:

Roxas77:
J'ai testé le url_tail et j'obtiens :newsimu;25;0;25;24;26 , c'est pourquoi j'ai enlever le "?" que tu avais mis devant .

Ok webduino enlève le ? de l'url tronqué.
Faire voir le code complet de ta fonction avec le Serial.print pour afficher url_tail.

Salut,

Y a un truc suspect qui traine depuis le début du post:

while( c != '!' ){
      c = tab[j] ;
      ...
}

Ne serait-ce pas:

  tab[j] = c;

?

Salut ,

Salut,

Y a un truc suspect qui traine depuis le début du post:
Code:

while( c != '!' ){
c = tab[j] ;
...
}

Je l'ai enleve et oui je crois que j'avais inversé ^^ .

Skywodd , si j'avais remarqué mais j'avais essayer plusieurs chose c'est pour ça ^^ , le code :

void newsimu(WebServer &server, WebServer::ConnectionType type, char *url_tail, bool tail_complete) {
  server.println(url_tail);// il affiche newsimu;25;0;25;24;26
  if (type == WebServer::GET) {
  
    double consigne , intervalle , p , i , d ;
    int type ;
    if(sscanf(url_tail, "newsimu;%lf;%d;%lf;%lf;%lf;%lf",consigne,type,p,i,d,intervalle)){
      server.println(url_tail);
      Serial.println(consigne);
      Serial.println(type);
      Serial.println(p);
      Serial.println(i);
      Serial.println(d);
      Serial.println(intervalle);
    }
  }
 }