Pages: 1 2 3 [4] 5   Go Down
Author Topic: [résolu]Envoyer une requêt GET avec arduino vers une page php pour envois de mai  (Read 6494 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Faraday Member
**
Karma: 34
Posts: 5152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Là tu parles d'une connexion dans l'autre sens : Extérieur vers Duino.
Tu devrais quand même avoir besoin de régler la passerelle, bizarre mais tu n'as certes pas besoin du DNS.

Dans le sens Duino vers Extérieur, il te faut :
- le DNS si tu veux résoudre xxx.free.fr en une adresse IP.
Note que le DNS n'a aucun impact sur la ligne "Host: xxx.free.fr" car celle ci n'est qu'une chaîne de caractères transmises au serveur Free. Elle ne sert qu'à convertir la variable serveur = "xxx.free.fr"; en adresse IP.

- la gateway : ca c'est le plus important. Sans gateway, ta Duino qui est sur un réseau local en 192.168.x.y ne sait pas comment parler au serveur qui est en 212.x.y.z

je pense que les problèmes viennent de là et les manips d'Artouste qui montrent que ca marche en DHCP et pas en statique vont dans le bon sens.

en fait pour avoir une IP statique, il faut renseigner le begin comme ça :
Code:
#include <Ethernet.h>
#include <SPI.h>



/* Changez cette ip par celle correspondant à votre réseau HOST. Plupart des réseaux domestiques on
 * La sous-plage 192.168.0.XXX ou 192.168.1.XXX. Choisissez une adresse
 * atention a ne pas prendre une ip en cours d'utilisation et ne va pas être attribué automatiquement par
 * DHCP de votre routeur. */
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 177 };
byte dns[]={192,168,1,1};
byte gateway[] = { 192,168,1,1 };
byte subnet[] = { 255, 255, 255, 0 };               

char server [] = "christophe.boulic.free.fr";

EthernetClient client;

