ESP8266 NodeMCU récupérer une donnée page WEB

Bonjour à tous,

Je suis débutant dans l’univers Arduino et je n’ai pas l’habitude de demander de l’aide… Sauf que là, j’arrive dans un cas critique ou je ne trouve pas la solution à mon problème.

Je souhaite récupérer une valeur écrite sur une page web via le wifi (ESP8266 sous firmware NodeMcu).

Je m’expliques:

-L’ESP8266 se connecte à un site www.blabla.com/index.php

-Il récupère la donnée affichée sur cette page après les caractères : “?=” (En gros, si la page web retourne “?=635” je voudrais que l’ESP8266 ne lise que 635, et vérifie si cette valeur change. Si elle est changée, le programme va interpréter une action (servomoteur, led etc…). Dès que la valeur change, il effectue une action

J’ai beau me renseigner partout sur le web je n’arrives pas à effectuer cette manipulation.

J’ai utilisé les exemples de la librarie ESP (WebClient etc…) mais impossible de compléter ce code.

Voici mon morceau de code :

#include <SPI.h>
#include <ESP8266WiFi.h>

const char* ssid = “MONSSID”;
const char* password = “MONMDP”;
String serverData = String();
WiFiServer server(80);
int isTransferring = 0;
long Difference = 0;
long Count = 0;
long Number = 0;
long lastCount = 0;

void WiFiEvent(WiFiEvent_t event) {
Serial.printf("[WiFi-event] event: %d\n", event);

switch(event) {
case WIFI_EVENT_STAMODE_GOT_IP:
Serial.println(“WiFi connected”);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
break;
case WIFI_EVENT_STAMODE_DISCONNECTED:
Serial.println(“WiFi lost connection”);
break;
}

}

void setup() {
Serial.begin(9600);
WiFiClient client = server.available();
// delete old config
WiFi.disconnect(true);

delay(1000);

WiFi.onEvent(WiFiEvent);

WiFi.begin(ssid, password);

Serial.println();
Serial.println();
Serial.println("Wait for WiFi… ");
}

void loop() {

// If we get a connection, report back via serial:
if(isTransferring == 0){
if (client.connect()) {

// Make a HTTP request:
client.println(“GET /index.php HTTP/1.1”);
client.println(“Host: www.blabla.com”);
client.println();

isTransferring = 1;
} else {
isTransferring = 0;
}
}

// Loop until the client is available
while (client.available()) {

// Collect client response data
char c = client.read();

// Append to our returned server data to parse later
serverData += c;

}

// During transfer if the connection stops kill the connection
// and process the response
if(isTransferring == 1){

// if the server’s disconnected, stop the client:
if (!client.connected()) {

Serial.println();
Serial.println(“disconnecting.”);
client.stop();

isTransferring = 0;

//je ne récupére que le chiffre qui m’interesse
long phrase = long(serverData.indexOf("?="));

String Count = String(serverData.substring(phrase+2, phrase+22).trim());
Number = stringToLong(Count);

Serial.println(“Number:”);
Serial.println(Number);

Serial.println(“lastCount:”);
Serial.println(lastCount);

Difference = Number - lastCount; //je note la différence

lastCount = Number; //je sauvegarde le nouveau chiffre

Serial.println(“likeDifference:”);
Serial.println(likeDifference);

// Si il y a une différence j’effectue une action
if(Difference > 0 && Difference != lastCount){

// Blink the differnece
for(int i=0;i<Difference;i++){

Serial.println(“Blinking…”);
Serial.println(i);

// Get your blink on!!!

delay(3000); // Leave a light on for me, I’ll be… for 3 seconds

}
}

// Reset response data
serverData = String();

// Wait X more seconds before checking again. 5000 is 5 sec
delay(5000);
}
}
}

// Helper function to turn a string into a long int
long stringToLong(String s) {
char arr[12];
s.toCharArray(arr, sizeof(arr));
return atol(arr);

}

Je voulais savoir si cette manipulation était réalisable avec le même fichier index.php mais compris dans une carte SD par exemple ? Juste dans la théorie. La pratique j’essayerai de me débrouiller.
Merci par avance à ceux qui m’aiderons.

Votre arduino c'est le client web ou le serveur web? qui envoit le GET?

Frank75002:
...
Je souhaite récupérer une valeur écrite sur une page web via le wifi (ESP8266 sous firmware NodeMcu).

bonjour
c'est quoi exactement ton ... "firmware nodemcu" ?

J-M-L:
Votre arduino c'est le client web ou le serveur web? qui envoit le GET?

Bonsoir, merci pour votre réponse. En fait, j'ai une page web ex http://blabla.com/index.php (ou sur un fichier .php stocké sur ma carte SD), lorsque je vais sur cette page, elle génère automatiquement un nombre (dans mon cas le nombre est inscrit en clair sur la page web comme ceci : "?=635". Je veux que l'arduino récupère le chiffre de cette page pour que je puisse m'en servir pour effectuer une action (si le chiffre à changé).

Artouste:
bonjour
c'est quoi exactement ton ... "firmware nodemcu" ?

Bonsoir, merci également pour ta réponse, le fichier en question est le suivant : nodemcu_integer_0.9.6-dev_20150704

Bonne soirée

Bonjour, je me permet de relancer mon topic (48h).

Bonjour, je me permet de relancer mon topic.

Frank75002:
Bonjour, je me permet de relancer mon topic.

Bonjour
Tu n'es simplement pas au bon endroit pour avoir des réponses. :grin:
Ici c'est un forum ARDUINO.

Si tu utilisait un ESP8266 sous environnement IDE ARDUINO , tu aurais eu des réponses.

Mais l'environnement NODEMCU n'a rien à voir avec ARDUINO.

Perso , je n'ai jamais utilisé les ESP8266 sous NODEMCU.

Artouste:
Bonjour
Tu n'es simplement pas au bon endroit pour avoir des réponses. :grin:
Ici c'est un forum ARDUINO.

Si tu utilisait un ESP8266 sous environnement IDE ARDUINO , tu aurais eu des réponses.

Mais l'environnement NODEMCU n'a rien à voir avec ARDUINO.

Perso , je n'ai jamais utilisé les ESP8266 sous NODEMCU.

Merci pour ta réponse, j'utilise bel et bien l'IDE arduino avec un ESP8266 flashé sous NodeMCU

Artouste:
Perso , je n'ai jamais utilisé les ESP8266 sous NODEMCU.

il doit y avoir une petite incompréhension voir ici

Artouste:
perso actuellement , j'utilise prioritairement des module nodemcu esp8266
comme

par contre je n'ai toujours pas compris :

  • qui est serveur qui est client qui est http://blabla.com
  • qui a une carte sd
  • s'il y a un arduino en plus de l'esp
    donc difficile d'aider ...

cf ma question en #1

En gros, si la page web retourne “?=635” je

→ et elle retournerait cela où? si c’est l’URL dont vous parlez, se pose la question de qui est le serveur et qui est le client…

-L’ESP8266 se connecte à un site www.blabla.com/index.php

vous initiez donc une requête depuis votre ESP8266; Votre ESP est client (il joue le rôle de navigateur web, c’est lui qui envoie les URLs), vous avez quelque part une machine connue de votre DNS sous le nom de www.blabla.com qui dispose dans son dossier racine d’un script PHP qui se nomme index.php

Donc quand votre ESP8266 fait cela, il envoit une requête HTPP vers un serveur. Cette requête arrive sur votre script index.php qui va bâtir une réponse sous la forme d’une page web HTML qu’il va retourner à votre ESP8266.

Cette page va être constituée d’un header et d’un corps en HTML. à vous de décider où vous mettez les valeurs à récupérer par l’ESP. l’ESP reçoit tout le flot de la page HTML à décoder. → faut faire un petit analyseur syntaxique pour trouver la réponse. votre index.php pourrait simplement retourner juste la valeur dans le par exemple.

la notion d’URL avec ?=635 c’est si votre ESP8266 était un serveur et qu’il reçoit des requêtes depuis un navigateur web. vous ouvrez le navigateur de votre choix, vous tapez 192.168.1.15/xxxxx si votre ESP a déclaré un serveur web sur 192.168.1.15, votre ESP reçoit alors une requête sous forme d’une URL à décoder. Si elle n’a pas de paramètres, vous répondez à cette requête en fabriquant une page web, en HTML, avec des liens, des objets, ce que vous voulez… par exemple vous avez un formulaire avec une zone de texte et quand l’utilisateur change la valeur ça soumet le formulaire en format GET par exemple avec la valeur =635… Votre ESP8266 reçoit alors cette URL, la décode voit le signe =, lit la valeur, met à jour le moteur et retourne une nouvelle page web avec d’autres infos…

c’est plus clair comme cela?

Frank75002:
Merci pour ta réponse, j'utilise bel et bien l'IDE arduino avec un ESP8266 flashé sous NodeMCU

un firmware ESP8266 flashé sous NODEMCU , ce n'est pas un firmware ESP8266 flashé sous IDE arduino.

Il y a de l'incomprehension qui traine.

Tu utilise quoi exactement pour programmer "ta carte" ?

Attention à ne pas confondre "MODULE ESP8266 NODEMCU" avec le firmware flashé.
Perso , j'utilise des "MODULE ESP8266 NODEMCU" que j'utilise en mode arduino IDE.

le firmware NODEMCU livré sorti "usine" est remplacé lors du premier flashage par l'IDE ARDUINO.

J-M-L:
cf ma question en #1
→ et elle retournerait cela où? si c’est l’URL dont vous parlez, se pose la question de qui est le serveur et qui est le client…

vous initiez donc une requête depuis votre ESP8266; Votre ESP est client (il joue le rôle de navigateur web, c’est lui qui envoie les URLs), vous avez quelque part une machine connue de votre DNS sous le nom de www.blabla.com qui dispose dans son dossier racine d’un script PHP qui se nomme index.php

Donc quand votre ESP8266 fait cela, il envoit une requête HTPP vers un serveur. Cette requête arrive sur votre script index.php qui va bâtir une réponse sous la forme d’une page web HTML qu’il va retourner à votre ESP8266.

Cette page va être constituée d’un header et d’un corps en HTML. à vous de décider où vous mettez les valeurs à récupérer par l’ESP. l’ESP reçoit tout le flot de la page HTML à décoder. → faut faire un petit analyseur syntaxique pour trouver la réponse. votre index.php pourrait simplement retourner juste la valeur dans le par exemple.

la notion d’URL avec ?=635 c’est si votre ESP8266 était un serveur et qu’il reçoit des requêtes depuis un navigateur web. vous ouvrez le navigateur de votre choix, vous tapez 192.168.1.15/xxxxx si votre ESP a déclaré un serveur web sur 192.168.1.15, votre ESP reçoit alors une requête sous forme d’une URL à décoder. Si elle n’a pas de paramètres, vous répondez à cette requête en fabriquant une page web, en HTML, avec des liens, des objets, ce que vous voulez… par exemple vous avez un formulaire avec une zone de texte et quand l’utilisateur change la valeur ça soumet le formulaire en format GET par exemple avec la valeur =635… Votre ESP8266 reçoit alors cette URL, la décode voit le signe =, lit la valeur, met à jour le moteur et retourne une nouvelle page web avec d’autres infos…

c’est plus clair comme cela?

En faite c’est tout à fait ça ! Ce sont vos deux explications en même temps. Oublions l’histoire de la carte SD pour le moment je voudrais me concentrer sur le web.

En faite, le module va se connecter → si la connexion est ok → le module va récupérer une valeur sur une page web .php (dans mon exemple la page web génère de cette panière “625” → le module va alors récupérer cette valeur en cherchant celle qui est entre les '" → une fois trouvée elle va simplement l’afficher dans le moniteur série

Voici mon code en cours…

#include <ESP8266WiFi.h>
#include <Wire.h>  // This library is already built in to the Arduino IDE
 
const char* ssid = "monréseaussid";
const char* password = "MDP";
 
int ledPin = 13; // GPIO13


const char* host = "http://blabla.com";
int find_text(String needle, String haystack,int from) {
  int foundpos = -1;
  if (haystack.length()<needle.length())
    return foundpos;
  for (int i = from; (i < haystack.length() - needle.length()); i++) {
    if (haystack.substring(i,needle.length()+i) == needle) {
      foundpos = i;
      return foundpos;
    }
  }
  return foundpos;
}
 
void setup() {
  Serial.begin(9600);
  delay(10);
 
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
 
 // We start by connecting to a WiFi network
 
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
 
int value = 0;


 
void loop(){


  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
   
  }
  
  // We now create a URI for the request
  String url = "http://rayn-concept.com/index.php";
  Serial.print("Requesting URL: ");
  Serial.println(url);
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
               Serial.println("la requete est envoyée ");
  delay(500);
  
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
   String line = client.readStringUntil('\r');
   Serial.println(line);


int start_loc= find_text("<b>",line,0);
int end_loc=find_text("</b>",line,0);
Serial.println(line);
if (start_loc>0 && end_loc>0)
{

for (int i=start_loc+3;i<end_loc;i++)
{
Serial.print(line[i]);
Serial.println(line[i]);
}
Serial.println("");

int start_loc2= find_text("<b>",line,end_loc+1);
int end_loc2=find_text("</b>",line,end_loc+1);
if (start_loc2>0 && end_loc2>0)
{

  Serial.println("chiffre:");
for (int i=start_loc2+3;i<end_loc2;i++)
{
   
Serial.print(line[i]);
}
}


}
    
 //   Serial.println(line);
  }
  
  Serial.println();
  Serial.println("closing connection");  }

.

Voici le code source de ma page PHP (c’est juste pour le teste):

<?php

echo '<b>635</b>';
?>

.

Artouste:
un firmware ESP8266 flashé sous NODEMCU , ce n’est pas un firmware ESP8266 flashé sous IDE arduino.

Il y a de l’incomprehension qui traine.

Tu utilise quoi exactement pour programmer “ta carte” ?

Attention à ne pas confondre “MODULE ESP8266 NODEMCU” avec le firmware flashé.
Perso , j’utilise des “MODULE ESP8266 NODEMCU” que j’utilise en mode arduino IDE.

le firmware NODEMCU livré sorti “usine” est remplacé lors du premier flashage par l’IDE ARDUINO.

En faite j’ai du mal m’exprimer, j’utilise le module Amica basé sous ESP8266 ESP-12E pour être précis que j’ai flashé via le programme “ESP8266Flasher” pour y mettre la dernière version “nodemcu_integer_0.9.6-dev_20150704”

lien : https://www.amazon.fr/gp/product/B010N1SPRK/ref=oh_aui_detailpage_o07_s00?ie=UTF8&psc=1

rjnc38:
il doit y avoir une petite incompréhension voir icipar contre je n’ai toujours pas compris :

  • qui est serveur qui est client qui est http://blabla.com
  • qui a une carte sd
  • s’il y a un arduino en plus de l’esp
    donc difficile d’aider …

Le client est une serveur web distant (idéalement plus tard j’aimerai qu’il soit dans un fichier d’une carte SD). Il y a uniquement l’esp sur mon projet pas d’arduino

Merci à tous en tout cas.

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code]. pas une quote

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

  // Start the server
  server.begin();
  Serial.println("Server started");

c'est qui server??

Bonjour

Le client est une serveur web distant

mélanger les rôles......jusqu'au code n'arrange rien !

Tu veux mettre au point un client qui récupère des données sur sur serveur distant.
(-> étudies des exemples de clients HTTP comme WiFiclient qui récupère des données sur un serveur HTTP du constructeur Sparkfun, fait fonctionner ces exemples puis fait les évoluer pour les adapter à l'usage voulu)

Tu veux utiliser une carte à base d'ESP8266 sans carte Arduino. OK !

Pour cela tu veux utiliser l'IDE Arduino équipé des outils pour ESP8266. OK

Dès que ton code compilera sans erreur et que tu l'enverra sur ta carte AMICA le firwmare précédent, quelqu'il soit, sera écrasé. Oublions donc le firmware NodeMcu destiné à un tout autre usage (exécution de code en langage LUA).

Si tu tiens à garder ce firmware oublies l'IDE Arduino et mets en place les outils permettant d'éditer du code dans une variante de langage Lua et de le mettre en place dans ton module à ESP8266.

Salut

je ferai un truc du genre suivant (en faisant TRES ATTENTION à ne pas utiliser la classe String)

je n’ai absolument pas testé ce code, tapé à la va vite sur la base du code http client et de ce que vous aviez - donc relisez et vérifiez

en gros, dans la loop()

0/ j’ai un compteur de temps pour ne faire la requête que toutes les 5 secondes
1/ je tente de me connecter
2/ je construis la requête par petit bout en l’envoyant au fur et à mesure
3/ j’ai un compteur de timeout de 10 secondes et je lis toutes les lignes qui reviennent
4/ Chaque fois que j’ai une ligne complète, je regarde si “” est dedans
5/ Si oui je trouve où commence le nombre après “” et je le décode
6/ Si on a trouvé le nombre alors on peut faire une action et ignorer le reste de la réponse
7/ On termine le client si le timeout arrive ou que l’on a lu notre valeur

puis on loop

#include <ESP8266WiFi.h>

const char* ssid = "monreseaussid";
const char* password = "MDP";

const byte ledPin = 13; // GPIO13

const char* host = "blabla.com";
const int httpPort = 80;

#define MAXBUFF 30    // prévoir assez long pour recevoir une ligne de réponse de ce qui vous interesse
char ligne[MAXBUFF + 1];
byte posLigne;

const char magicString[] = "<b>";
int magicValue;

boolean analyserLigne()
{
  // on regarde si on trouve la séquence magique <b>XXX</b> et on extrait l'entier XXX
  boolean valeurTrouve = false;

  if (strlen(ligne)) {
    if (strstr(ligne, magicString)) {
      magicValue = atol(strstr(ligne, magicString) + strlen(magicString)) ;
      valeurTrouve = true;
    }
  }

  posLigne = 0; ligne[0] = '\0';
  return valeurTrouve;
}

boolean lireUnLigne(WiFiClient & client)
{
  boolean finDeLigne = false;
  int c = client.read();

  if (c != -1) { // read a fonctoinné correctement
    if (c != '\r') // just ignore
      if (c == '\n') {
        finDeLigne = true;
      } else {
        ligne[posLigne++] = (char) c;
        ligne[posLigne] = '\0';
        if (posLigne >= MAXBUFF) posLigne = MAXBUFF - 1; // les trop longues lignes on écrase sur la fin
      }
  }
  return finDeLigne;
}


void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

  // ESP8266 = WiFi-client
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }

  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void loop()
{
  WiFiClient client;
  static unsigned long startTime = 0;

  if (millis() - startTime >= 5000ul) { // on interroge le serveur toutes les 5 secondes
    if (!client.connect(host, httpPort)) {
      Serial.println(F("erreur - connection impossible"));
    } else {
      // On envoie la requête au serveur
      client.println(F("GET http://rayn-concept.com/index.php HTTP/1.1"));
      client.print(F("Host: "));  client.println(host);
      client.println("User-Agent: ArduinoESP/1.1"); // parfois nécessaire de mettre un user agent pour certains serveurs
      client.println(F("Connection: close"));
      client.println(); // une ligne vide marque la fin de la requête HTTP

      // on attend la réponse du serveur au max 10 secondes
      unsigned long timeout = millis();

      posLigne = 0; ligne[0] = '\0'; // on construit une ligne puis on l'analyse
      while (true) { // on attend d'avoir lu la réponse qui nous interesse ou le timeout
        if (client.available()) {
          if (lireUnLigne(client)) { // retourne vrai quand une ligne entière est lue
            if (analyserLigne()) {

              // ------------------------------
              // FAIRE ICI VOTRE ACTION
              // -------------------------------

              Serial.print(F("J'ai lu la valeur: "));
              Serial.println(magicValue);


              // -------------------------------

              client.flush(); // on ignore le reste de la réponse
              break; // on sort du while (true)
            }
          }
        }
        if (millis() - timeout > 10000ul) {
          Serial.println(F("erreur - Timeout !"));
          break; // on sort du while (true)
        }
      }
      client.stop();
    }
    startTime = millis();
  }
}

ça devrait vous donner des idées

J-M-L:
Salut

je ferai un truc du genre suivant (en faisant TRES ATTENTION à ne pas utiliser la classe String)

je n’ai absolument pas testé ce code, tapé à la va vite sur la base du code http client et de ce que vous aviez - donc relisez et vérifiez

en gros, dans la loop()

0/ j’ai un compteur de temps pour ne faire la requête que toutes les 5 secondes
1/ je tente de me connecter
2/ je construis la requête par petit bout en l’envoyant au fur et à mesure
3/ j’ai un compteur de timeout de 10 secondes et je lis toutes les lignes qui reviennent
4/ Chaque fois que j’ai une ligne complète, je regarde si “” est dedans
5/ Si oui je trouve où commence le nombre après “” et je le décode
6/ Si on a trouvé le nombre alors on peut faire une action et ignorer le reste de la réponse
7/ On termine le client si le timeout arrive ou que l’on a lu notre valeur

puis on loop

#include <ESP8266WiFi.h>

const char* ssid = “monreseaussid”;
const char* password = “MDP”;

const byte ledPin = 13; // GPIO13

const char* host = “blabla.com”;
const int httpPort = 80;

#define MAXBUFF 30    // prévoir assez long pour recevoir une ligne de réponse de ce qui vous interesse
char ligne[MAXBUFF + 1];
byte posLigne;

