IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Envoi d'un string entre deux ESP32


Sujet :

Arduino

  1. #1
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut Envoi d'un string entre deux ESP32
    Bonjour,
    Je tente d'envoyer une chaine de caractères d'un ESP32 vers un autre ESP32 et ceci via WiFi.
    Le premier est le serveur et est le point d'accès.
    Le second est le client et régulièrement, tente de détecter le serveur.
    Quand il est à sa portée, il le détecte bien, et c'est à ce moment là queje souhaite que le client envoie ce string, que le serveur le capte et l'envoie dans le moniteur série.
    Tout semble ok, sauf que le message n'est pas reçu

    Voici les deux codes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    // Côté serveur (Access point)
     
    #include <WiFi.h>
    #include <ESPAsyncWebServer.h>
     
    const char* ssid     = "DELTA";
    const char* password = "";
    String PostData;
     
    IPAddress local_IP(192,168,4,1);
    IPAddress gateway(192,168,1,1);
    IPAddress subnet(255,255,255,0);
     
    AsyncWebServer server(80);
     
    void setup() {
      Serial.begin(9600);
      delay(1000);
     
      Serial.print("Setting AP (Access Point)…");
     
      WiFi.softAP(ssid, password);
      IPAddress local_IP = WiFi.softAPIP();
      Serial.print("AP IP address: ");
      Serial.println(local_IP);
    }
     
    void loop(){
     
      server.on("/post", HTTP_POST, [](AsyncWebServerRequest *request) {
        request->send(200, "text/plain", PostData);
      });
      server.begin();
    delay(2000);
    Serial.print(PostData); // pas de réponse???
     
    delay(5000);
     
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #include <strings.h>
    #include <WiFi.h>
    #include <WiFiClient.h>
    #include <HTTPClient.h>
    #include <WebServer.h>
    #include <Arduino.h>
     
    int cycle;
     
    char ssid[] = "DELTA";
     
    const char* hostURL = "http://192.168.4.1/";
    char password[] = "";
     
    int status = WL_IDLE_STATUS;
    IPAddress server (192,168,4,1);
     
    WiFiClient client;
     
    String PostData = "someDataToPost";
     
    void setup()
    {  
      Serial.begin(9600);
      delay(1000); 
    }
     
    void loop()
    { 
     
    Serial.println("Connecting to DELTA...");
    WiFi.begin(ssid, password);
    cycle=0;
     while ((WiFi.status() != WL_CONNECTED) and (cycle<15)) {
      delay(500);
      Serial.print("#");
      cycle = cycle +1;
      Serial.println("cycle: "+String(cycle));
      }
      Serial.println();
      Serial.print("Connected, IP address: ");
      Serial.println(WiFi.localIP());
     
      if ((WiFi.status() == WL_CONNECTED)) {
      Serial.println("connected");
      HTTPClient http;
    http.begin(hostURL);
    if (client.connect(server, 80))
    {
      Serial.println("client connected");
      client.println("POST /PostData HTTP/1.1");
      client.println("Host: DELTA");
      client.println("User-Agent: Arduino/1.0");
      client.println("Connection: close");
      client.print("Content-Length: ");
      client.println(PostData.length());
      client.println();
      client.println(PostData);
      Serial.println("correctly send");
      }else Serial.println("For POST, client not connected");
     
      if (client.connected()) {
        client.stop();
        WiFi.disconnect(); }
      }
     
      delay(1000);            
    }
    Je reçois bien "correctly send" donc passe bien dans la boucle.

    Déjà 1000 mercis pour tout vos conseils
    PhiLu

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    c'est toujours la même discussion que https://www.developpez.net/forums/d2...-ligne-client/ ??

    la réponse que vous bâtissez n'est pas un POST ==> https://www.w3schools.com/tags/ref_httpmethods.asp

  3. #3
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Salut Jay M,
    Oui, je trouve des exemples tous différents et beaucoup de théorie.
    Dans ton lien on parle de PHP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    POST /test/demo_form.php HTTP/1.1
    Je souhaite transmettre un string.
    Faut-il que ce string soit contenu dans un .txt?
    Désolé, mais je code beaucoup dans d'autres domaines,
    et pour Arduino, tu m'a bien aidé pour le:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HTTPClient http;
    http.begin(hostURL);
    if (http.GET() > 0){GetString=(http.getString());
    ( la donnée était alors publiée sur la page web)
    ... mais là, je trouve de tout, je teste des tas versions sur base d'exemples péchés sur le web, mais rien à faire...
    ... je ne sais même pas si c'est sur le serveur ou sur le client que ça m...
    Je vais continuer de chercher, encore merci.
    Très bonne soirée
    Bien à toi,
    PhilLu

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Je ne comprends pas pourquoi vous avez ouvert un nouveau post pour le même sujet.

    Dans l’autre discussion on a fait un envoi par GET

    Si vous voulez faire un envoi par POST (quel intérêt y voyez vous?) il suffit d’adapter le code du serveur pour écouter les POST et sur le client faire un appel à POST au lieu de GET.

    on peut aussi se passer de HTPP et envoyer des données directement par socket sur TCP-IP

  5. #5
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Bon, je fais suite à votre message privé (Merci de ne pas m'en envoyer, quand je contribue je souhaite que ça profite à tous et qu'éventuellement d'autres puissent aussi apporter leur regard et détecter des erreurs)

    Le cahier des charges:

    • deux ESP32.
    • Le premier est en AP et est fixe.
    • L'autre est mobile et sur batterie.
    • Ce dernier chaque 3 minutes se réveille et vérifie s'il est à proximité de l'AP.
    • Il faudrait que l'ESP32 envoie alors la donnée qu'il contient à l'AP, et que l'AP l'envoie sur le port série.
    • La donnée est une chaine de caractères.




    Le code Serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include <WiFi.h>
    #include <AsyncTCP.h>
    #include <ESPAsyncWebServer.h>
    AsyncWebServer server(80);
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
     
    void erreur404(AsyncWebServerRequest *request) {
      request->send(404, "text/plain", "Not found");
    }
     
    void setup() {
      Serial.begin(115200);
      Serial.print("\n\nConfiguration réseau...");
      if (!WiFi.softAP(ssid)) {
        Serial.println("Erreur de configuration SOFT AP");
        while (true) yield();
      }
      Serial.print("OK.\nIP du point d'accès = "); Serial.println(WiFi.softAPIP());
     
      server.onNotFound(erreur404);
     
      // call back d'un GET sur /
      server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
        if (request->hasParam(dataString)) {
          Serial.print("REQUETE GET OK. DATA: ");
          Serial.println(request->getParam(dataString)->value());
          request->send(200, "text/plain", "REQUETE GET AVEC DATA");
        } else {
          Serial.println("REQUETE GET SANS DATA: ");
          request->send(200, "text/plain", "REQUETE GET SANS DATA");
        }
      });
     
      // call back d'un POST sur /
      server.on("/", HTTP_POST, [](AsyncWebServerRequest * request) {
        if (request->hasParam(dataString, true)) {
          Serial.print("REQUETE POST OK. Message: ");
          Serial.println(request->getParam(dataString, true)->value());
        } else {
          Serial.println("REQUETE POST SANS DATA");
        }
        request->send(200);
      });
     
      server.begin();
      Serial.println("Je suis prêt. attente d'une requête GET ou POST");
    }
     
    void loop() {}


    le code client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    #include <WiFi.h>
    #include <HTTPClient.h>
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
     
    const size_t tailleMaxReq = 200;
    char requete[tailleMaxReq + 1];
     
    const uint32_t tempsDeSommeil = 5000000ul;  // temps en µs ici 5s pour le test
     
    void repos() {
      WiFi.disconnect();
      esp_sleep_enable_timer_wakeup(tempsDeSommeil);
      Serial.println("\n-----------\nA bientôt");  Serial.flush();
      esp_deep_sleep_start();
    }
     
    bool detectionReseau(const char* target) {
      uint8_t n = WiFi.scanNetworks();
      if (n != 0)
        for (int i = 0; i < n; ++i)
          if (strcmp(target, WiFi.SSID(i).c_str()) == 0) return true;
      return false;
    }
     
    void setup() {
      Serial.begin(115200); delay(500);
      Serial.println();
     
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();                          // oublie l'ancien réseau
     
      if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_TIMER) Serial.println("Réveillé par le timer.");
     
      if (detectionReseau(ssid)) {                // si on a trouvé le réseau cherché
        WiFi.begin(ssid);                         // on va s'y connecter (ici pas de mot de passe)
     
        byte n = 0;
        while (WiFi.status() != WL_CONNECTED) {   // on attend au max 5 secondes (10x 500ms) la connexion
          delay(500);
          if (n++ >= 10) break;
        }
     
        if ((WiFi.status() == WL_CONNECTED)) {    // Si on est connecté alors on envoie une requête GET puis une POST
          HTTPClient http;
          IPAddress gateway = WiFi.gatewayIP();
     
          // on bâtit l'URI pour le serveur sous la forme "http://192.168.4.1/"
          char serveurURL[40] = "http://";
          strncat(serveurURL, gateway.toString().c_str(), 40); // on ajoute l'adresse IP
          strncat(serveurURL, "/", 40);                        // et le '/' de fin
     
          // ENVOI D'UNE REQUETE SOUS FORME DE GET
          Serial.println("-----------");
          snprintf(requete, tailleMaxReq, "%s?%s=%lu", serveurURL , dataString, millis() ); // le payload c'est la valeur de millis()
          Serial.print("Envoi Requête GET : "); Serial.println(requete);
          http.begin(requete);
          if (http.GET() > 0) { // le code de retour de la requête GET
            Serial.print("Réponse du serveur : "); Serial.println(http.getString()); // ==> vous devriez voir ici la réponse à la requête
          } else {
            Serial.println("Erreur requête HTTP");
          }
          http.end();
     
          // ENVOI D'UNE REQUETE SOUS FORME DE POST
          Serial.println("-----------");
          WiFiClient client;
          http.begin(client, serveurURL);
          http.addHeader("Content-Type", "application/x-www-form-urlencoded");
          snprintf(requete, tailleMaxReq, "%s=millis vaut %lu", dataString, millis() ); // le payload c'est un texte "millis vaut xxxx"
          Serial.print("Requête POST : "); Serial.println(requete);
          int httpResponseCode = http.POST(requete);
          Serial.print("Code réponse HTTP POST : ");  Serial.println(httpResponseCode);
          http.end();
        } else {
          Serial.print("Impossible de rejoindre le réseau WiFi : "); Serial.println(ssid);
        }
      } else {
        Serial.print(ssid); Serial.println(" non détecté.");
      }
      repos();
    }
     
    void loop() {}
    Lorsque le client se réveille, il vérifie si le réseau portant le nom "AP-ESP32" est visible. Si oui, il essaye de s'y connecter.
    Si la connexion est réussie alors le client envoie 2 requêtes. une en GET et une en POST

    la requête GET est sous la forme http://192.168.4.1/?payload=5356 où le nombre passé c'est la valeur de millis(). Notez que si vous voulez passer un texte complet avec des espaces il faudrait l'encoder.

    Donc on pourrait préférer le POST qui envoie une requête sur http://192.168.4.1/ et on encode pour le payload millis vaut 5383 et là on peut passer une chaîne de caractère.

    Si vous ouvrez deux terminaux séparés à 115200 bauds, un pour chaque ESP, vous devriez pouvoir voir des infos de debug.

    ça devrait vous mettre le pied à l'étrier.

  6. #6
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Salut Jay M,
    Merci 1000x pour ta réponse rapide et immédiatement opérationnelle
    A vrai dire j'ai essayé tellement d'exemples trouvés sur le net qui ont toujours buggés
    ... que j'ai cru ne jamais m'en sortir...
    J'intègre ça dans ma solution et te renvoie le résultat final.
    Encore merci,
    C'est top top top
    Bien à toi,
    Phil58

  7. #7
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Salut Jay M,
    Tout est ok et intégré dans ma solution.
    Il me reste un problème.
    J'ai modifié le code pour envoyer seulement une chaine de caractères.
    Tout ok sauf que, au delà de 9 caractère, la chaine n'est pas transmise (ou pas reçue)
    Je planche là dessus...

    Encore merci,
    et bonne soirée
    PhilLu

  8. #8
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    Citation Envoyé par PhilLU Voir le message
    Salut Jay M,
    J'ai modifié le code pour envoyer seulement une chaine de caractères.
    Tout ok sauf que, au delà de 9 caractère, la chaine n'est pas transmise (ou pas reçue)
    Postez le code. Peut être un buffer trop petit?

  9. #9
    Membre habitué
    Homme Profil pro
    Owner
    Inscrit en
    Décembre 2004
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Owner
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2004
    Messages : 466
    Points : 137
    Points
    137
    Par défaut
    Saluy Jay M,
    Voici les codes.
    J'utilise des esp32 TTGO avec 4M de sram.

    Ici j'utilise le POST:
    (J'ai modifier cette ligne pour ne recevoir qu'un string (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...String texte_a_envoyer = "blablablablabla";...
    const size_t tailleMaxReq = 4000;// au départ à 200
    ... snprintf(requete, tailleMaxReq, "%s=%s", dataString,texte_a_envoyer );
    Voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <WiFi.h>
    #include <HTTPClient.h>
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
    String texte_a_envoyer = "blablablablabla"; 
    const size_t tailleMaxReq = 4000;// au départ à 200
    char requete[tailleMaxReq + 1];
     
    const uint32_t tempsDeSommeil = 5000000ul;  // temps en µs ici 5s pour le test
     
    void repos() {
      WiFi.disconnect();
      esp_sleep_enable_timer_wakeup(tempsDeSommeil);
    ///  Serial.println("\n-----------\nA bientôt");  Serial.flush();
      esp_deep_sleep_start();
    }
     
    bool detectionReseau(const char* target) {
      uint8_t n = WiFi.scanNetworks();
      if (n != 0)
        for (int i = 0; i < n; ++i)
          if (strcmp(target, WiFi.SSID(i).c_str()) == 0) return true;
      return false;
    }
     
    void setup() {
      Serial.begin(115200); delay(500);
    ///  Serial.println();
     
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();                          // oublie l'ancien réseau
     
      if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_TIMER) //Serial.println("Réveillé par le timer.");
     
      if (detectionReseau(ssid)) {                // si on a trouvé le réseau cherché
        WiFi.begin(ssid);                         // on va s'y connecter (ici pas de mot de passe)
     
        byte n = 0;
        while (WiFi.status() != WL_CONNECTED) {   // on attend au max 5 secondes (10x 500ms) la connexion
          delay(500);
          if (n++ >= 10) break;
        }
     
        if ((WiFi.status() == WL_CONNECTED)) {    // Si on est connecté alors on envoie une requête GET puis une POST
          HTTPClient http;
          IPAddress gateway = WiFi.gatewayIP();
     
          // on bâtit l'URI pour le serveur sous la forme "http://192.168.4.1/"
          char serveurURL[40] = "http://";
          strncat(serveurURL, gateway.toString().c_str(), 40); // on ajoute l'adresse IP
          strncat(serveurURL, "/", 40);                        // et le '/' de fin
     /*
          // ENVOI D'UNE REQUETE SOUS FORME DE GET
          Serial.println("-----------");
          snprintf(requete, tailleMaxReq, "%s?%s=%lu", serveurURL , dataString, millis() ); // le payload c'est la valeur de millis()
          Serial.print("Envoi Requête GET : "); Serial.println(requete);
          http.begin(requete);
          if (http.GET() > 0) { // le code de retour de la requête GET
            Serial.print("Réponse du serveur : "); Serial.println(http.getString()); // ==> vous devriez voir ici la réponse à la requête
          } else {
            Serial.println("Erreur requête HTTP");
          }
          http.end();
     */
          // ENVOI D'UNE REQUETE SOUS FORME DE POST
       ///   Serial.println("-----------");
          WiFiClient client;
          http.begin(client, serveurURL);
          http.addHeader("Content-Type", "application/x-www-form-urlencoded");
          snprintf(requete, tailleMaxReq, "%s=%s", dataString,texte_a_envoyer ); // le payload c'est un texte "millis vaut xxxx"
      ///    Serial.print("Requête POST : "); 
      ///Serial.println(requete);
          int httpResponseCode = http.POST(requete);
          Serial.print("Code réponse HTTP POST : ");  
     Serial.println(httpResponseCode);
          http.end();
        } else {
     ///     Serial.print("Impossible de rejoindre le réseau WiFi : "); Serial.println(ssid);
        }
      } else {
    ///    Serial.print(ssid); Serial.println(" non détecté.");
      }
      repos();
    }
     
    void loop() {}
    et l'autre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #include <WiFi.h>
    #include <AsyncTCP.h>
    #include <ESPAsyncWebServer.h>
    AsyncWebServer server(80);
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
     
    void erreur404(AsyncWebServerRequest *request) {
      request->send(404, "text/plain", "Not found");
    }
     
    void setup() {
      Serial.begin(115200);
      Serial.print("\n\nConfiguration réseau...");
      if (!WiFi.softAP(ssid)) {
        Serial.println("Erreur de configuration SOFT AP");
        while (true) yield();
      }
      Serial.print("OK.\nIP du point d'accès = "); Serial.println(WiFi.softAPIP());
     
      server.onNotFound(erreur404);
     /*
      // call back d'un GET sur /
      server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
        if (request->hasParam(dataString)) {
          Serial.print("REQUETE GET OK. DATA: ");
          Serial.println(request->getParam(dataString)->value());
          request->send(200, "text/plain", "REQUETE GET AVEC DATA");
        } else {
          Serial.println("REQUETE GET SANS DATA: ");
          request->send(200, "text/plain", "REQUETE GET SANS DATA");
        }
      });
     */
      // call back d'un POST sur /
      server.on("/", HTTP_POST, [](AsyncWebServerRequest * request) {
        if (request->hasParam(dataString, true)) {
          Serial.print("REQUETE POST OK. Message: ");
          Serial.println(request->getParam(dataString, true)->value());
        } else {
          Serial.println("REQUETE POST SANS DATA");
        }
        request->send(200);
      });
     
      server.begin();
      Serial.println("Je suis prêt. attente d'une requête GET ou POST");
    }
     
    void loop() {}
    blabla passe bien, mais dès que je dépasse 9 caractères je reçois dans la trace:
    €¤û?.

    Ce qui est étrange...

    Merci pour ton aide
    PhilLU

  10. #10
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 711
    Points : 5 390
    Points
    5 390
    Par défaut
    ceci ne devrait même pas compiler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snprintf(requete, tailleMaxReq, "%s=%s", dataString, texte_a_envoyer );
    parce-que texte_a_envoyer est une instance de la classe String et que snprintf() attend une cString...

    de plus cette mise en commentaire a modifié la structure du code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (esp_sleep_get_wakeup_cause() == ESP_SLEEP_WAKEUP_TIMER) //Serial.println("Réveillé par le timer.");
    car le ; est maintenant en commentaire...

    ne mettez pas 4000 octets pour le message.... 200 c'était déjà pas mal

    essayez un truc comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <WiFi.h>
    #include <HTTPClient.h>
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
    const char* texte_a_envoyer = "blablablablabla ceci est le payload";
    const size_t tailleMaxReq = 200;// au départ à 200
    char requete[tailleMaxReq + 1];
     
    const uint32_t tempsDeSommeil = 5000000ul;  // temps en µs ici 5s pour le test
     
    void repos() {
      WiFi.disconnect();
      esp_sleep_enable_timer_wakeup(tempsDeSommeil);
      esp_deep_sleep_start();
    }
     
    bool detectionReseau(const char* target) {
      uint8_t n = WiFi.scanNetworks();
      if (n != 0)
        for (int i = 0; i < n; ++i)
          if (strcmp(target, WiFi.SSID(i).c_str()) == 0) return true;
      return false;
    }
     
    void setup() {
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();                          // oublie l'ancien réseau
     
      if (detectionReseau(ssid)) {                // si on a trouvé le réseau cherché
        WiFi.begin(ssid);                         // on va s'y connecter (ici pas de mot de passe)
     
        byte n = 0;
        while (WiFi.status() != WL_CONNECTED) {   // on attend au max 5 secondes (10x 500ms) la connexion
          delay(500); if (n++ >= 10) break;
        }
     
        if ((WiFi.status() == WL_CONNECTED)) {    // Si on est connecté alors on envoie une requête GET puis une POST
          HTTPClient http;
          WiFiClient client;
          IPAddress gateway = WiFi.gatewayIP();
     
          // on bâtit l'URI pour le serveur sous la forme "http://192.168.4.1/"
          char serveurURL[40] = "http://";
          strncat(serveurURL, gateway.toString().c_str(), 40); // on ajoute l'adresse IP
          strncat(serveurURL, "/", 40);                        // et le '/' de fin
     
          http.begin(client, serveurURL);
          http.addHeader("Content-Type", "application/x-www-form-urlencoded");
          snprintf(requete, tailleMaxReq, "%s=%s", dataString, texte_a_envoyer ); // le payload c'est un texte "millis vaut xxxx"
          http.POST(requete);
          http.end();
        }
      }
      repos();
    }
     
    void loop() {}
    et si vous voulez vraiment utiliser une String pour le payload alors il faut passer sa représentation en cString avec la fonction c_str()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    #include <WiFi.h>
    #include <HTTPClient.h>
     
    const char *ssid = "AP-ESP32";          // le nom du réseau
    const char* dataString = "payload";     // le nom du paramêtre pour la requête GET ou dans le POST (format formulaire)
    String texte_a_envoyer = "blablablablabla ceci est le payload";
    const size_t tailleMaxReq = 200;// au départ à 200
    char requete[tailleMaxReq + 1];
     
    const uint32_t tempsDeSommeil = 5000000ul;  // temps en µs ici 5s pour le test
     
    void repos() {
      WiFi.disconnect();
      esp_sleep_enable_timer_wakeup(tempsDeSommeil);
      esp_deep_sleep_start();
    }
     
    bool detectionReseau(const char* target) {
      uint8_t n = WiFi.scanNetworks();
      if (n != 0)
        for (int i = 0; i < n; ++i)
          if (strcmp(target, WiFi.SSID(i).c_str()) == 0) return true;
      return false;
    }
     
    void setup() {
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();                          // oublie l'ancien réseau
     
      if (detectionReseau(ssid)) {                // si on a trouvé le réseau cherché
        WiFi.begin(ssid);                         // on va s'y connecter (ici pas de mot de passe)
     
        byte n = 0;
        while (WiFi.status() != WL_CONNECTED) {   // on attend au max 5 secondes (10x 500ms) la connexion
          delay(500); if (n++ >= 10) break;
        }
     
        if ((WiFi.status() == WL_CONNECTED)) {    // Si on est connecté alors on envoie une requête GET puis une POST
          HTTPClient http;
          WiFiClient client;
          IPAddress gateway = WiFi.gatewayIP();
     
          // on bâtit l'URI pour le serveur sous la forme "http://192.168.4.1/"
          char serveurURL[40] = "http://";
          strncat(serveurURL, gateway.toString().c_str(), 40); // on ajoute l'adresse IP
          strncat(serveurURL, "/", 40);                        // et le '/' de fin
     
          http.begin(client, serveurURL);
          http.addHeader("Content-Type", "application/x-www-form-urlencoded");
          snprintf(requete, tailleMaxReq, "%s=%s", dataString, texte_a_envoyer.c_str() ); // le payload c'est un texte "millis vaut xxxx"
          http.POST(requete);
          http.end();
        }
      }
      repos();
    }
     
    void loop() {}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Echange d'un string entre deux process (Windows vs Labview))
    Par Phoenix-3000 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/04/2013, 05h52
  2. Calcul du temps d'envoi d'un message entre deux téléphones
    Par rooma dans le forum Développement Mobile en Java
    Réponses: 1
    Dernier message: 04/11/2011, 10h48
  3. vérifier string entre deux champs
    Par bernards111 dans le forum Général Python
    Réponses: 2
    Dernier message: 03/10/2011, 12h37
  4. Chercher une string entre deux caractère délimiteur
    Par ovcrash dans le forum VBScript
    Réponses: 2
    Dernier message: 07/02/2010, 01h00
  5. [SAX] Comment récupérer un String entre deux balise xml?
    Par L4BiN dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 23/06/2006, 09h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo