IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Serveur Arduino qui renvoie une page web bizarre !


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Septembre 2015
    Messages : 16
    Par défaut Serveur Arduino qui renvoie une page web bizarre !
    Bonjour,

    Je suis débutant et j'ai cherché un peu partout sans trouvé la solution à mon problème.
    J'utilise Arduino uno et un shield Ethernet pour envoyer/recevoir des infos d'un navigateur
    à mon Arduino qui fait office de serveur.

    Voici les formats de la commande envoyée par un navigateur client
    vers le routeur de ma box :

    http://oct1.oct2.oct3.oct4:5011/?b=3&p=200

    ou

    http://oct1.oct2.oct3.oct4:5011/?b=3,4&p=200

    ou

    http://oct1.oct2.oct3.oct4:5011/?b=3,4,5&p=200

    etc...


    5011 port choisi arbitrairement

    b=3 signifie broche 3 à 5v (à 0 si elle n'est pas citée)

    b=3,5 signifie broche 3 et 5 à 5v

    etc, etc

    p= valeur pwm sur sortie 6


    Je développe sous W10. Ma redirection de port fonctionne aux petits oignons
    et la requete GET est parfaitement interprétée : les sorties 3,4 et 5 et... 6 (pwm) sont mises à jour comme
    il se doit. Tout va donc très bien MAIS ma page WEB MINIMALISTE (pour causes d'erreurs répétées)
    a un bien drôle de format :




    Voici la page minimaliste attendue :


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!DOCTYPE HTML>
    <html>
    <head>
    </head>
    <body>BOOOOOF
    <br /><br />
    </body>
    </html>





    Voici celle que je reçois !!


    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ET /?b=4,5&p=200 HTTP/1.1
    
    GET /?b=4,5&p=200 HTTP/1.1
     HTTP/1.1
    
    GET /?b=4,5&p=200 HTTP/1.1
    
    GET /?b=4,5&p=200 HTTP/1.1
    <!DOCTYPE HTML>
    <html>
    <head>
    
    GET /?b=4,5&p=200 HTTP/1.1
    
    </head>
    <body>BOOOOOF
    <br /><br />
    
    GET /?b=4,5&p=200 HTTP/1.1
    </body>
    </html>
    GET /?b=4,5&p=200 HTTP/1.1




    En clair, la requête recueillie par le serveur "GET /?b=4,5&p=200 HTTP/1.1" (par ex)
    se trouve plusieurs fois au sein du code de la page HTML renvoyée !
    Je suppose que cela est un cas classique et que ça vous
    parle... moi je ne comprends pas.





    VOICI LE CODE ARDUINO QUI RECUP LA REQUETE ET RENVOIE LA PAGE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    // Ces deux bibliothèques sont indispensables pour le shield
    #include <SPI.h>
    #include <Ethernet.h>
     
     
    byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02 };
     
    IPAddress ip(192,168,1,16);
     
    // Initialise notre serveur
    EthernetServer serveur(5011);
     
    // L'url reçu à stocker
    char *url = (char *)malloc(100); 
     
    // index indiquant où l'on est dans la chaîne
    char index = 0;
     
    boolean etats[3] = {LOW, LOW, LOW}; // états broches 3,4 et 5
     
    unsigned char pwm = 0;
     
     
    void setup()
    {
     
       // Configure et initialise les broches
       pinMode(3, OUTPUT); digitalWrite(3, LOW);
       pinMode(4, OUTPUT); digitalWrite(4, LOW);
       pinMode(5, OUTPUT); digitalWrite(5, LOW);
       pinMode(6, OUTPUT); analogWrite (6, 0);
     
     
       Ethernet.begin(mac, ip);
     
       // Donne une seconde au shield pour s'initialiser
       delay(1000);
     
       serveur.begin();
     
    }
     
     
     
     
     
    void loop() 
    {
       // Regarde si un client est connecté et attend une réponse
       EthernetClient client = serveur.available();
     
       if (client) 
       { 
           //Serial.println("Ping !");
           url = "";
           index = 0;
           while(client.connected()) 
           {   // Tant que le client est connecté
               if(client.available()) 
               {   // A-t-il des choses à dire ?
                   // traitement des infos du client
                   // on lit ce qu'il raconte
                   char carlu = client.read(); 
     
                   if(carlu != '\n') 
                   {   // On est en fin de chaîne ?
                       // non ! alors on stocke le caractère
                       // Serial.print(carlu);
                       url[index] = carlu;
                       index++;
                   } 
                   else 
                   {
                       // on a fini de lire ce qui nous intéresse
                       // on marque la fin de l'url (caractère de fin de chaîne)
                       url[index] = '\0';
     
                       // essaie d'interpréter la chaîne
                       boolean ok = interpreter(); 
                       if(ok) 
                       {
                            // tout s'est bien passé alors on met à jour les broches
                            action();
                       }
                       // et dans tous les cas on répond au client
                       repondre(client);
     
                       // on quitte le while
                       break;
     
     
                   }
     
     
     
               }
     
     
           }
     
       }
     
       // Donne le temps au client de prendre les données
       delay(1);
     
       // Ferme la connexion avec le client
       client.stop();
     
     
    }
     
     
     
    void rafraichir() 
    {
       // Rafraichit l'etat des broches / PWM
       digitalWrite(3, etats[0]);
       digitalWrite(4, etats[1]);
       digitalWrite(5, etats[2]);
       analogWrite (6, pwm);
    }
     
     
    void repondre(EthernetClient myclient) 
    {
             myclient.println("HTTP/1.1 200 OK");
     
             myclient.println("Content-Type: text/html");
     
             // On envoie une ligne vide pour signaler la fin du header
             myclient.println();
     
             //page MINIMALISTE CAR J'AI TROP D'ERREURS ICI !!
     
             myclient.println(F("<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n")); 
             myclient.println(F("\r\n</head>\r\n<body>BOOOOOF\r\n<br /><br />\r\n"));
             myclient.println(F("</body>\r\n</html>"));
    }
     
     
     
    boolean interpreter() 
    {  // elle fonctionne très bien...
     
       // On commence par mettre à zéro tous les états
       etats[0] = LOW;
       etats[1] = LOW;
       etats[2] = LOW;
       pwm = 0;
     
       // Puis maintenant on va chercher les caractères/marqueurs un par un.
       // Index pour se promener dans la chaîne (commence à 4 pour enlever "GET "
       index = 0; 
       while(url[index-1] != 'b' && url[index] != '=') 
       {   // On commence par chercher le "b="
           // Passe au caractère suivant
           index++; 
           if(index == 100) 
           {
               // On est rendu trop loin !
               //Serial.println("Oups, probleme dans la recherche de 'b='");
               return false;
           }
       }
     
       // Puis on lit jusqu’à trouver le '&' séparant les broches de p = ....
       while(url[index] != '&') 
       {   
           if(url[index] >= '3' && url[index] <= '5') 
           {
               // On a trouvé un chiffre identifiant une broche
               // On ramène ça au format décimal
               char broche = url[index]-'0';
               // Puis on met la broche dans un futur état haut
               etats[broche-3] = HIGH; 
           }
     
           index++; // Passe au caractère suivant
           if(index == 100) 
           {
               // On est rendu trop loin !
               //Serial.println("Oups, probleme dans la lecture des broches");
               return false;
           }
           // NOTE : Les virgules séparatrices sont ignorées
       }
     
       // On a les broches, reste plus que la valeur de la PWM
       // On cherche le "p="
       while(url[index-1] != 'p' && url[index] != '=' && index<100) 
       {
           // Passe au caractère suivant
           index++; 
           if(index == 100) 
           {
               // On est rendu trop loin !
               //Serial.println("Oups, probleme dans la recherche de 'p='");
               return false;
           }
       }
     
       // Maintenant, on va fouiller jusqu'a trouver un espace
       while(url[index] != ' ') 
       {   // On cherche le ' ' final
           if(url[index] >= '0' && url[index] <= '9') 
           {
               // On a trouve un chiffre !
               // On ramene ca au format decimal
               char val = url[index]-'0'; 
               // On stocke dans la pwm
               pwm = (pwm*10) + val; 
           }
     
           index++; // Passe au caractère suivant
           if(index == 100) 
           {
               // On est rendu trop loin !
               //Serial.println("Oups, probleme dans la lecture de la pwm");
               return false;
           }
           // NOTE : Les virgules séparatrices sont ignorées
       }
     
       // on a trouvé toutes les informations utiles !
       return true;
    }
     
     
     
    void action() 
    {
       // On met à jour nos broches
       digitalWrite(3, etats[0]);
       digitalWrite(4, etats[1]);
       digitalWrite(5, etats[2]);
       // Et la PWM
       analogWrite(6, pwm);
    }




    Merci à tous


    Pierre Grenoble

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    plusieurs remarques dans ton code :
    1- tu as écrit :
    Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    EthernetClient client = serveur.available();
     
       if (client) 
       { 
        // code
       }
     
       // Donne le temps au client de prendre les données
       delay(1);
     
       // Ferme la connexion avec le client
       client.stop();

    je mettrai le client.stop(); dans le if et non à l'extérieur car si le client n'est pas connecté, inutile de le fermer. Donc
    Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    EthernetClient client = serveur.available();
     
       if (client) 
       { 
        // code 
        // Donne le temps au client de prendre les données
         delay(1);
     
         // Ferme la connexion avec le client
         client.stop();
        } // fin if

    2-
    Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             myclient.println(F("<!DOCTYPE HTML>\r\n<html>\r\n<head>\r\n")); 
             myclient.println(F("\r\n</head>\r\n<body>BOOOOOF\r\n<br /><br />\r\n"));
             myclient.println(F("</body>\r\n</html>"));
    Quelles sont les erreurs ?

    La fonction println ajoute une fin de ligne à la chaîne passée en argument. Ensuite, je me pose la question de l'interprétation de \r\n et de la macro F() par le println() dans ce cas de figure. Essaye cette syntaxe, plus lourde mais sans fioriture, que l'on trouve dans de nombreux exemples :
    Code arduino : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    myclient.println("<!DOCTYPE HTML>")
    myclient.println("<html>"); 
    myclient.println("<head>"); 
    myclient.println("</head>");
    myclient.println("<body>");
    myclient.println("<br />");
    myclient.println("plouf plouf");
    myclient.println("<br />");
    myclient.println("</body>")
    myclient.println("</html>");

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Septembre 2015
    Messages : 16
    Par défaut Une page HTML bizarre (suite)
    Bonjour,

    Tes remarques sont des plus pertinentes, tout ça me parait plein de bon sens.

    La fonction F() s'imposait car le code HTML que je souhaite utiliser est relativement long mais
    je ferai l'essai comme tu le préconises et en décomposant au maximum.

    Je retourne chez moi cet aprem, je ferai la manip et je te tiens au courant.

    Merci





    Pierre Grenoble

  4. #4
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2015
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Septembre 2015
    Messages : 16
    Par défaut Une page HTML bizarre
    Bonjour,

    Merci pour votre aide bien utile.



    J'ai aussi remplacé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *url = (char *)malloc(100);     par       char url[100];

    et surtout url = ""; par url[0]='\0';.

    Car mon pointeur pointait sûrement je ne sais où...


    Ce qui posait problème


    Merci à tous

    A bientôt


    Pierre Grenoblois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. cURL qui renvoie une page blanche..
    Par evil_mouss dans le forum Langage
    Réponses: 2
    Dernier message: 08/04/2009, 09h55
  2. alert qui appelle une page web
    Par kanabzh29 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 02/07/2008, 17h43
  3. [HTTPS] Formulaire via proxy qui renvoie une page blanche
    Par Leobaillard dans le forum Apache
    Réponses: 16
    Dernier message: 17/04/2008, 20h06
  4. Script qui ouvre une page web et remplit le formulaire
    Par koKoTis dans le forum VBScript
    Réponses: 12
    Dernier message: 15/08/2006, 02h34
  5. Réponses: 1
    Dernier message: 15/08/2006, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo