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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    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 908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 908
    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 éclairé

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    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 chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    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 éclairé

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

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 231
    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 chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    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.

+ 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