const char magicString = “”;
int magicValue;

boolean analyserLigne()
{
  // on regarde si on trouve la séquence magique XXX et on extrait l’entier XXX
  boolean valeurTrouve = false;

if (strlen(ligne)) {
    if (strstr(ligne, magicString)) {
      magicValue = atol(strstr(ligne, magicString) + strlen(magicString)) ;
      valeurTrouve = true;
    }
  }

posLigne = 0; ligne[0] = ‘\0’;
  return valeurTrouve;
}

boolean lireUnLigne(WiFiClient & client)
{
  boolean finDeLigne = false;
  int c = client.read();

if (c != -1) { // read a fonctoinné correctement
    if (c != ‘\r’) // just ignore
      if (c == ‘\n’) {
        finDeLigne = true;
      } else {
        ligne[posLigne++] = (char) c;
        ligne[posLigne] = ‘\0’;
        if (posLigne >= MAXBUFF) posLigne = MAXBUFF - 1; // les trop longues lignes on écrase sur la fin
      }
  }
  return finDeLigne;
}

void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);

// ESP8266 = WiFi-client
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }

Serial.println();
  Serial.println(“WiFi connected”);
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop()
{
  WiFiClient client;
  static unsigned long startTime = 0;

if (millis() - startTime >= 5000ul) { // on interroge le serveur toutes les 5 secondes
    if (!client.connect(host, httpPort)) {
      Serial.println(F(“erreur - connection failed”));
    } else {
      // On envoie la requête au serveur
      client.println(F(“GET http://rayn-concept.com/index.php HTTP/1.1”));
      client.print(F("Host: "));  client.println(host);
      client.println(F(“Connection: close”));
      client.println(); // une ligne vide marque la fin de la requête HTTP

// on attend la réponse du serveur au max 10 secondes
      unsigned long timeout = millis();

posLigne = 0; ligne[0] = ‘\0’; // on construit une ligne puis on l’analyse
      while (true) { // on attend d’avoir lu la réponse qui nous interesse ou le timeout
        if (client.available()) {
          if (lireUnLigne(client)) { // retourne vrai quand une ligne entière est lue
            if (analyserLigne()) {

// ------------------------------
              // FAIRE ICI VOTRE ACTION
              // -------------------------------

Serial.print(F("J’ai lu la valeur: "));
              Serial.println(magicValue);

// -------------------------------

client.flush(); // on ignore le reste de la réponse
              break; // on sort du while (true)
            }
          }
        }
        if (millis() - timeout > 10000ul) {
          Serial.println(F(“erreur - Timeout !”));
          break; // on sort du while (true)
        }
      }
      client.stop();
    }
    startTime = millis();
  }
}




ça devrait vous donner des idées

C’est super, merci beaucoup ! Grâce à toi j’ai pu faire fonctionner le programme !

Cependant j’aurai une dernière question à te poser, en faite la page me retourne ceci (via le monitor serie) :

{“position”:635,“zoom”:“3522631”}

En gros ce qui m’intéresse c’est la valeur “position”. En l’occurrence là c’est 635 et je voudrais pouvoir récupérer uniquement 635 pour pouvoir ensuite l’interpréter. Alors j’ai pas mal chercher il ce trouve qu’il y a une libraire “TextFinder” mais je n’ai pas l’impression que je puisse l’adapter…

En tout cas merci beaucoup

Laissez tombez textfinder et tout ce qui pourrait se rapporter à des Strings

Faites votre partie du job... comprenez dans le détail ce que fais le code proposé.

Regardez comment mon code fonctionne (enfin devrait fonctionner, ravi d'apprendre que ça marche)... il analyse ligne par ligne la réponse et cherche une phrase clé magique (magicString) dans la ligne et s'il le trouve va extraire un entier qui est juste après cette chaîne. Donc si vous mettiez en phrase clé position": (attention à mettre un \ avant le guillemet) Ben ça va fonctionner...

J-M-L:
Laissez tombez textfinder et tout ce qui pourrait se rapporter à des Strings

Faites votre partie du job… comprenez dans le détail ce que fais le code proposé.

Regardez comment mon code fonctionne (enfin devrait fonctionner, ravi d’apprendre que ça marche)… il analyse ligne par ligne la réponse et cherche une phrase clé magique (magicString) dans la ligne et s’il le trouve va extraire un entier qui est juste après cette chaîne. Donc si vous mettiez en phrase clé position": (attention à mettre un \ avant le guillemet) Ben ça va fonctionner…

Bonjour,

j’ai vraiment beaucoup de mal à comprendre ton morceau de code et la documentation concernant ses fonctions là est très limitée sur le web (en tout cas il faut trouver les bons mots clefs pour rechercher).

Voilà mon morceau de code test :

#define MAXBUFF 30    // prévoir assez long pour recevoir une ligne de réponse de ce qui vous interesse
char ligne[MAXBUFF + 1];
byte posLigne;



const char* password = "{position: 635,zoom: 522631}"; 

const char magicString[] = "{position: ";
int magicValue;

boolean analyserLigne()
{
  // on regarde si on trouve la séquence magique <b>XXX</b> et on extrait l'entier XXX
  boolean valeurTrouve = false;

  if (strlen(ligne)) {
    if (strstr(ligne, magicString)) {
      magicValue = atol(strstr(ligne, magicString) + strlen(magicString)) ;
      valeurTrouve = true;
    }
  }

  posLigne = 0; ligne[0] = '\0';
  return valeurTrouve;
}

boolean lireUnLigne(password)
{
  boolean finDeLigne = false;
  int c = client.read();

  if (c != -1) { // read a fonctoinné correctement
    if (c != '\r') // just ignore
      if (c == '\n') {
        finDeLigne = true;
      } else {
        ligne[posLigne++] = (char) c;
        ligne[posLigne] = '\0';
        if (posLigne >= MAXBUFF) posLigne = MAXBUFF - 1; // les trop longues lignes on écrase sur la fin
      }
  }
  return finDeLigne;
}




void setup() {

}

void loop() {



posLigne = 0; ligne[0] = '\0'; // on construit une ligne puis on l'analyse
          if (lireUnLigne(password)) { // retourne vrai quand une ligne entière est lue
            if (analyserLigne()) {

              Serial.print(F("J'ai lu la valeur: "));
              Serial.println(magicValue);
delay(5000);

              // -------------------------------


}

Dans mon exemple je vais programmer sur un Arduino Uno classique pour éviter d’attendre sur l’upload du code.
Du coup à la place d’avoir la valeur du “client”, j’ai voulu mettre une valeur dans une variable "const char* password = “{position: 635,zoom: 522631}”; "

Le problème est à la ligne suivante : “boolean lireUnLigne(password)” qui ne fonctionne pas. Je ne sais pas comment formuler ça du coup.
Là même chose pour la ligne: int c = “client.read();” si je remplace client par password cela ne fonctionne pas non plus.

deja, avant toute chose, faut deja un peu d’experience en php…

faire un

<?php

echo '<b>635</b>';
?>

tu peux faire, mais je te conseile quand meme autre chose:

je ne sais pas ou est ton site php, par example http://localhost/page.php

si veux faire passer une variable par php, il y a deux methode, mais on va utiliser la methode GET

soit : http://localhost/page.php?var=635

il faut deja faire passer ta variable dans l’adresse, soit créer un formulaire d’envoi sur ta page, ou generer automatiquement un variable qui cherche le nom de ta variable…

var=$_GET[‘var’]; // qui va scruter ton adresse …
ensuite echo $var;

Ensuite tu as toutes les infos ici

https://nodemcu.readthedocs.io/en/master/en/modules/http/

ou tu utilises http.request() ou http.get() pour recuperer la valeur de ta variable