Ethernet Shield Webserer: Émettre et recevoir des données

Bonsoir,

J’ai mon Ethernet Shield paramétré en webserver qui reçoit des données via la methode GET à l’adresse 192.168.1.178. En fonction de la variable GET ?data=… je peux actionner les sorties numériques. Jusque là tout va bien.

Par contre, je voudrais qu’à un moment du programme, mon Shield puisse envoyer une variable en methode GET vers une page web externe sur un serverdu type http://www.monserver.com?request=toto.

Où et comment placer cette requête? Voici l’essentiel de mon sketch:

...
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 1, 178 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80);

void setup() {
 
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // Start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("Arduino IP server: ");
  Serial.println(Ethernet.localIP());
}

void loop()
{
  // Create a client connection
  EthernetClient client = server.available();
  if (client)
  {
    while (client.connected())
    {   
      if (client.available()) 
      {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100)
        {
          //store characters to string
          readString += c;
          //Serial.print(c);
        }

         //if HTTP request has ended
        if (c == '\n')
        {          
           Serial.println(readString); //print to serial monitor for debuging
    
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta charset='UTF-8'>");
           client.println("<meta http-equiv='refresh' content='5'>");
           client.println("<TITLE>TEMPERATURES DISPLAY</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("Hello World !!!");
           client.println("</BODY>");
           client.println("</HTML>"); 
           
           delay(1);
           
           //stopping client
           client.stop();
           
           //Gestion des sorties 
           //en fonction de readString
           //...

           //clearing string for next read
           readString="";

         }
       }
    }
  }
}

bonjour,
il faut mettre en plus le mode client pour ca

Tu veux dire que je dois rajouter "EthernetClient client;" ?
Ce qui me donne:

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };   //physical mac address
byte ip[] = { 192, 168, 1, 178 };                      // ip in lan (that's what you need to use in your browser. ("192.168.1.178")
byte gateway[] = { 192, 168, 1, 1 };                   // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(80);
EthernetClient client;

Aussi, j’ai rajouté une requête vers monserver.com en début de mon void loop() malheureusement qui me retourne “connection failed to monserver.com”.
Mon shield reçoit bien des données mais ne se connecte pas à au server distant. Qu’ai-je oublié ?

void loop()
{

//Envoi de données
if (client.connect("www.monserver.com", 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /?request=toto HTTP/1.1");
    client.println("Host: www.monserver.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed to monserver.com");
  }


  // Reception de données
  EthernetClient client = server.available();
  if (client)
  {
    while (client.connected())
    {   
      if (client.available()) 
      {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100)
        {
          //store characters to string
          readString += c;
          //Serial.print(c);
        }

         //if HTTP request has ended
        if (c == '\n')
        {          
           Serial.println(readString); //print to serial monitor for debuging
    
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta charset='UTF-8'>");
           client.println("<meta http-equiv='refresh' content='5'>");
           client.println("<TITLE>TEMPERATURES DISPLAY</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("Hello World !!!");
           client.println("</BODY>");
           client.println("</HTML>"); 
           
           delay(1);
           
           //stopping client
           client.stop();
           
           //Gestion des sorties 
           //en fonction de readString
           //...

           //clearing string for next read
           readString="";

         }
       }
    }
  }
}

Avant de vouloir mettre la charrue avant les boeufs, toujours faire étape par étape. Est-ce que le mode client, seul, fonctionne ?

https://github.com/esp8266/Arduino/blob/master/libraries/Ethernet/examples/WebClient/WebClient.ino

Hello,

J'ai testé l'exemple de connexion en Webclient et l'exemple fonctionne. Alors je l'ai adapté à mon projet ce qui me donne le sketch suivant:

//Envoi de la température
            char myserver[] = "www.monserver.com/";
            if (client.connect(myserver, 80))
            {
              Serial.println("connected");
              // Make a HTTP request:
              client.print("GET /arduino/controller.php?air_temp=25");
              client.println("Host: www.monserver.com/");
              client.println("Connection: close");
              client.println();
            }
            else
            {
              // if you didn't get a connection to the server:
              Serial.println("connection failed to monserver.com");
            }

Du côté de mon server, j'ai un fichier "controller.php" stocké dans le dossier "arduino"qui doit recevoir la variable "air_temp" en mode GET.

Quand ma carte arduino exécute le sketch, mon moniteur série affiche bien "connected" mais il ne se passe rien du côté PHP alors que lorsque je saisie directement dans un navigateur le lien : www.monserver.com/arduino/controller.php?air_temp=25, le script PHP réagit et prend en compte la valeur 25 pour air_temp.

Alors pourquoi mon shield se connecte bien à mon server qui visiblement ne reçoit pas la variable "air_temp" ?

TEDDOL:
Alors pourquoi mon shield se connecte bien à mon server qui visiblement ne reçoit pas la variable "air_temp" ?

tu n'as pas oublié de lire la réponse du serveur (client.read() ....)

Encore une fois, étape par étape, regarde ce que tu as oublié (extraite de webclient.ino) :

client.println("GET /search?q=arduino HTTP/1.1");

ta ligne :

client.print("GET /arduino/controller.php?air_temp=25");

Voici la ligne ma ligne modifiée:

client.println("GET /arduino/ajax_controller.php?air_temp=25 HTTP/1.1");

Mon serveur ne réagit toujours pas mais mon moniteur série m'affiche bien "connected" :frowning:

Bonjour,

Au vue des tutos et exemples j’ai supprimé le slash après .com soit char myserver = “www.monserver.com”; et garder la ligne suivante: client.print("GET /arduino/ajax_controller.php?air_temp=25 ");
Là, mon moniteur série me renvoie “connection failed to monserver.com”.
J’ai beau m’inspirer d’autres tutos mais rien à faire, la variable air_temp n’est pas prise en compte côté PHP.

Je désespère… A l’aide!

On est bien d’accord que tu n’as pas laissé “monserver.com” ?

Sinon que disent les log serveur tout simplement ?

Bonjour,

En fait après recherches, j'ai constaté qu'il fallait supprimer la ligne 69: server.begin().

Là, tout fonctionne, mon serveur php reçoit la variable air_temp.

Par contre, j'aimerais savoir et comprendre ce server.begin(). Aquoi sert il ?