Arduino Forum

International => Français => Topic started by: Roxas77 on Mar 18, 2013, 10:47 am

Title: [Résolu] Traitement requete GET avec webduino
Post by: Roxas77 on Mar 18, 2013, 10:47 am
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
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 19, 2013, 04:58 pm
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.
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 20, 2013, 08:56 am
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: .
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 20, 2013, 09:22 am
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
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 21, 2013, 08:56 am
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"
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 21, 2013, 06:22 pm
Code: [Select]
le ) = 6){
Il manque un = ;)
= -> assignation
== -> test
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 22, 2013, 11:15 am
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 ?
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 22, 2013, 05:48 pm

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
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 23, 2013, 09:47 am
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 ^^ .
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 23, 2013, 04:09 pm

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...
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 27, 2013, 09:18 am
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
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 27, 2013, 02:35 pm
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);
   }
 }
}
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 28, 2013, 10:21 am
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

Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 28, 2013, 12:34 pm
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é ;)
Title: Re: Traitement requete GET avec webduino
Post by: Logan21 on Mar 28, 2013, 01:30 pm
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
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 28, 2013, 02:16 pm

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 ;)
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 29, 2013, 09:13 am
Oui oui c'est ce que je fait ^^ , et je rentre dans ma fonction mais il ne recupere pas mes valeurs :
Code: [Select]
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 .
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 29, 2013, 12:23 pm

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


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.
Title: Re: Traitement requete GET avec webduino
Post by: marcha on Mar 30, 2013, 10:46 am
Salut,

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

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


Ne serait-ce pas:

Code: [Select]
  tab[j] = c;

?
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Mar 30, 2013, 02:54 pm
Salut ,
Quote
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 :
Code: [Select]
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);
    }
  }
}
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Mar 31, 2013, 07:26 pm
HopHopHop mon coco ya un soucis dans ton url ! ;)
Et ya un gros soucis dans ton sscanf aussi ! (bon ok j'avais moi même oublié :*)

Code: [Select]
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 <- il devrait y a voir 6 champs et non 5 !
 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) == 6){ // sscanf attend des pointeurs sur variables !
   // <- ne pas oublier le test du nombre de champs lus
     server.println(url_tail);
     Serial.println(consigne);
     Serial.println(type);
     Serial.println(p);
     Serial.println(i);
     Serial.println(d);
     Serial.println(intervalle);
   }
 }
}
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Apr 02, 2013, 03:33 pm
Ah ok ok j'avais meme pas remarqué qu'il me manquait un champ x) .

J'ai essayer le correctif et je n'arrive pas a avoir le 6eme champs et puis j'ai essayer de voir juste avec 5 champs quand même pour voir si ca fonctionnait et puis b ca fonctionne pas x) .

C'est la loose  :(  . je continue de regarder :) je te tiens au courant .
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Apr 02, 2013, 07:28 pm

J'ai essayer le correctif et je n'arrive pas a avoir le 6eme champs et puis j'ai essayer de voir juste avec 5 champs quand même pour voir si ca fonctionnait et puis b ca fonctionne pas x) .

J'ai testé le morceau de code du sscanf() sur ordinateur :
Code: [Select]
#include <stdio.h>

int main(int argc, char** argv) {
double consigne, intervalle, p, i, d;
    int type ;
   
if(argc == 1) return 1;

if(sscanf(argv[1], "newsimu;%lf;%d;%lf;%lf;%lf;%lf",&consigne, &type, &p, &i, &d, &intervalle) == 6) {
printf("consigne: %lf\n", consigne);
printf("type: %d\n", type);
printf("p: %lf\n", p);
printf("i: %lf\n", i);
printf("d: %lf\n", d);
printf("intervalle: %lf\n", intervalle);
    }

return 0;
}


Et ça à l'air de marcher :
Code: [Select]
test.exe newsimu;25;0;25;24;26;13
consigne: 25.000000
type: 0
p: 25.000000
i: 24.000000
d: 26.000000
intervalle: 13.000000


Regarde bien ce que tu reçois dans url_tail mais normalement ça devrait le faire ...
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Apr 03, 2013, 11:35 am
C'est bon j'ai réussi !!!!!!  :smiley-yell: j'en suis venu a bout :D
Apparemment il gérait pas les %lf , donc j'ai tout mis en "int" et j'ai essayer avec les valeurs  9999 et il me les prend en compte cependant je doit avoir des nombres a virgules donc il faut que j'arrive a trouver une solution .
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Apr 03, 2013, 08:00 pm

Apparemment il gérait pas les %lf , donc j'ai tout mis en "int" et j'ai essayer avec les valeurs  9999 et il me les prend en compte cependant je doit avoir des nombres a virgules donc il faut que j'arrive a trouver une solution .

MAIS OUI ... je suis vraiment c*n parfois !
La avr-libc ne supporte pas (de base) les flottants dans les fonctions de stdio (scanf, printf, ...) d'où les fonctions spécialisés dtostrf(), etc ...
(c'est une histoire de place, le support des flottants demande un max de place en flash)

Il y a une option du linker pour activer le support des flottants mais avec l'ide arduino c'est impossible de le mettre ...
Essaye de chainer plusieurs strtod() (en sautant le ; entre chaque champ) :
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html#ga5ee4d110a3bb55d2eadda05e3ebedf8a
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Apr 04, 2013, 09:06 am
Ouais ok ok merci mais le souci c'est que "url_tail" il bloque a un certain nombre de caractère ( 26 je crois ) du coup si en plus je met les double b ca va être la galère ... donc j'ai cherché dans la lib WebServer.h mais je trouve pas ou il a pu être définie a 26 parce que une URL normalement n'est pas limité enfin la y'a un hic quelque part et je ne vois pas ou c'est .

Dans tout les cas j'ai essayer le atof je le trouve plus simple a utilisé  ;) et ça à l'air de fonctionner . Me manque plus qu'a régler ce problème de longueur et a couper la chaine pour la fonction "newsimu" mais du coup si je coupe la chaine avant le sscanf il ne sert plus a rien enfin je ne vois pas ce que tu pense ?
Title: Re: Traitement requete GET avec webduino
Post by: skywodd on Apr 04, 2013, 07:28 pm
Ligne 51 je vois :
Code: [Select]
#define WEBDUINO_DEFAULT_REQUEST_LENGTH 32
Ça doit surement être ça qui défini la taille max de l'url.

Sinon oui avec atof plus besoin de sscanf().
Title: Re: Traitement requete GET avec webduino
Post by: Roxas77 on Apr 04, 2013, 08:31 pm
Yep c'etait ca ^^ je l'ai mis a 64 ca devrait aller maintenant   XD .

C'est bon ça fonctionne bien j'ai réussi a tout récupérer :D Je te remercie pour tes conseils ^^ .
A bientot parce que mon projet n'est pas encore terminé :p .