In che senso la codifica? intendi il client.println(body)? è commentato nel tuo esempio. Nel mio codice lo metto in coda alla url
In che senso la codifica? intendi il client.println(body)? è commentato nel tuo esempio. Nel mio codice lo metto in coda alla url
anche con echo ($_GET[]) non stampa niente
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
più che altro alla codifica anche perché un form html con metodo GET dovrebbe inviare le medesime intestazioni e accodare il dato alla urlThanks 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.
Ultima modifica di darbula : 06-11-2020 alle ore 00.43.28
Avrebbe senso e spiegherebbe perché tutti gli altri client funzionano mentre Arduino no.In internet ho letto che bisogna aggiungere anche la codifica, ora aggiorno.
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.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.
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.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?
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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).
Comunque per me questo codice è la sintassi corretta sul perché non funziona è un mistero.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);
Ultima modifica di darbula : 06-11-2020 alle ore 15.06.58
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
Non possiedo il mezzo fisico ma questo produce più linee o una singola linea \r\n? (Carrige return e new line)
Nel frattempo prova a concatenate due stringhe con l'operatore + anche se il secondo parametro è intero dovrebbe Avvenire esplicitamente il cast in stringa.Codice:client.print("Content-Length: "); client.println(body.length());
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.
questo è quello che mi torna da debug arduino con questo codice: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>
Ho provato a modificare gli header ma NIENTE. Almeno prima 500 me lo davaCodice: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();
Prova così
Mi risulta un doppio \r\n tra request line e body ma non dopo il body, quindi la tolgo println.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
Ultima modifica di darbula : 06-11-2020 alle ore 22.42.53
Niente, anche togliendo l' ultimo println risponde 500 internal...
Provo a chiedere ai luminari di arduino forum, ci vorrà un pò.
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.
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.Provo a chiedere ai luminari di arduino forum, ci vorrà un pò
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=1Codice: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
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: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
ci mancherebbe solo che i server si inventassero gli status code!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.
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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
Ok, ma se $_POST effettua internamente urldecode, comunque dovrei vedere qualcosa, mentre l' array risulta vuoto e isset()non produce risultati, giusto?
Se la variabile è definita (esiste) isset ritorna comunque un valore boleano TRUE altrimenti FALSE.
Di defaultè inizializato a array vuoto indica che per php non ci sono dati mentreCodice PHP:
$_POST = array();
quando diverso da stringa vuota indica i dati anche se sono diversi da lettura=val.Codice PHP:
echo file_get_contents("php://input");
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
Ragazzi, i guru di Arduino mi dicono questo:
Lamia domanda è: come faccio ad abilitare sul server il log degli errori PHP?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.
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 genereCodice 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
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
[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?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
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Si, è presente nella risposta del server, ma non mi compare nella pagina a cui faccio il post
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Se lancio la pagina e vedo questo:
presumo che $_POST[] sia comunque vuotoNULL string(0) ""
Ma stai cercando di accedere alla pagina dal browser?
I suggerimenti che do più spesso:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
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);
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:
- Le funzioni mysql_* non fanno più parte di PHP. Usa PDO o MySQLi.
- Il supporto a PHP 5.x è cessato l'1 gennaio 2019, e con esso le funzioni mysql_*. Che ti piaccia o no.
- Non memorizzare le password in chiaro nella base di dati. Usa password_hash().
- Indenta correttamente il codice e usa nomi significativi per gli identificatori.
Ok, ti ringrazio, questo passaggio non mi era chiaro (e non solo questo).Provo a sistemare la query.