Go Down

Topic: [Résolu] Traitement requete GET avec webduino (Read 8558 times) previous topic - next topic

Roxas77

Mar 18, 2013, 10:47 am Last Edit: Apr 05, 2013, 10:08 am by Roxas77 Reason: 1
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 :
Code: [Select]

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  :)
Bonne journée

skywodd

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.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

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  :smiley-sweat: .

Roxas77

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 :D
Merci

Roxas77

Bonjour ,

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


Code: [Select]

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"

skywodd

Code: [Select]
le ) = 6){
Il manque un = ;)
= -> assignation
== -> test
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

#6
Mar 22, 2013, 11:15 am Last Edit: Mar 22, 2013, 04:47 pm by Roxas77 Reason: 1
Yes merci :)

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 :
Code: [Select]
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 :)
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 ?

skywodd


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 :
Code: [Select]
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 "?")


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 :
https://developers.google.com/chart/?hl=fr
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

Quote
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 .

Quote
(ne pas oublier le "?")

Je ne comprend pas pourquoi .

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

skywodd


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 :
Quote
192.168.X.X/commande?newsimu;consigne;type;P;I;D;intervalle

Et faire un :
Code: [Select]
webserver.addCommand("commande",&newsimu);


Je ne comprend pas pourquoi .

Base du formatage d'URL :
Code: [Select]
protocole://adresse/chemin/fichier.extension?argument=valeur&argument2=valeur2...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

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é :
Code: [Select]

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

skywodd

#11
Mar 27, 2013, 02:35 pm Last Edit: Mar 31, 2013, 07:28 pm by skywodd Reason: 1
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 : https://github.com/sirleech/Webduino/blob/master/WebServer.h

Essaye ça :
Code: [Select]
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);
   }
 }
}
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Roxas77

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 :
Code: [Select]

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


skywodd

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é ;)
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

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

Go Up