|
2281
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 27, 2010, 07:37:41 am
|
Donc pour envoyer une variable à mon fichier test.php, on va utiliser l'url... donc coté Arduino : la variable echec est envoyée dans l'url avec sa valeur : ...?echec=echec... Coté "test.php", c'est $_GET qui récupère la valeur de la variable : fputs($fichier_echec, $_GET[echec]); // On écrit le nouveau nombre d'échec
Avec quelques ligne autour pour ouvrir et fermer le fichier "echec.txt" A noter qu'en faisant comme cela, la variable "echec" est envoyée à la connection établie suivante et qu'a chaque réinitialisation de l'Arduino, elle est remise à 0. Toujours dans "test.php" : // on écrit "coucou...nombre de lecture du fichier" echo 'coucou '; echo 'visite '.$ligne.' '; echo 'echec '.$ligne_echec; (le saut de ligne edst indispensable sinon le moniteur Arduino affichera tout sur une ligne) Ce qui nous donne : connecting... connected HTTP/1.1 200 OK Date: Fri, 27 Aug 2010 12:37:23 GMT Server: Apache Content-Length: 24 Connection: close Content-Type: text/html
coucou visite 31 echec 4
disconnecting.
|
|
|
|
|
2283
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 27, 2010, 05:42:12 am
|
Cette solution avec le while me plait bien....  Bon maintenant exercice suivant:
chaque lecture est répertoriée sur le fichier test.php, ce dernier devra renvoyer : En fait ce n'est pas sur le fichier test.php que cela est écrit mais dans un fichier "compteur.txt" qui est dans le même répertoire, tout ça sur le serveur distant bien sur :  , mais c'est bien test qui écrit dans compteur... le fichier test.php : <?php // on ouvre le fichier $fichier_compteur = fopen('compteur.txt', 'r+'); // on lit la première ligne du fichier $ligne = fgets($fichier_compteur);
// on écrit "coucou...nombre de lecture du fichier" echo 'coucou visite '.$ligne;
//on incrémente le nombre de lecture $ligne++;
// on remet le curseur au début du fichier fseek($fichier_compteur, 0); // On remet le curseur au début du fichier fputs($fichier_compteur, $ligne); // On écrit le nouveau nombre de pages vues
// on ferme le fichier fclose($fichier_compteur);
?> exercice suivant : L'Arduino compte le nombre de fois ou la connection échoue, envoie ce nombre à test.php qui l'inscrit dans echec.txt pour avoir ça qui s'écrit : coucou visite X échec X
|
|
|
|
|
2285
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 27, 2010, 02:31:24 am
|
Ok, donc une piste à développer et à garder sous le coude  . Pour l'instant j'ai encore à faire pour comprendre (à peu près) comment tout ça fonctionne, après si jamais je m'attaquerais à ce genre de chose. Edit: Dans la datasheet w5100: /INT INTERRUPT This pin Indicates that W5100 requires MCU attention after socket connecting, disconnecting, data receiving or timeout. The interrupt is cleared by writing IR(Interrupt Register) or Sn_IR (Socket nth Interrupt Register). All interrupts are maskable. This pin is active low.
|
|
|
|
|
2286
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 27, 2010, 12:33:18 am
|
Merci pour vos réponses. neoirto Ensuite si tu essaies des serveurs distants differents, tu verras que sur certains tu vois passer le header http 200..., et sur d'autres non : ca se traite, mais c'est un autre probleme. Coté serveur distant ? neoirto Mais il y a encore une source d'erreur : lorsque tu fais ta requete, la reponse arrive quasi immediatement (et oui fini les modems des annees 90), mais il ne faut pas pousser :
Ton arduino aura le temps de faire une boucle et donc de louper la communication au passage etc... Et rebelotte dans la suivante...
Pour ça j'ai rajouté un delay(500) ici : Et effectivement maintenant à chaque boucle ça marche  Par contre utiliser un while me dérange un peu, n'y at-il pas une autre solution ? Gromain Note que si tu ne veux/peux pas bloquer le travail de l'arduino en attendant les données, tu peux activer l'interruption matériel du shield ethernet (Int0, pin2) Est ce que tu pourrais développer ?
|
|
|
|
|
2287
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 03:43:31 pm
|
|
Tu penses que je n'ai pas besoin de fermer la connection depuis l'Arduino, le serveur s'en occupant ?
Edit :
Si j'enlève les client.stop(), ça ne marche qu'une fois et après je n'arrive plus à me connecter
|
|
|
|
|
2288
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 02:44:15 pm
|
En fait je viens de m'apercevoir que le cycle ouverture-lecture-fermeture se fait sur deux loop(), le premier passage ouvre la connection et le deuxième passage lit et ferme... :-? Bon maintenant exercice suivant: chaque lecture est répertoriée sur le fichier test.php, ce dernier devra renvoyer : coucou >nombre de lecture< Faut que je me remette à PHP moi ;D
|
|
|
|
|
2289
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 02:15:26 pm
|
Salut Gromain, j'ai justement changé mon code dans ce sens : /* Web client This sketch connects to a website (http://www.mon-site.com) using an Arduino Wiznet Ethernet shield. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 created 18 Dec 2009 by David A. Mellis */#include < Ethernet.h> // Enter a MAC address and IP address for your controller below.// The IP address will be dependent on your local network:byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192,168,1,177 }; byte server[] = { xx; xx; xx }; // mon-site.com// Initialize the Ethernet client library// with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP):Client client(server, 80); void setup() { // start the Ethernet connection: Ethernet. begin(mac, ip); // start the serial library: Serial. begin(9600); // give the Ethernet shield a second to initialize: delay(1000); // Serial.println("connecting..."); // if you get a connection, report back via serial:} void loop() { Serial. println( "connecting..."); if (client. connect()) { client. flush(); Serial. flush(); Serial. println( "connected"); // Make a HTTP request: client. println( "GET http://www.mon-site/test/test.php HTTP/1.0"); client. println(); } else if (!client. connect()){ // if you didn't get a connection to the server: Serial. println( "connection failed"); } // if there are incoming bytes available // from the server, read them and print them: if (client. available()!=0) { int b=client. available(); for ( int a=0; a < b;a++){ char c = client. read(); Serial. print(c); Serial. flush(); } client. flush(); Serial. flush(); client. stop(); } // if the server's disconnected, stop the client: if (!client. connected()) { Serial. println(); Serial. println( "disconnecting."); client. flush(); Serial. flush(); client. stop(); // do nothing forevermore: // for(;; ) // ; } delay(1000); } J'ai changé ça : if (!client.connected()) Du coup ça ne m'écrit pas "disconnecting" au début et à la fin de chaque boucle. Et un pt'it delay (1000) pour ne pas faire plus d'un requête à la seconde... connecting... connected connecting... connection failed HTTP/1.1 200 OK Date: Thu, 26 Aug 2010 19:06:36 GMT Server: Apache Content-Length: 6 Connection: close Content-Type: text/html
coucou disconnecting. connecting... connected connecting... connection failed HTTP/1.1 200 OK Date: Thu, 26 Aug 2010 19:06:39 GMT Server: Apache Content-Length: 6 Connection: close Content-Type: text/html
coucou disconnecting. connecting... connected connecting... connection failed HTTP/1.1 200 OK Date: Thu, 26 Aug 2010 19:06:41 GMT Server: Apache Content-Length: 6 Connection: close Content-Type: text/html
coucou disconnecting.
|
|
|
|
|
2290
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 02:01:42 pm
|
Ma boucle for sert bien à quelque chose : Ethernet : Client class
available()
Description
Returns the number of bytes available for reading (that is, the amount of data that has been written to the client by the server it is connected to).
Syntax
client.available()
Parameters
none
Returns
The number of bytes available. Par contre j'ai supprimé celle ci (tout à la fin): for(;; ); J'ai fait des modifs et il me semble que ça marche à chaque coup, mais je dois faire encore quelques essais.
|
|
|
|
|
2291
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 12:19:15 pm
|
En gros quand ça fonctionne j'ai ça : connecting... connected HTTP/1.1 200 OK Date: Thu, 26 Aug 2010 17:15:36 GMT Server: Apache Content-Length: 6 Connection: close Content-Type: text/html
coucou disconnecting.
Et après : connecting... connection failed disconnecting.
pareille quand ça ne fonctionne pas depuis le début...
|
|
|
|
|
2292
|
Forum 2005-2010 (read only) / Français / Re: Ethernet et PHP
|
on: August 26, 2010, 10:55:59 am
|
Et hop.... /* Web client This sketch connects to a website (http://www.mon-site.com) using an Arduino Wiznet Ethernet shield. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 created 18 Dec 2009 by David A. Mellis */#include < Ethernet.h> // Enter a MAC address and IP address for your controller below.// The IP address will be dependent on your local network:byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192,168,1,177 }; byte server[] = { XX,XX,XX,XX }; // mon-site.com// Initialize the Ethernet client library// with the IP address and port of the server // that you want to connect to (port 80 is default for HTTP):Client client(server, 80); void setup() { // start the Ethernet connection: Ethernet. begin(mac, ip); // start the serial library: Serial. begin(9600); // give the Ethernet shield a second to initialize: delay(1000); Serial. println( "connecting..."); // if you get a connection, report back via serial: if (client. connect()) { client. flush(); Serial. flush(); Serial. println( "connected"); // Make a HTTP request: client. println( "GET http://www.mon-site.com/test/test.php HTTP/1.0"); client. println(); } else { // if you didn't get a connection to the server: Serial. println( "connection failed"); } } void loop() { // if there are incoming bytes available // from the server, read them and print them: if (client. available()!=0) { int b=client. available(); for ( int a=0; a < b;a++){ char c = client. read(); Serial. print(c); Serial. flush(); } client. flush(); Serial. flush(); client. stop(); } // if the server's disconnected, stop the client: if (!client. connected()) { Serial. println(); Serial. println( "disconnecting."); client. flush(); Serial. flush(); client. stop(); // do nothing forevermore: for(;; ) ; } } Pas trop différent de celui de la page que j'ai mis en lien dans mon premier post. j'ai rajouté une boucle for pour la lecture de la chaine entrante (qui fait environ 140 caractères) En fait ce serait pas mal de segmenter cette chaine si j'ai bien compris ?
|
|
|
|
|
2294
|
Forum 2005-2010 (read only) / Français / Ethernet et PHP
|
on: August 25, 2010, 02:15:01 pm
|
Bon finalement je m'y mets aussi.... J'ai reçu mon Ethernet shield et j'ai fais mes premiers essai. Pour afficher une page html en local pas de soucis particulier, mais ensuite.... J'ai mis un fichier test.text dans un répertoire "test" à la racine de mon site et là ça a pas été du gâteau. J'ai utilisé ce code : http://arduino.cc/en/Tutorial/WebClientJ'ai remplacé l'IP de Gougle par celle de mon site. Je pensais qu'en faisant simplement "GET /test/test.txt HTTP/1.0" Je pourrais afficher le contenu de mon fichier.txt.... et bien non. Donc j'ai changer cette URL dans tout les sens et rien à faire... Ensuite j'ai été jeter un coup d'oeil sur les commandes de protocole HTTP et j'ai trouvé qu'il fallait écrire ça de cette façon "GET http://www.mon-site.com/test/test.txt HTTP/1.0" Et là Bingo  le contenu s'affiche, mais précédé de touttes les informations concernant cette requête. J'ai ensuite mis ça dans mon fichier test dont j' changé lextension en .php : <?php echo "coucou"; ?> Je change mon URL comme ceci "GET http://www.mon-site.com/test/test.php HTTP/1.0" Et "coucou" s'affiche avec un peu moins d'info qu'avec le fichier .txt Donc ça marche, mais pas à tout les coups, je lance le serial monitor, ça m'affiche "coucou", j'appuie sur le bouton reset du shield et la ça ne marche plus qu'une fois sur... 5ou 7 fois. Quelqu'un aurait-il une solutions pour que cela fonctionne à chaque requête ou pression sur reset ?
|
|
|
|
|