[Résolu] Traitement requete GET avec webduino

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);
    }
  }
 }

HopHopHop mon coco ya un soucis dans ton url ! :wink:
Et ya un gros soucis dans ton sscanf aussi ! (bon ok j'avais moi même oublié :*)

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);
    }
  }
 }

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 :frowning: . je continue de regarder :slight_smile: je te tiens au courant .

Roxas77:
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 :

#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 :

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

C'est bon j'ai réussi !!!!!! :stuck_out_tongue_closed_eyes: j'en suis venu a bout :smiley:
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 .

Roxas77:
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

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é :wink: 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 ?

Ligne 51 je vois :

#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().

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 :smiley: Je te remercie pour tes conseils ^^ .
A bientot parce que mon projet n'est pas encore terminé :stuck_out_tongue: .