void setup()
{
 // Ethernet.begin(mac);
 Ethernet.begin(mac, ip, dns, gateway, subnet);

reponse
-------------
192.168.1.177
connecting...
conexion avec le server etabli
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 10:13:24 GMT
Server: Apache/ProXad [Aug  5 2010 16:17:11]
X-Powered-By: PHP/4.4.3-dev
Connection: close
Content-Type: text/html

<html>
<head>
<title>Document sans titre</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
Le mail a bien été envoyé !</body>
</html>

disconnecting
.
Logged

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci c'est parfait smiley
Logged


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci Artouste, c'est là où je voulais en venir.

Une autre solution si tu veux pas t'embeter à tout configurer à la main mais quand même prédire l'adresse IP.
Tu te met en DHCP sur l'Arduino et dans la config de ta (free)box, il y a normalement une section "Baux DHCP statiques" qui te permet de dire :
"Eh toi le DHCP, quand tu vois l'adresse MAC xx:xx:xx:xx:xx:xx qui te demande quelque chose, tu lui donne X.Y.Z.T comme adresse IP. Et puis t'oublie pas de lui donner la passerelle et le DNS pendant que tu y es".

Toutes mes machines (PC ou embarqués) qui on un serveur fonctionne comme cela chez moi.
Comme ca, c'est simple, elles sont en DHCP et ca se débrouille


* dhcp-permanents.png (17.95 KB, 690x320 - viewed 23 times.)
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

autre petite question dans les exemple de webclient il marque que dans le loop la partie:
Code:
if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

est pour faire du debuguing
j'ai l'impresion que dans mon systeme cette partie ne fonctione bizzarement car tout le message ne s'ecrit pas d'un coup mais en decoupé avec la suite des autre serial print de mon void loop()
on retrouve une partie de la reponse en plusieur morceau !
ma  question est simple peut ton ce paser de lire la réponse et eventuellement vider le cache avec un client.flush(), est ce que sa marcherai?
Logged


Offline Offline
Faraday Member
**
Karma: 34
Posts: 5152
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

autre petite question dans les exemple de webclient il marque que dans le loop la partie:
Code:
if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

est pour faire du debuguing
j'ai l'impresion que dans mon systeme cette partie ne fonctione bizzarement car tout le message ne s'ecrit pas d'un coup mais en decoupé avec la suite des autre serial print de mon void loop()
on retrouve une partie de la reponse en plusieur morceau !
ma  question est simple peut ton ce paser de lire la réponse et eventuellement vider le cache avec un client.flush(), est ce que sa marcherai?

bonjour
simple reflexion : cette partie est peut etre soumise à des routines d'interruptions qui interrompent la fluidité de l'affichage.
solution pragmatique :  si tu n'en a pas besoin tu la bypass  smiley-mr-green
Logged

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

c'était bien mon idée smiley-mr-green
Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bon j'ai ecrit une fonction qui peut certainement etre amélioré mais si sa peut etre utile a quelqu'un la voici:


dans les declaration :
Code:
static uint8_t mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
/*adresse mac coller sous le shield ou celle ci par defaut */
 EthernetClient client;
/* créé un objet client representant la conection */

dans le setup :

Code:

  Ethernet.begin(mac);
/* Configuration de la bibliothèque Ehternet avec l'adresse mac il est optinel de placer l'adresse ip et autre réglage car depuit IDE 1.0 la biblioteque prend en charge le DHCP*/

Code:
void alertemail(){
   
   char server [] = "christophe.boulic.free.fr"; //votre site internet perso exemple celui de mon site free
    Serial.println("adresse ip : ");//on demande au serial d'aficher l'adresse ip atribure par le DHCP
    Serial.println(Ethernet.localIP());
    delay(1000);
    Serial.println("connection...");
    for( byte i=1;i<=3;i++){
      switch(i){
        case 1 :
if (client.connect(server, 80)) {
    Serial.println("conexion avec le server etabli");
    // requête HTTP ver une page PHP sur le serveur de votre site:
    client.println("GET /arduino/alertetemp.php?alerte=1 HTTP/1.1");/* on va faire une requete de type get pour demander au serveur d’exécuter le code PHP de la page alertetemp.php alerte = 1 pour le premier type de message*/
    client.println("Host: christophe.boulic.free.fr");
     client.println("User-Agent: arduino-ethernet");
   client.println("Connection: close");
    client.println();
    }else {
    Serial.println("echec de la conection");};//si la connection n'a pas réussi:
    break;
    case 2:
    Serial.println(" lecture reponse client");
    delay(5000);
    Serial.print(" nombre de byte disponible : ");
    Serial.println(client.available());//on demande l’affichage du nombre de byte disponible
if(client.available()) {//on demande l’affichage de la réponse client
  for( int i=0;i<=client.available();i++){
       char c= client.read();
       Serial.print(c);
       }
       Serial.println();
       delay(1000);
  Serial.println("vide du tampon client");
  client.flush();//on vide la mémoire tampon du client
};
 break;
  case 3:
  Serial.println("tentative de deconection");
   if (!client.connected()) {
    Serial.println();
    Serial.println("deconection.");
    client.stop();//on déconnecte et termine la liaison avec le client
   
 };
 break;};}
return;}

le code de la page PHP:
Code:
<?php
if ($_GET['alerte']=="1") {
     
// Le message
     
$message "message d'exemple alerte temperature et le lien vers votre interface de gestion http://votre lien";

     
// Dans le cas où nos lignes comportent plus de 70 caractères, nous les coupons en utilisant wordwrap()
     
$message wordwrap($message70);

     
// Envoi du mail
     
 $envoi=mail("monsieurX@gmail.com",'alerte'$message,"From: $exp\r\n"."Reply-To: $exp\r\n"); 
if(
$envoi) echo"Le mail a bien été envoyé !"
else echo
"L'envoi a échoué, merci de renouveller l'opération !"; };
?>

voila j'imagine que c'est loin d’être parfait mais sa semble bien fonctionner de chez moi

seul problème que je  rencontre c'est que la réponse du client ne s'affiche pas correctement et est couper, mais je n'arrive pas a régler le problème.

autre souci après intégration dans mon projet mon système plante total et néccesite d’être réinitialise j'ignore encore l'origine je vais faire des teste avec un chrono car sa semble se produire a environ le même temps  a chaque foi!

si vous avez des remarque n'hésiter pas !
merci a vous!
kris
Logged


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Je pense que quand tu lit le nombre d'octets tout n'est pas encore arrivé, donc tu t'arrête trop top.
Attendre 5 secondes ne sert à rien.
La liaison HTTP est basé sur TCP qui inclue des contrôle entre les parties.
Si l'Arduino ou le WS5100 a un tout petit buffer de réception la liaison va se mettre en pause.
Tu va obtenir par client.available() le contenu du tampon, et pas plus même si tu attends 5 secondes ou 10 ou 20.
Et tu ne vas pas lire plus

Il faut une boucle sur client.available() avec un timeout de sortie

Code:
case 2:
    Serial.println(" lecture reponse client");
    unsigned long start = millis();
    while ( ((millis() - start) < 200) )
    {
        if ( client.available() )
        {
                while ( client.available() )
                    Serial.print( client.read() );   
                now = millis();
        }
    }
    break;

Ca devrait être mieux.
A mon avis on doit même pouvoir réduire la tempo de 100ms à 50 voire 10 ms.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

OK merci barbudor, mais a quoi sert le" now=millis()" qui n'est déclarer nul part , j'imagine qu'il doit intervenir pour redémarrer la boucle non?
Logged


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Oups, c'était start. J'ai changé le nom en cours de frappe smiley-sad

Code:
case 2:
    Serial.println(" lecture reponse client");
    unsigned long start = millis();
    while ( ((millis() - start) < 200) )
    {
        if ( client.available() )
        {
                while ( client.available() )
                    Serial.print( client.read() );   
                start = millis();
        }
    }
    break;

C'est la tempo pour sortir de la boucle.
Tant qu'il y a des données qui arrive, on les affichent et on remet la tempo a zéro en relisant l'heure courante.
Si plus aucune données n'arrivent, au bout de 200ms on sort de la boucle.
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

merci c'est beaucoup plus claire , bon bin je vais attendre ce soir pour tester tout sa smiley-mr-green
 car j'ai pas mon module avec moi au boulo  smiley-cry
merci pour ton explication qui est très clair, c'est super important pour les débutant comme moi de bien comprendre la logique d'un informaticien!
Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@ Barbudor : j'ai essayer ton code mais j'ai encore moins de résultat q'avec le miens (une foi n'est pas coutume), et de plus si je ne met pas un delay même dans mon code le retour sur la taille des octet présent dans le buffer client indique 0 j'ai réussi a estimer qu'il falai entre 1 et 2 seconde pour que le buffer ai reçu 206 Octet!

apres ça n'est qu'une deduction , vu que je n'y connai rien en protocole TCP! smiley
Logged


Made in Belgium
Offline Offline
God Member
*****
Karma: 1
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Une chose que tu peux faire, c'est ajouter côté php un signal de "fin de transmission", 0x04 ou '\4' en correspondance ASCII :

Code:
echo '\4';

Comme ça côté arduino tu boucles read temps que tu n'as pas reçu ce signal.

Code:
if ( client.available() )
{
    char c = 0;
    while(c != '\4')
    {
        c = client.read();
        Serial.print(c);
        .
        .
        .
    }
}

Évidement il faudrait ajouté un timeout aux cas ou ce signal ce serait perdu en chemin, ce qui ne devrait pas arrivé mais c'est on jamais perte de connexion ou autre.
« Last Edit: July 09, 2012, 05:02:08 am by osaka » Logged


Region ile de france.
Offline Offline
Sr. Member
****
Karma: 3
Posts: 446
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon je viens de decouvrire le système pushingbox smiley-eek ,
et du coup j'ai modifier mon code pour faire ussage de ce systeme qui et "terible avec mon tel android et l'aplis notifry , je reçois des notification et en plus il parle tout seul pour me donné le message d'alerte , bref merci a vous tous d'avoir répondu a mes question qui mon permis de comprendre le code précédent !
 smiley
Logged


Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ca a l'air bien
Mais je n'ai pas de tel Android. A la boite c'est BlackBerry uniquement smiley-grin
Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Pages: 1 2 3 [4] 5   Go Up
Jump to: