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 de données depuis l'Arduino vers une page Web


Sujet :

Arduino

  1. #1
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut Envoi de données depuis l'Arduino vers une page Web
    Bonjour à tous.

    Je reviens vers vous car je bloque sur un projet.
    Mon projet ; enregistrer des données acquises par un Arduino dans une DB.

    hardware: Arduino MKR1000, serveur : Raspberry Pi4 model B serveur web NGINX

    J'ai donc diviser ce projet en plusieurs morceaux.
    1° Acquisition de données, OK (écriture sur carte SD et transfert en FTP vers un serveur)
    2° Affichage des donnée instantanée (toutes les 10 sec), pour cela:
    2 a : envoi des données vers un site (serveur) Web via la requête POST.
    2 b : Affichage des donnée sur une page web
    3° Ajout des données dans une DB.

    État du projet:
    Acquisition des donnée, OK
    Sauvegarde sous forme de fichiers OK
    Envoi vers un serveur de fichier via FTP PK (se fait toutes les heures)
    Connexion en WiFi vers le serveur WEB, en tant que client de l'Arduino,ok
    La requête HTTP GET me retourne bien la page index.php du site
    Envoi de la requête HTTP POST : coté Arduino, semble bien fonctionner pas de code d'erreur et je reçoit la page index.php
    Problème,les valeurs passée via la requête POST ne s'affiche pas sur la page index.php

    Je ne suis pas certain de la structure du code de la requête(j'ai trouvé divers codes sur internet)
    le code utilisé pour l'envoi de la requête est le suivant :
    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
     
        Serial.print("**********   Connection au Web server           ***********\n");
        int result = client.connect(server, 80);
        if (result == 1) {
          Serial.println("connected to server");
          // Make a HTTP request:
          client.println("POST http://tsttemp/index.php HTTP/1.1");
          client.println("Host: 192.168.1.8");
          client.println("Connection: close");
          client.println();
          client.println("User-Agent: Arduino/1.0");
          client.print("Content-Length: ");
          client.println(machaine.length());
          //client.println();
          client.println(machaine);
          client.println("Connection: close");
          client.println();
     
          Serial.println("\n\nSend OK  Maintenant je lis..... \n\n");
    la variable 'machaine' contient: "?temp=22.61&hum=51.19"
    j'obtient en retour:

    HTTP/1.1 200 OK
    Server: nginx/1.22.1
    Date: Mon, 11 Dec 2023 10:49:43 GMT
    Content-Type: text/html; charset=UTF-8
    Transfer-Encoding: chunked
    Connection: close

    87

    Bonjour !
    array(0) {
    }.................
    J'ai supprimer les balise html
    J'ai essayé diverses manière de faire la requête HTTP, mais rien n'y fait.

    Est ce mon code qui est mauvais ? ou la page index.php qui est mal écrite ?

    J'ai essayé d'envoyer une requete HTTP POST avec python, mais j'ai des retours d'erreurs énorme.... problème de version ???
    J'ai laissé tomber


    Pour info, mon code php:

    Code php : 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
     
    <?php
    $tt = $_POST['temp'];
    $rh = $_POST['hum'];
     
    echo 'Bonjour ' . htmlspecialchars($_POST["temp"]) . "!\r\n";
     
    var_dump($_POST);
    ?>
    <html>
    <body>
    <h1> Ceci est le site tsttemp3 </h1>
           <?php echo 'temp= '.$tt;?>
    	<br>
    	<?php echo 'rh =  '.$rh;?>
    	<br>
    <?php print_r($_POST); ?>
     
    </body>
     
    </html>

    Si quelqu'un voit où se trouve mon erreur, ou un tuto pour expliquer comment faire cette requête

    merci

    Michel

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 793
    Points : 5 615
    Points
    5 615
    Par défaut
    quel est le chemin vers votre serveur réellement? ceci ne semble pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.println("POST http://tsttemp/index.php HTTP/1.1");
    il faut aussi peut-être un Content-Type

    essayez avec
    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
     
    if (client.connect(server, 80)) {
      Serial.println(F("connection au serveur OK."));
      client.println(F("POST /tsttemp/index.php HTTP/1.1"));
      client.println(F("Host: 192.168.1.8"));
      client.println(F("Content-Type: application/x-www-form-urlencoded"));
      client.println(F("User-Agent: Arduino/1.0"));
      client.print(F("Content-Length: "));  client.println(machaine.length());
      client.println(F("Connection: close"));
      client.println(); // Ligne vide après les en-têtes 
      client.println(machaine);
      Serial.println(F("Envoi effectué."));
    } else {
        Serial.println(F("erreur de connection au serveur"));
    }

  3. #3
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    Bonjour Jay M

    Le chemin du serveur me semble correct car le serveur répond bien à cette adresse.
    J'ai plusieurs sites de test sur ce serveur et les requête HTTP GET me renvoient bien
    les pages index.php des différent sites avec la requête HTTP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      "POST http://<nom dusite> HTTP/1.1"
    J'ai rajouté la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.println(F("Content-Type: application/x-www-form-urlencoded"));
    Mais cela ne change rien au retour.
    J'ai aussi rajouté les lignes en fin de requête,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          client.println("Connection: close");
          client.println();
    Pour essai, mais rien n'y fait

    Je ne trouve pas mon erreur

    michel

  4. #4
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 795
    Points
    795
    Par défaut
    Bonjour,

    la variable 'machaine' contient: "?temp=22.61&hum=51.19"
    Avez vous essayé sans le point d'interrogation en début de chaîne ?

    Autrement, attention à respecter le format du protocole HTTP,
    dans votre bout de code l'entête Connection ne doit pas
    apparaître après le contenu du corps de la requête (body).
    https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST

    La version de Jay M semble correct, mais bon, la méthode est archaïque et mériterait une API.
    Cela n'est pas disponible en arduino ? Mes recherches semblent indiquer le contraire,
    un genre d'import HTTPClient.h à faire, mais je n'y connaît strictement rien.
    https://github.com/arduino-libraries/ArduinoHttpClient/blob/master/examples/SimplePost/SimplePost.ino#L49

    Bonne journée.

  5. #5
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    bonjour,

    En effet j'ai essayé avec et sans le '?', même résultats.

    J'ai consulté les sites en question, mais je n'en ai rien ressortis

    J'ai déjà essayé la bibliothèque <ArduinoHTTpClien>, mais l'appel à
    client.get() ou client.post() plante l'Arduino, je n"ai plus de retour sur le moniteur
    série..

    j'ai un retour avec un client.connect() de la bibliothèque <Wifi101.h> et la requête POST


    merci

    michel

  6. #6
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 795
    Points
    795
    Par défaut
    Bonjour,

    Comme je vois dans l'autre pst que vous en êtes à utiliser wireshark... je poste ça, au cas où, sait on jamais...

    pour la lib HTTPClient, aucune idée, je vous laisse juge.

    Pour le format de la requête, elle doit ressembler à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    POST / HTTP/1.1
    Host: fff.ff
    User-Agent: Go-http-client/1.1
    Content-Length: 3
    Content-Type: application/x-www-form-urlencoded
     
    a=b
    La version avec les caractères blanc lisible donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "POST / HTTP/1.1\r\nHost: fff.ff\r\nUser-Agent: Go-http-client/1.1\r\nContent-Length: 3\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\na=b"
    https://go.dev/play/p/qD_Yu8N15AQ

    Là vous faites des println, donc des LF et non des CRLF, ce n'est pas standard,
    mais j'ai dans l'idée que le serveur est permissif, par ailleurs il y a plein
    d'exemple en ce sens sur le net, normalement ça doit le faire.


    Finalement, on peut aussi monter un echo serveur rapidement, vous le testez avec nc au préalable.
    Comme votre code n'utilise pas un client HTTP normé, mais un genre de socket tcp,
    la lecture de la réponse vous donnera le contenu de l'envoi sans geindre.

    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
    package main
     
    import (
    	"io"
    	"net"
    )
     
    func main() {
     
    	addr, err := net.ResolveTCPAddr("tcp", net.JoinHostPort("", "9999"))
    	if err != nil {
    		panic(err)
    	}
    	s, err := net.ListenTCP("tcp", addr)
    	if err != nil {
    		panic(err)
    	}
     
    	for {
    		conn, err := s.Accept()
    		if err != nil {
    			panic(err)
    		}
    		(func() {
    			defer conn.Close()
    			io.Copy(conn, conn)
    		})()
     
    	}
     
    }
    On peut aussi rajouter de la validation de requête HTTP.

    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
    package main
     
    import (
    	"bufio"
    	"bytes"
    	"fmt"
    	"io"
    	"log"
    	"net"
    	"net/http"
    	"net/http/httputil"
    )
     
    func main() {
     
    	addr, err := net.ResolveTCPAddr("tcp", net.JoinHostPort("", "9999"))
    	if err != nil {
    		panic(err)
    	}
    	s, err := net.ListenTCP("tcp", addr)
    	if err != nil {
    		panic(err)
    	}
     
    	for {
    		conn, err := s.Accept()
    		if err != nil {
    			panic(err)
    		}
    		(func() {
    			defer conn.Close()
     
    			var raw bytes.Buffer
    			req, err := http.ReadRequest(bufio.NewReader(io.TeeReader(conn, &raw)))
     
    			fmt.Fprintln(conn)
    			fmt.Fprintln(conn, "RAW")
    			io.Copy(conn, &raw)
    			fmt.Fprintln(conn, "\nENDRAW")
    			if err != nil {
    				fmt.Fprintln(conn, "failed to parse the request", err)
    				log.Println("failed to parse the request", err)
    				return
    			}
     
    			fmt.Fprintln(conn)
    			fmt.Fprintln(conn, "DUMP")
    			defer fmt.Fprintln(conn, "\nENDDUMP")
    			d, err := httputil.DumpRequest(req, true)
    			if err != nil {
    				fmt.Fprintln(conn, "failed to dump the request", err)
    				log.Println("failed to dump the request", err)
    				return
    			}
     
    			_, err = io.Copy(conn, bytes.NewBuffer(d))
    			if err != nil {
    				log.Println("failed to write the response", err)
    				return
    			}
    		})()
     
    	}
     
    }
    Mais vous ne devriez pas avoir besoin d'autant d'artilleries pour arriver à vos fins,
    là, c'est surtout que je me cherche des excuses pour écrire un peu de code...

    Bonne journée.

  7. #7
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 793
    Points : 5 615
    Points
    5 615
    Par défaut
    Citation Envoyé par unanonyme Voir le message
    Là vous faites des println, donc des LF et non des CRLF, ce n'est pas standard,
    non println() envoie bien CR et LF


    @michel.semal ==> sans le code c'est difficile de vous aider on ne sait pas trop ce qu'il y a dans les différentes variables

  8. #8
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut
    Bonjour à vous,

    Pour Jay M, (les autres peuvent le lire aussi hein.....!!)
    le code est en mode debuggage, donc comprend beaucoup de code d'affichage. mais voici les parties principales :
    Pour le setup (qui me sert de test pour voir si le serveur WEB répond :
    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
     
    IPAddress server(192, 168, 1, 4); // numeric IP for server
    WiFiClient Mwifi;
     
    char Hosts[] = "host: 192.168.1.4";
     
     
       if (Mwifi.connect(server, 80)) {
          Serial.println("connected");
          // Make a HTTP request:
          Mwifi.println("GET /pero.php HTTP/1.1");
          Mwifi.println(Hosts);
          Mwifi.println(F("Content-Type: text/html; charset=utf-8"));
          Mwifi.println(F("Connection: close"));
          Mwifi.println();
          delay(500);
          Serial.print(F("*******    je lis le retour   *****\n"));
          while (Mwifi.available()) {
            char c = Mwifi.read();
            Serial.write(c);
          }
        }
        else {
          Serial.print(F("****   pas de connection  *****" ));
        }
    Etant bien entendu que le WiFi est bien connecté à mon WiFi local et via ce denier ce connecte au serveur WEB.
    Le delay de 500 milliseconde garanti la lecture de la réponse du serveur. Sans cela, une fois sur deux la lecture de la reponse ne se fait pas.

    Pour le post:
    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
       // Serial.print("******  Affiche 10 s   ************\n");
        String machaine = String("temp=") + String(dTT10s) + String("&hum=") + String(dRH10s);
        Serial.println(machaine);
        Serial.print("**********   Connection au Web server (loop)          ***********\n");
        int result = Mwifi.connect(server, 80);
        if (result == 1) {
          Serial.println("connected to server");
          // Make a HTTP request:
          Mwifi.println(F("POST /post.php HTTP/1.1"));
          Mwifi.println(F(Hosts));
          //Mwifi.println(F("Content-Type: application/x-www-form-urlencoded"));
          Mwifi.println(F("Connection: close"));
          Mwifi.println();
          //Mwifi.println(F("User-Agent: Arduino/1.0"));
          //Mwifi.print(F("Content-Length: "));
          //Mwifi.println(machaine.length());
          //Mwifi.println(machaine);
          Mwifi.println("?temp=bonjour");
          //Mwifi.println(); Mwifi.println();
          Mwifi.println(F("Connection: close"));
     
          Mwifi.println();
          delay(1000);
          Serial.println("\n\nSend OK  Maintenant je lis..... \n\n");
          bool aff = 1;
          while (Mwifi.connected()) {
     
            if (Mwifi.available()) {
              // read an incoming byte from the server and print it to serial monitor:
              char c = Mwifi.read();
              if (c == '<') {
                aff = 0;
              }
              if (aff) {
                Serial.print(c);
              }
            }
          }
          Mwifi.stop();
          Serial.println("*******************     server disconnected *****************");
        }
        else {
          Serial.print("Erreur de connection\n resulta=");
          Serial.print(result);
        }
    Le parties en commentaire sont les diverse version des diverses solution trouvée sur internet, mais les reponse restent
    toutes le même, je reçoit le code html envoyé depuis le serveur mais les variable du post restent vide

    Le fichier post.php lui contient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php header('Content-Type: text/plain') /* Retour texte pour simplifier */ ?>
    Données reçues de l'Arduino ver le PCmaison :
    $_REQUEST => <?php print_r($_REQUEST) ?>
    $_GET => <?php print_r($_GET) ?>
    $_POST => <?php print_r($_POST) ?>

    le retour sur l'Arduino est :

    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
    HTTP/1.1 200 OK
    Date: Fri, 15 Dec 2023 22:16:17 GMT
    Server: Apache/2.4.56 (Debian)
    Vary: Accept-Encoding
    Content-Length: 116
    Connection: close
    Content-Type: text/plain;charset=UTF-8
     
    Données reçues de l'Arduino au PC maison  pero.php:
    $_REQUEST => Array
    (
    )
    $_GET => Array
    (
    )
    $_POST => Array
    (
    )
    J'ai deux serveur Web différent, un Apache2 sur mon PC Linux Debian 11.8
    et un nginx sur le Raspberry
    Il est bien entendu que mon PC Linux et le Raspberry sont sur le même réseau local(192.168.1.x)
    Les réponse des deux serveurs sont quasi identiques à l'exception du nom du serveur qui répond....

    Je me demande quand même si c'est pas une question de "merci" et "SVP" quel que part dans le code...

    Mais il y des sites qui donne le <header> de la requête tel que je l'écris, mais le<corps> ne contient qu'une ligne...

    Et évidemment ces sites ne donne pas le fichier php utilisé pour voir le POST arriver sur le serveur.....

    Mais c'est peut être moi qui veut faire des choses impossible.....


    Pour uanonyme,
    Les code sont en quel langage et sur quelle machine ? Arduino, serveur web ?
    Le décodage avec WireWhark me confirme que les lignes de la requête sont bien terminé par '\r\n'
    et que une séquence '\r\n' doublant la dernière ligne de la requête est bien envoyée.

    La requête GET me renvoi bien une réponse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HTTP/1.1 200 OK  (text/plain)
    puis la ,page web venant du serveur,

    A la requête POST,
    J'ai la même réponse venant du serveur, puis l'Arduino envoi encore des lignes dont l'info est :
    "Continuation" pour la première ligne comprenant le code "Connection : close" et si une deuxième ligne est envoyée
    par l'Arduino elle comprend que des caractère..
    Je dois encore étudié le contenu, mais cela semblent être des séquences "ACK" ou que la séquence soit:
    Arduino OST le <header>
    Serveur repond OK
    Arduino Continuation le <corps> ?? (une deuxième fois parfois)

    Il est possible que il y aie un problème de vitesse de transmission/réception des requêtes.
    Je verrai cela demain.....


    Merci de vous pencher sur mon problèmes

    Michel

  9. #9
    Membre éclairé
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 386
    Points : 795
    Points
    795
    Par défaut
    Bonjour,

    C'est du Go.

    Des petits truc que je note en vous lisant.

    Pour le POST, c'est obligatoire de fournir l'en-tête Content-length

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          Mwifi.println(F("POST /post.php HTTP/1.1"));
          Mwifi.println(F("Host: 192.168.1.4"));
          Mwifi.println(F("Content-Type: application/x-www-form-urlencoded"));
          Mwifi.println(F("Connection: close"));
          // Mwifi.println();                                                // non pas au milieu des headers.
          //Mwifi.println(F("User-Agent: Arduino/1.0"));
          Mwifi.print(F("Content-Length: "));                    // ici
          Mwifi.println(machaine.length());                      // la
          Mwifi.println("");                                                // et la
          Mwifi.println("temp=bonjour");                          // Il faut supprimer ce ? autrement la valeur du content-length ne correspond plus, ou il faudra l'incrémenter de 1.
          Mwifi.println(); Mwifi.println();
    Après, ce bout de code m'interpelle,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          delay(500);
          Serial.print(F("*******    je lis le retour   *****\n"));
          while (Mwifi.available()) {
            char c = Mwifi.read();
            Serial.write(c);
          }
    Déjà au sujet de la méthode client.available, celle ci retourne false si il n'y a pas de données à lire sur la ligne.
    Hors, le temps que la requête soit exécutée côté serveur, la ligne est vide.
    https://www.arduino.cc/reference/en/...ent.available/
    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).
    En conséquence de quoi vous avez mis un délai de 500ms, c'est raccord, mais c'est un nid à erreur hasardeuse.

    Il faut plutôt boucler sur la méthode client.Read tant que la valeur est == -1, et ce, tant qu'aucune donnée n'est reçue,
    ce qui signifie que vous allez devoir implémenter un genre de timeout (avant la boucle, st:=time.Now(), durant la boucle if time.Since(st)>5sec then break).

    Par ailleurs, l'appel à Read ne vous donnera pas forcément l'intégralité de la réponse au premier appel.
    La réponse peut très bien être fragmentée sur plusieurs appels, d'où l'utilité d'utiliser des clients normés.

    https://www.arduino.cc/reference/en/...i/client.read/

    Mais ça me paraît bizarre d'avoir à implémenter cette mécanique manuellement,
    c'est extrêmement low level et ça fait longtemps que des APIs existent dans d'autres environnements
    avec strictement les mêmes problèmes.


    Le plus simple est encore de regarder comment c'est écrit ici
    https://github.com/arduino-libraries...lient.cpp#L422

    Bonne journée.

  10. #10
    Membre averti

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2012
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 205
    Points : 308
    Points
    308
    Par défaut Victoire.....
    Bonjour unanonyme,

    Ce matin, j'ai décider de tout comprendre...... même pas peur

    Donc,
    J'ai regarder comme faire du php pour envoyer un post...=> une page php.
    J'ai trouver comme afficher les donnée du POST => une autre page PHP
    pour que je puisse vérifier ce qui se passe sur le réseau, les pages sont sur mon PC ou tourne Wireshark et sur le Raspberry pur émettre les données.

    Depuis mon raspberry, j'utilise une page PHP qui émet une requête POST vers le serveur WEB Apache sur mon PC......
    Le code de la page 'emet.php' est :
    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
    <?php
    $postdata = http_build_query(
        array(
            'name' => 'From Raspi',
            'id' => '1'
        )
    );
    $opts = array('http' =>
        array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );
    $context = stream_context_create($opts);
    $result = file_get_contents('http://192.168.1.4/request.php', false, $context);
    echo $result;
    ?>
    Ttrouver sur inernet le site delfistack.
    J'y ai modifier la ligne 'file_get_contents(..... 'pour quelle aie relire et donc transmettre les valeurs vers la page request.php du serveur Apache sur mon PC
    Donc dans le fichier 'emet.php' de mon Raspi, je donne une valeur à la variable name' à 'From Raspi'
    Le réseau transmet au serveur Web de mon PC les donnée et l'adresse de la page qui doit renvoyer les données....
    Et je reçois la page request.php envoyée par le serveur Apache de mon PC sur l'explorateur de mon Raspi: YES

    Page request.php From maison
    Name: From Raspi
    ID: 1
    Le code de la page request.php sur le serveur Apache est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <h1> Page request.php From maison</h1>
     
    <?php
    echo "Name: ". $_POST['name']. "<br>";
    echo "ID: ". $_POST['id'];
    ?>
    C'est donc cette page complétée avec les données du POST qui arrive.

    Je regarde la structure de la requête sur mon Wireshark:
    Frame 680: 223 bytes on wire (1784 bits), 223 bytes captured (1784 bits) on interface eno1, id 0
    Ethernet II, Src: Raspberr_36:92:20 (dc:a6:32:36:92:20), Dst: ASUSTekC_2c:cf:9c (70:4d:7b:2c:cf:9c)
    Internet Protocol Version 4, Src: 192.168.1.8, Dst: 192.168.1.4
    Transmission Control Protocol, Src Port: 34402, Dst Port: 80, Seq: 1, Ack: 1, Len: 157
    Hypertext Transfer Protocol
    POST /request.php HTTP/1.1\r\n
    Host: 192.168.1.4\r\n
    Connection: close\r\n
    Content-Length: 20\r\n
    Content-type: application/x-www-form-urlencoded\r\n
    \r\n
    [Full request URI: http://192.168.1.4/request.php]
    [HTTP request 1/1]
    [Response in frame: 682]
    File Data: 20 bytes
    HTML Form URL Encoded: application/x-www-form-urlencoded
    Form item: "name" = "From Raspi"
    Form item: "id" = "1"
    Et je la reporte sur mon Arduino..... du coup le code de l'arduino devient:
    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
    int result = Mwifi.connect(server, 80);
          if (result == 1) {
            Serial.println("connected to server");
            // Make a HTTP request:
            Mwifi.println(F("POST /request.php HTTP/1.1"));
            Mwifi.println(F(Hosts));
            Mwifi.println(F("Connection: close"));
            Mwifi.println(F("Content-Length: 22"));
            Mwifi.println(F("Content-Type: application/x-www-form-urlencoded"));
            Mwifi.println();
            Mwifi.println("name=From Arduino&id=1");
            delay(1000);
            Serial.println("\n\nSend OK  Maintenant je lis..... \n\n");
            bool aff = 1;
            while (Mwifi.connected()) {
              if (Mwifi.available()) {
                // read an incoming byte from the server and print it to serial monitor:
                char c = Mwifi.read();
                if (c == '<') {aff = 0; } //ne pas afficher le HTML
                if (1) {Serial.print(c);}
              }
              char c = Mwifi.read();
              Serial.print(c);
            }
            Serial.print(F("\n****   Fin de lecture  ******\n"));
            Mwifi.stop();
    et je reçoit sur le port série de l'Arduino
    ********** Connection au Web server (loop) ***********
    connected to server


    Send OK Maintenant je lis.....


    HTTP/1.1 200 OK
    Date: Sat, 16 Dec 2023 11:29:04 GMT
    Server: Apache/2.4.56 (Debian)
    Content-Length: 67
    Connection: close
    Content-Type: text/html; charset=UTF-8

    <h1> Page request.php From maison</h1>

    Name: From Arduino<br>ID: 1
    **** Fin de lecture ******
    et voila.....

    Deux remarques,

    Il est important de mettre le nombre de caractères que l'on va envoyer vers le serveur WEB lors de la requête POST.Dans la requête du Raspi, la longueur est de 20 alors que la longueur de la chaîne transmise par le l'Arduino est de 22 caractères
    La séquence(la suite et l'ordre) des lignes de la requête semble aussi être très importante.

    Pour info je me prépare un petit tuto plus détaillé pour garder cela en mémoire.......

    Mais donc, hormis le transfert vers la DB (que normalement j'ai déjà réalisé), l'ensemble fonctionne

    Un grand merci à ceux qui m'ont aidés à comprendre et à résoudre ce problème.....

    Je vais mettre un lien dans le forum PHP vers celui ci

    J’attends un peu quelques réactions avant de mettre comme résolu....

    Michel

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

Discussions similaires

  1. POST de données en VB5 vers une page web..
    Par Foub dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/05/2007, 20h29
  2. POST de données en java vers une page web.
    Par Foub dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/04/2007, 19h22
  3. Rediriger vers une page web
    Par snakemovie dans le forum Flash
    Réponses: 2
    Dernier message: 06/03/2007, 15h18
  4. [email] Redirection automatique vers une page web
    Par gorderson dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/12/2006, 21h58
  5. pour se diriger vers une page web
    Par Ickou dans le forum Langage
    Réponses: 4
    Dernier message: 31/03/2006, 16h31

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