Envoyer une requête vers un shield Ethernet - Aduino Uno

Bonjour, alors je vous explique.
J'utilise un shield Ethernet connecté a une Arduino Uno. Je fait de mon aduino un serveur et j'aimerai qu'il attendent qu'on lui envoie une requête avec des information comme "nomFichier" "nom" "heure"
mais je ne sais pas comment faire. J'ai cherché sur internet mais je ne trouve pas mon bonheur. Je trouves des choses mais ce n'est pas ce que je veux.
Pour résumé :
-Mon arduino est un serveur
-je veux qu'il attendent qu'on lui envoie des informations via un formulaire
-Il stock les infos via des variables
et c'est tout mais je n'arrive pas trouvé comment faire. Donc si vous aviez un exemple de programme qui pourrait m'aider.
Merci d'avance et bonne journée a vous

Il faut parser la requête.
Voir cet exemple : w5100/http.cpp

void http_request::parse(const char *request)

Dans cette méthode, strtok est utilisé pour décortiquer la requête.

Il aurait été plus simple d'utiliser un ESP8266 ou ESP32.
La classe WebServer permet l'accès aux arguments de la requête avec des méthodes toutes faites.

Salut ,

ben avec cet exemple on y voit tout de suite bien plus clair :stuck_out_tongue:

desolé pour cette reponse ironique , mais deja , je ne comprends pas tout ce que fait ton programme , on dirait plus une classe , et oui , j ' ai un petit niveau , mais je me met a la place de quelqu ' un qui debute completement , en voyant ton code , je ne suis pas sur de sa reaction , mais je pense que 99 .9 % de ceux qui n ' ont jamais rien programmé ni vu un bout de code , sont completement horifiés :grinning:

le principe d ' envoyer une requete a un serveur reste assez abstrait quand on y a jamais mis les pieds .

bref tout ca pour dire , que c ' est pas evident de debuter , et que sans un langage humain et des explications , c ' est difficile de s' y retrouver , longue vie a ce forum !

ce sujet m ' interresse fortement , je suis en train de bosser sur presque la meme chose .

Ta remarque est très pertinente, mais l'utilisation de la classe WebServer ou ESP8266WebServer sur ESP32 ou ESP8266, si tu les a déjà utilisées, te pose t-elle problème ?
Non, car tu te contente de partir d'exemples tout faits, et bien faits.
Mais mettre le nez dans les sources de ces classes t'es t-il venu à l'idée ? Probablement pas ...

Le problème est exactement le même. On n'attaque pas une falaise avec une pagaie.
On ne peut expliquer une problématique complexe avec des mots simples.
Le problème est que le débutant actuel veut un résultat immédiat sans se fatiguer à acquérir les connaissances.
Sans connaître la structure d'une requête serveur, il n'y a aucun moyen d'arriver à coder quoi que ce soit en techno WEB.

Je suis désolé mais cela ne marche pas comme cela. Le débutant se forme à des problématiques simples avec des exemples simples.

"Hello World" est un bon début.

J'ai quelque question en rapport avec le code envoyé :
-a quoi correspond cette constante ? A une icon ? Un chemin ? J'avoue avoir du mal a comprendre#define FAVICON "AAABAAEAEBAAAAAAAABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJuWADKgmgAAm5UAFpqVAAablgAsnJYASpmUAAKblgAnm5UAKJuWAD6clgBKm5YAJZqUAASalQAJm5YAXZyXAACalQAXm5YAo1xmAACblgDrm5UAGpuWAHablgD5m5YA8ZuWAOCblgAAm5YAfpuWAIOblgDnm5UAPZuWAAeblgCam5UAAJuWAP+TkAACm5YA4ZuWADWblgDtm5YAiJuWAPGblgDgm5YAv5uWAPKblgB+mZUAEJqVAB+blgDgm5YAMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAm5YAJZuWAP+clwD/nJcA/5uWAP6blgAiAAAAAAAAAACblgAbm5YA/pyXAP+clwD/m5YA/5uWAC4AAAAAm5UAGZyXAP+blgDVmpQAC5qVAA2blgDZnJcA/5uWAFGblgBCnJcA/5uWAOGalAAQmpUACpuWAMyclwD/m5YAJZuWAPublgDmmZUAAAAAAAAAAAAAAAAAAJuWAJKclwD/nJcA/5uWAKackwAAm5UANpqUABWZlQAAm5YA25uWAP6clwD/m5YAQZuXAACblwD5m5cA+ZqXAAaZlAAAm5YA/5uWAP+alQAAmpcABpuWAPublgD6nZgAAJuWACyclwD/nJcA/5uWAJ8AAAAAAAAAAAAAAAAAAAAAm5YAGpyXAP+clwD/mpYAIgAAAACblgBcm5UAJAAAAACblgCLnJcA/5uWAHmclwD/m5YALAAAAAAAAAAAm5YAL5yXAP+blgDXm5YAy5yXAP+blQA3AAAAAAAAAACblQAknJcA/5uWAIyZlQAAm5YAxpyXAP+clwD/nJcA/5yXAP+blgDHmpQAAJqXAACblgC7nJcA/5yXAP+clwD/nJcA/5uWANGakQAGAAAAAAAAAACYkgACm5YAVZuWAFGYlAABAAAAAAAAAAAAAAAAAAAAAJeUAACblgBOm5YAWJmSAAOZjwAAm5MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//8AAP//AAD//wAArGYAAKgdAAD//wAAw8MAAJmZAAA8PAAAZmYAAD58AAC8PAAAgYEAAP//AAD//wAA//8AAA=="

-Le langage utilisé j'ai l'impression qu'il diffère un petit peu de celui pour l'arduino (du moins celui que j'apprend en cour, "une forme de C simplifier"

  • La c'est pas une question mais une précision les bibliothèque que j'utilise :
#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

-Je n'ai pas la bibliothèque "http.h", est-elle sensé être intégré directement au logiciel "Arduino" ou faut-il que je la télécharge moi même ?

Ah et peut-être aurais-je du le faire plus tôt mais voici actuellement mon programme (il manque un peu de commentaire mais bon)

#include <SPI.h>
#include <Ethernet.h>
#include <Server.h>
#include <Client.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0E, 0xFE, 0xED
};
IPAddress ip(192, 168, 222, 100);

EthernetServer server(80);
EthernetClient client;

void setup(  )
{
  // On démarre la voie série pour déboguer
  Serial.begin(9600);

  char erreur = 0;
  // On démarre le shield Ethernet
  Ethernet.begin(mac, ip);

  Serial.println("Init...");
  // Donne une seconde au shield pour s'initialiser
  delay(1000);
  // On lance le serveur
  server.begin();
  Serial.print("Pret !");
}


void loop()
{

}

Comme vous pouvez le voir, ce n'est que de l'initialisation de serveur. Il faut que j'ajoute la condition client.connected() mais vous avez au moins le début

-a quoi correspond cette constante ? A une icon ? Un chemin ? J'avoue avoir du mal a comprendre

C'est une icône sous forme binaire.

-Le langage utilisé j'ai l'impression qu'il diffère un petit peu de celui pour l'arduino (du moins celui que j'apprend en cour, "une forme de C simplifier"

Le langage ARDUINO n'existe pas.
C'est du C / C++.

-Je n'ai pas la bibliothèque "http.h", est-elle sensé être intégré directement au logiciel "Arduino" ou faut-il que je la télécharge moi même ?

Les fichiers sont tous là :
https://bitbucket.org/henri_bachetti/arduino-ethernet-web-server/src/master/arduino/w5100/

Par contre il n'y a pas de page HTML du style formulaire.

Eh bien comme il existe des formulaires en PHP et HTML pour envoyé des requête mySQL je me suis dit qu'il était possible de faire de même, depuis une page internet envoyé un "formulaire" à l'arduino pour qu'il puisse les stocker et les modifier quand on lui en envoie de nouveau

Si l'ARDUINO est serveur c'est lui qui envoie la page HTML, et donc le formulaire.
Ensuite l'utilisateur clique sur un bouton et le navigateur renvoie une requête contenant une autre URL ainsi que les données.

Par exemple :

/form : URL d'affichage du formulaire

Lorsqu'il voit cette requête /form l'ARDUINO renvoie une page HTML contenant un formulaire (exemple <form action="/form-action" method="get">) et les champs à renseigner (balise )

Lorsque l'utilisateur valide le navigateur envoie :
/form-action?arg1=blabla&arg2=azerty

Le serveur traite la requête /form-action.
C'est la même chose qu'en PHP.

Ah d'accord je te remercie de la précision. Je pensais qu'il était possible de passé par une autre page, pour envoyé la requête vers le serveur arduino. Qui permettrai donc d'avoir un code un petit peu plus léger sur mon arduino
Merci de ta réponse en tout cas

Autre chose : as-tu l'intention de passer par des requêtes formulaire POST ?

Si oui, les arguments POST passent en fin de requête. Il faudra prévoir au moins 500 octets de buffer.
Si non, les arguments GET passent en début de requête juste après l'URL, donc il n'y a pas besoin de lire la requête complète.

Des requêtes POST limiteront largement l'utilisation d'une UNO qui a seulement 2K de RAM.

Je viens de me livrer à un petit exercice :

https://bitbucket.org/henri_bachetti/webserver-form/src/master/ethernet/ethernet.ino

Un petit server WEB. Voici les différentes URL :

http://xxx.xxx.xxx.xxx/parser : affiche les arguments de l'URL

Exemple : http://xxx.xxx.xxx.xxx/parser?arg1=1234&arg2=4567

http://xxx.xxx.xxx.xxx/form : affiche un formulaire

Si l'on clique sur Send la page suivante affiche les arguments.

Le formulaire peut être GET ou POST :

#define FORM                  POST
ou
#define FORM                  GET

Je me suis débrouillé pour que la requête soit lu partiellement, y compris en POST.

Les variables globales utilisent 878 octets (42%) de mémoire dynamique,
ce qui laisse 1170 octets pour les variables locales. Le maximum est de 2048 octets.

La même chose avec un ESP32 :

https://bitbucket.org/henri_bachetti/webserver-form/src/master/esp32/esp32.ino

Version ARDUINO ethernet :

  • 1 journée de boulot
  • 386 lignes

Version ESP32 :

  • 30 minutes de boulot
  • 122 lignes

@iznobe : je ne sais pas si tu trouves la version ethernet plus simple sans classes ...
Mais avoue quand même qu'un ESP32 facilite les choses.

hbachetti:
@iznobe : je ne sais pas si tu trouves la version ethernet plus simple sans classes ...
Mais avoue quand même qu'un ESP32 facilite les choses.

Effectivement , les classes une fois qu ' ont sait les utiliser , facilite les choses , en meme temps , c ' est leur but !

le revers de la medaille , c ' est que ceux qui ne prennent pas le temps de les decortiquer ( faut deja en etre capable ) et qui ne connaissent pas le coté etehrnet shield sans classe , ne savent pas comment faire pour des choses qui ne sont pas prevues dans les classes , ils se retrouvent " cantonner " a n ' utiliser que les methodes prevues .

le top est de savoir comment faire en premier , et d ' utiliser une classe afin de s ' alleger , encore faut il avoir le temps , l ' envie etc .

Maintenant pour des personnes qui ont une connaissance approfondie dans le domaine , il est evident que passer par une classe est la solution ideale .

Tout depend du niveau des personnes , et de leurs attentes : faire un truc vite fait sans rien comprendre , utopique mais bon , y en a encore qui croit au barbu :stuck_out_tongue: ) , ou bien comprendre et pouvoir se debrouiller dans la plupart des cas qu ils croiseront , et les pros .