Salve a tutti,
mi trovo alle prese con lo Shield GSM per Arduino.
Ho bisogno di raggiungere questo url: myname.altervista.org/updatelvl.php?ID=1&LVL=15
La pagina updatelvl.php esegue una GET sui valori ID e LVL per aggiornare un db.
Le operazioni che eseguo sono:
-creazione di un socket TCP sulla porta 80 all'indirizzo myname.altervista.org
-GET alla restante porzione dell'indirizzo, in questo modo: gsm.SimpleWrite("GET /updatelvl.php?ID=1&LVL=15" HTTP/1.1"); (SimpleWrite esegue una semplice print)
Controllando il db però noto che nessun aggiornamento viene eseguito e non riesco a capire dove sia il problema, qualcuno può darmi una mano?
ci sono alcuni errori sulla stringa:
le " sono chiuse due volte (ma credo sia un errore della copia che hai fatto perchè nondovrebbe compilare con un errore del genere
manca il campo host, che mi pare sia obbligatorio nell'http1.1 (ma non nell'http1.0)
manca il fatto di andare a capo 2 volte di fila, che vuol dire che la richiesta è completa.
Grazie della risposta.
Spulciando in rete ho visto di aver mancato il doppio a capo, quindi ho provato con questa stringa
gsm.SimpleWrite("GET /updatelvl.php?ID=1&LVL=15 HTTP/1.1\x0d\x0aHost: myname.altervista.org\x0d\x0a\x0d\x0a");
Ma nulla
Ho anche provato la stringa da te postata, ma ancora niente. Non capisco proprio perchè non vada.
Non so se questo possa avere rilevanza, ma la pagina php oltre ad eseguire la GET, lancia delle istruzioni di connessione al db e conseguente query di aggiornamento.
sarebbe utile se via GSM tu leggessi la risposta del server. Prova il mio esempio senza campo host e usando HTTP/1.0
potrebbe anche essere che appena inviata la richiesta il GSM si disconnette prima che venga elaborata, e quindi il server droppa la richiesta (è inutile da elaborare se il client non è più conneso, dal punto di vista di come è pensato l'http, ed è anche un buon metodo per evitare attacchi DOS)
Provato ma nulla, ho anche fatto una prova aggiungendo uno /0 su una nuova riga alla fine.
Per quanto riguarda la risposta del server, non ho ancora una funzione che mi permetta di recuperarla, ci dovrò lavorare.
Mi sembra comunque che i comandi siano dati bene, quindi non capisco cosa ci sia che non va.
Provato a leggere la risposta dal server, non arriva nulla come se la request HTTP non venisse proprio inviata. Confermo invece che la connessione al socket avviene correttamente.
Non restituisce nulla.
Ma ho fatto altri test e penso che l'apertura del socket non avvenga per niente.
Sto usando la libreria dello Shield che al suo interno ha una funzione chiamata OpenSocket
Inizialmente per aprire una connessione facevo così gsm.OpenSocket("TCP",80,"myname.altervista.org"); e la funzione restituiva CONNECTED.
Poi ho provato ad aprire un socket su maps.google.it e nemmeno da qui ricevevo nulla, allora per frustrazione ho scritto gsm.OpenSocket("TCP",80,"tentativo.malsano.nicola") e la funzione ha restituito CONNECTED...
Ho provato a sostituire il path con l'indirizzo ip del host, mi restituisce sempre CONNECTED, ma nulla. Infine come ultimo tentativo ho lanciato la funzione inserendo un ip errato che iniziava per 365. Stessa cosa, CONNECTED.
Penso che il problema possa stare lì a questo punto.
L'ho guardata e i comandi AT sono corretti.
Aggiungo che subito dopo che ho lanciato la funzione, ho inserito quella di lettura della seriale. Il messaggio che arriva dal modem è ERROR ALREADY CONNECT, che è un messaggio di errore standard del comando AT+CIPSTART che si usa per aprire la connessione. Ritorna ovviamente quando la connessione esiste già, ma come fa a esistere se l'ip o l'host name sono errati?