Pagina 2 di 2 PrimoPrimo 12
Visualizzazione risultati 31 fino 56 di 56
Like Tree2Likes

Discussione: [PHP] Caricamento dati da arduino a pagina php

  1. #31
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    In che senso la codifica? intendi il client.println(body)? è commentato nel tuo esempio. Nel mio codice lo metto in coda alla url

  2. #32
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    anche con echo ($_GET[]) non stampa niente

  3. #33
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ovviamente nel mio codice commentato non c'è bisogno di inviare dei dati dal body in richiesta POST se stai provando il metodo GET nella tua url.
    Questo è relativo al metodo POST
    Thanks for taking the time to post this source. It really helped me get started. On my server (ASP.NET MVC 4), I needed to replace this line:

    client.println("Content-Type: application/x-www-form-urlencoded;");

    with the following:

    client.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8");

    in order to get it to work without an error 500. Posting this just in case others run into the same issue.
    più che altro alla codifica anche perché un form html con metodo GET dovrebbe inviare le medesime intestazioni e accodare il dato alla url
    Ultima modifica di darbula : 06-11-2020 alle ore 00.43.28

  4. #34
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    In internet ho letto che bisogna aggiungere anche la codifica, ora aggiorno.
    Avrebbe senso e spiegherebbe perché tutti gli altri client funzionano mentre Arduino no.

    Comunque in server condivisi devi sempre includere l'intestazione HOST in php avviene automaticamente ma forse Arduino deve essere forzato. [...] Altrimenti è il main di altervista che ti risponde e non il tuo sito.
    Più che altro RFC 7230 indica che in caso di header host assente il server deve restituire errore 400 (Bad Request). La documentazione di EthernetClient non è chiara in merito, nel dubbio concordo che sia meglio aggiungerlo.

    Ho guardato i simulatori, ma più che altro mi sembra che simulino circuiterie esterne, ci si deve comunque collegare ad arduino fisicamente.Io l' ho collegato via usb al pc e via ethernet al router, è così necessario il simulatore?
    Già, speravo esistessero emulatori da poter utilizzare (io) per i test senza avere un dispositivo fisico, ma non ne ho trovati che supportassero nativamente l'ethernet shield.

    I suggerimenti che do più spesso:


  5. #35
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Più che altro RFC 7230 indica che in caso di header host assente il server deve restituire errore 400 (Bad Request). La documentazione di EthernetClient non è chiara in merito, nel dubbio concordo che sia meglio aggiungerlo.
    Il discorso è incentivato per http 1.0 è header HOST fù opzionale mentre da http 1.1 è obbligatorio, preferirei anch'io ricevere un errore 400 http ma in un web server non sempre ciò accade specialmente se su un singolo ip corrispondono molti domini. https://httpd.apache.org/docs/2.4/vh...tml#serverpath
    Comunque la documentazione più idonea riguarda la funzione connect https://www.arduino.cc/en/Reference/ClientConnect
    Sapessi quante cose buffe accadono senza HOST in alcuni CMS. LOL (poiché si incentivano unicamente sulla fluidità e velocità del codice ma non al resto).

    Codice:
    var = analogRead(7);
        String body = ("lettura="+String(var));
        String url = "POST /aggiungi.php HTTP/1.1";
    client.println(url);
    client.println("Host: honeyecompost.altervista.org"); //Metti il dominio dove si trova aggiungi.php (SOLO dominio!)
    client.println("User-Agent: Arduino/1.0");
    client.println("Connection: close");
    client.println("cache-control: no-cache");
    client.println("Content-Type: application/x-www-form-urlencoded;");
    client.print("Content-Length: ");
    client.println(body.length()); //Lunghezza dato
    client.println();
    client.println(body);
    Comunque per me questo codice è la sintassi corretta sul perché non funziona è un mistero.
    Ultima modifica di darbula : 06-11-2020 alle ore 15.06.58

  6. #36
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Anche a me risulta corretto il codice, l' unica cosa che posso aggiungere è la codifica charset=UTF-8. Provo ad aggiungerlo e poi non mi rimane che aprire una discussione sul forum di arduino. Vi aggiorno. Per il momento grazie della disponibilità, sono in debito

  7. #37
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Non possiedo il mezzo fisico ma questo produce più linee o una singola linea \r\n? (Carrige return e new line)
    Codice:
    client.print("Content-Length: ");
    client.println(body.length());
    Nel frattempo prova a concatenate due stringhe con l'operatore + anche se il secondo parametro è intero dovrebbe Avvenire esplicitamente il cast in stringa.

  8. #38
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    client.print() produce una linea senza cr e nl, mentre println() produce una linea con cr e new line. Il tuo esempio produce la concatenazione dei due contenuti con cr e nl finali.

  9. #39
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Codice:
    HTTP/1.1 400 Bad Request
    Content-Type: text/html; charset=us-ascii
    Server: Microsoft-HTTPAPI/2.0
    Date: Fri, 06 Nov 2020 20:11:27 GMT
    Connection: close
    Content-Length: 339
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
    <HTML><HEAD><TITLE>Bad Request</TITLE>
    <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
    <BODY><h2>Bad Request - Invalid Header</h2>
    <hr><p>HTTP Error 400. The request has an invalid header name.</p>
    </BODY></HTML>
    questo è quello che mi torna da debug arduino con questo codice:
    Codice:
      var = analogRead(7);
        String body = ("lettura="+String(var));
        String url = "POST /test.php HTTP/1.1";
    client.println(url);
    client.println("Host: honeyecompost.altervista.org"); //Metti il dominio dove si trova inserisci.php (SOLO dominio!)
    client.println("Referer: http://honeyecompost.altervista.org/test.php");
    client.println("User-Agent: Arduino/1.0");
    client.println("Connection: close");
    client.println("Cache-Control: no-cache");
    client.println("Content-Type: application/x-www-form-urlencoded;Charset:UTF-8");
    client.println("Accept-Charset: iso-8859-1, utf-8");
    client.println("Content-Length: ");
    client.println(body.length()); //Lunghezza dato
    Serial.println(var); //Per debug
    Serial.print("lunghezza body:");
    Serial.println(body.length()); //Per debug
    client.println();
    client.println(body);
    client.println();
    Ho provato a modificare gli header ma NIENTE. Almeno prima 500 me lo dava

  10. #40
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Prova così
    Codice:
    var = analogRead(7);
        String body = ("lettura="+String(var));
        String url = "POST /test.php HTTP/1.1";
    client.println(url);
    client.println("Host: honeyecompost.altervista.org"); //Metti il dominio dove si trova inserisci.php (SOLO dominio!)
    client.println("Referer: http://honeyecompost.altervista.org/test.php");
    client.println("User-Agent: Arduino/1.0");
    client.println("Connection: close");
    client.println("Cache-Control: no-cache");
    client.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8");
    client.println("Accept-Charset: iso-8859-1, utf-8");
    client.println("Content-Length: ");
    client.println(body.length()); //Lunghezza dato
    Serial.println(var); //Per debug
    Serial.print("lunghezza body:");
    Serial.println(body.length()); //Per debug
    client.println();
    client.println(body); //singolo \r\n
    Mi risulta un doppio \r\n tra request line e body ma non dopo il body, quindi la tolgo println.
    Ultima modifica di darbula : 06-11-2020 alle ore 22.42.53

  11. #41
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Niente, anche togliendo l' ultimo println risponde 500 internal...
    Provo a chiedere ai luminari di arduino forum, ci vorrà un pò.

  12. #42
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Probabilmente chiedere ai guru di Arduino è la cosa giusta, a questo punto è chiaro che il problema non sia né lato server, né nella costruzione del messaggio HTTP.

    Provo a chiedere ai luminari di arduino forum, ci vorrà un pò
    Un esperimento che sarei molto curioso di vedere sarebbe sniffare i pacchetti in uscita da Arduino per vedere se ci sono problemi nei messaggi che costruisce e invia. Allo stato attuale il codice per la generazione del pacchetto è corretto (vedi test sotto), la pagina nel server risponde e non ci sono problemi con .htaccess. A buonsenso l'unico colpevole può essere a livello di trasmissione dati.
    Forse EthernetClient aggiunge header che generano un 500? O l'output di Arduino è [non] bufferizzato in modo da spezzare i messaggi in maniera problematica? O più semplicemente ci sono errori nelle API?
    Se hai [tanto] tempo e voglia di cimentarti con strumenti di sniffing dei pacchetti, i risultati potrebbero essere molto informativi.


    Riporto alcune prove che ho effettuato, nel caso in cui siano utili a qualcuno.

    Le seguenti chiamate funzionano in telnet (telnet honeyecompost.altervista.org 80):
    Codice:
    POST /aggiungi.php HTTP/1.1
    Host: honeyecompost.altervista.org
    Referer: http://honeyecompost.altervista.org/aggiungi.php
    User-Agent: Arduino/1.0
    Connection: close
    Cache-Control: no-cache
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Accept-Charset: iso-8859-1, utf-8
    Content-Length: 9
    
    lettura=1
    Codice:
    POST /aggiungi.php HTTP/1.1
    Host: honeyecompost.altervista.org
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Content-Length: 9
    
    lettura=1

    preferirei anch'io ricevere un errore 400 http ma in un web server non sempre ciò accade specialmente se su un singolo ip corrispondono molti domini. https://httpd.apache.org/docs/2.4/vh...tml#serverpath
    Se leggi bene quel documento dice semplicemente che If no Host: header is sent the client gets the information page from the primary host., quindi sarà lo host principale a rispondere, ma dovrà comunque restituire con un errore 400 per rispettare l'RFC 7230. Se provi su AlterVista, infatti, ottieni un 400:
    Codice:
    $ telnet honeycompost.altervista.org 80
    POST /aggiungi.php HTTP/1.1
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Content-Length: 9
    
    lettura=1
    
    HTTP/1.1 400 Bad Request
    Date: Sat, 07 Nov 2020 08:41:04 GMT
    Server: Apache
    Content-Length: 268
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <html><title>Bad request</title><head></head><body><p>Anomalia nella richiesta al sito, se il problema persiste <b>cancella i cookie</b>, <a href='https://support.google.com/accounts/answer/32050?hl=it' target='_blank'>maggiori informazioni</a></li></ul></body></html>Connection closed by foreign host.
    ci mancherebbe solo che i server si inventassero gli status code!

    I suggerimenti che do più spesso:


  13. #43
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ciao scusa hai ragione, in alcuni contesti quando si è su proxy una richiesta http/1.1 può essere erroneamente degradata a http/1.0 che non invia l'intestazione HOST.
    Volevo dire questo.
    In http/2 o il vecchio http/2.0 gli header sono compressi mentre in http/1.0 opzionali trovo non sia efficiente la non aggiunta header HOST in http/1.1.
    Esistono diverse versioni di Arduino che potrebbero utilizzare codice differente per il medesimo risultato comunque la scelta più saggia sarebbe inviare in formato json altrimenti si dovrà convertire i dati nella codifica percentuale poiché $_POST $_GET $_REQUEST $_COOKIE effettuano internamente urldecode. (Se proprio si deve essere precisi).
    Ultima modifica di darbula : 07-11-2020 alle ore 12.14.59

  14. #44
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Ok, ma se $_POST effettua internamente urldecode, comunque dovrei vedere qualcosa, mentre l' array risulta vuoto e isset()non produce risultati, giusto?

  15. #45
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Se la variabile è definita (esiste) isset ritorna comunque un valore boleano TRUE altrimenti FALSE.
    Di default
    Codice PHP:
    $_POST = array();
    è inizializato a array vuoto indica che per php non ci sono dati mentre
    Codice PHP:
    echo file_get_contents("php://input");
    quando diverso da stringa vuota indica i dati anche se sono diversi da lettura=val.
    Quindi dovresti sniffare la connessione di Arduino come menzionato da @mzanella.
    Ulteriore conversione chiave per $_POST https://www.php.net/manual/en/langua...s.external.php non c'entra per il tuo problema ma mostra come funziona in php.
    Ultima modifica di darbula : 07-11-2020 alle ore 17.13.03

  16. #46
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Ragazzi, i guru di Arduino mi dicono questo:
    Comunque la risposta del server è abbastanza chiara, c'è un errore nell'elaborazione della richiesta del client ma lato SERVER, quindi devi verificare il PHP. Prova ad abilitare sul server il log degli errori PHP (se non lo è di già) cosi vedi qual'è la riga che causa l'errore.
    Lamia domanda è: come faccio ad abilitare sul server il log degli errori PHP?

  17. #47
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Hai specificato che se provi intestazioni nude e crude con curl o telnet il tutto funziona? http://forum.it.altervista.org/php-m...ml#post1461386 Fatti dire come sniffare i pacchetti http che Arduino invia al tuo host remoto (nel tuo caso altervista).
    In server condivisi purtroppo la funzione ini_set è disabilitata per questioni di sicurezza non puoi averne traccia del log degli errori php (che comunque non c'entra è sbagliata la richiesta e non php) a limite un try catch che comunque potrebbe non rivelare il vero problema.
    Comunque sarebbe un codice del genere
    Codice PHP:
    ini_set('log_errors', 1);
    ini_set('error_log', '/membri2/honeyecompost/logs/error_log.txt');
    Ultima modifica di darbula : 09-11-2020 alle ore 18.09.02
    mzanella likes this.

  18. #48
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Ragazzi, ho risolto con Arduino, dovevo semplicemente togliere 'http://' dall' url del server quando lo dichiaravo come array
    Codice:
     
    const char Altervista[] = "honeyecompost.altervista.org";

    Ora da debug Arduino il server mi risponde
    [
    HTTP/1.1 200 OK
    Date: Tue, 10 Nov 2020 10:20:12 GMT
    Server: Apache
    Vary: Accept-Encoding
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html; charset=UTF-8

    9a
    627Sono testo ma potrei anche essere Markup html, l'interprete php è già chiuso dal relativo tag di chiusura
    string(3) "627"
    string(11) "lettura=627"

    0
    ma se lancio la pagina test.php non mi stampa il valore passato in post. Significa che il dato è passato al server ma non raggiunge la pagina? Dovrei fare un redirect?

  19. #49
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    In base a cosa dici che il valore passato tramite POST non viene stampato? Dall'output che hai mostrato sembra che "lettura=627" sia correttamente presente nella risposta.

    I suggerimenti che do più spesso:


  20. #50
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Si, è presente nella risposta del server, ma non mi compare nella pagina a cui faccio il post

  21. #51
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Non capisco, la "risposta del server" è data dalla "pagina a cui fai il post", le due cose coincidono.
    Spiega bene cosa stai cercando di fare e ottenere

    I suggerimenti che do più spesso:


  22. #52
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Se lancio la pagina e vedo questo:
    NULL string(0) ""
    presumo che $_POST[] sia comunque vuoto

  23. #53
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Ma stai cercando di accedere alla pagina dal browser?

    I suggerimenti che do più spesso:


  24. #54
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    si, non dovrei vedere il risultato di
    Codice PHP:
    $lettura = null; // Inizializzazione variabile a null
    if(isset($_POST['lettura'])) { // Verifica esistenza
    $lettura = $_POST['lettura']; // Sovrascrivo al valore $_POST['lettura']
    echo ($lettura);
    ??

  25. #55
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    No, una pagina PHP "esiste" fintantoché una richiesta viene servita, e solo per il client che produce la richiesta.
    Quando Arduino invia un dato, la pagina lo riceve, avvia uno script (PHP) che produce la risposta e termina, quel dato viene dimenticato.
    Se visiti la pagina in un secondo momento non lo rivedrai.

    Se vuoi ottenere la persistenza dei dati inviati devi tornare al codice mostrato nel primo messaggio, nel quale il dato veniva salvato in un database (che mi sembrava avesse un problema nella query). Sistemato quello potrai creare una seconda pagina per la visualizzazione dei dati.

    I suggerimenti che do più spesso:


  26. #56
    honeyecompost non è connesso Utente giovane
    Data registrazione
    21-09-2020
    Messaggi
    39

    Predefinito

    Ok, ti ringrazio, questo passaggio non mi era chiaro (e non solo questo).Provo a sistemare la query.

Pagina 2 di 2 PrimoPrimo 12

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •