Caricare un file da microsd a server

Salve a tutti!
Allora ho questo problema… vorrei entrare in questa rete meteo nazionale con la mia stazione fatta con arduino, ovviamente sono già in contatto con l’admin del sito, ma per entrare, a detta sua mi serve da spedire sul mio server un file come quello in allegato, in modo da richiedere i miei dati tramite quei comandi che sono ovviamente gli stessi di richiesta di quelli che uso io sul mio programma di arduino.
Il mio sito è questo

Qualche idea?

P.S. il file quello in allegato lo metto nella micro sd che è dentro lo slot dell’ethernet shield comunque!

stazione meteo.txt (318 Bytes)

e dire che pensavo fosse un posto freddo, codesto Situazione attuale a Gualdo Tadino (PG) in periferia a 479m s.l.m. Aggiornata al 9/3/2016 alle ore 0:53:19

Temperatura esterna 17.0°C

Si ma perché é in camera adesso :D Ancora non l ho montata fuori! Scusate... dovevo specificarlo!

Allora io ho usato questo codice per caricarcelo, ma mi carica tutti dei numeri a fondo pagina nel sito che non so cosa sono:

File txtFile;

nel void loop alla parte relativa al client ho scritto:

  txtFile = SD.open("meteo.txt");
           if (txtFile){
            while(txtFile.available()){
              client.print(txtFile.read());
            }
            txtFile.close();
           }
          break;
        }

A me servirebbe di accedere a quel file che ho messo in allegato prima, con tipo: meteoflaminia.zapto.org:4600/meteo.txt

Cioè io vorrei che con meteoflaminia.zapto.org:4600 accedessi al sito normale e con meteoflaminia.zapto.org:4600/meteo.txt accedessi a quel file in allegato sopra.

Sapete aiutarmi? Grazie in anticipo!

Nessuno sa consigliarmi qualcosa? devo specificare qualcos'altro?

Se devo specificare qualcos'altro chiedete pure! Nessuno sa qualcosa a riguardo? :confused:

Chiedo gentilmente se qualcuno può aiutarmi, lo ringrazierei anche se è poco con un karma :smiley: Intanto io aggiorno lo stesso…
ho trovato qui qualcosa…
SD to web

ma con questo poi per accedere mi carica separatamente le cose? Mi spiego meglio, se io aggiungo questo codice al mio programma, poi su meteoflaminia.zapto.org:4600 mi visualizza il mio sito e su meteoflaminia.zapto.org:4600/meteo.txt mi visualizza il file? Le due cose non voglio facciano interferenza…

Se qualcuno sa qualcosa mi farebbe un grande piacere la sua risposta, mi scuso se sto insistendo ma è una cosa che voglio fare assolutamente! Posto lo sketch completo che al momento sto usando, ovviamente è senza l’invio del file da microsd a web!

Weather_station_completa_per_router.ino (90.9 KB)

Innanzitutto non si capisce granché di quello che devi fare. Parli di "caricare un file", il che mi fa pensare che tu ti debba collegare da qualche parte e mandare dei dati. Poi però sembri dire che vuoi che il webserver del tuo Arduino risponda ad un certo indirizzo con i dati in questione.

Assumiamo che quello che devi fare sia l'ultima cosa. Sai come funziona il protocollo HTTP? Il problema principale nel tuo sketch è che aspetti solo la fine della richiesta, e quindi spari sempre la stessa risposta, ignorando totalmente ciò che è stato scritto nella richiesta, tra cui l'URL. Per cui non sai se ti è stato chiesto "/" o "/meteo.txt" e non puoi rispondere di conseguenza.

In sostanza devi quindi fare il parsing della richiesta ed estrarre l'URL. Non è una cosa proprio banale. come riferimento puoi dare un'occhiata a un pezzo del mio webserver, qua: https://github.com/SukkoPera/Sukkino/blob/master/Webbino/WebServer_ESP8266.cpp, dalla linea 108 in poi. Quel codice individua la riga con l'URL, e quindi usa una classe esterna per parsarla (Questa: https://github.com/SukkoPera/Sukkino/blob/master/Webbino/HTTPRequestParser.cpp), che forse potresti anche includere quasi pari-pari nel tuo codice.

In ogni caso, il tuo sketch è un incubo da mantenere. Hai una pagina web enorme embeddata in decine (centinaia?) di client.print(), che ti faranno impazzire alla minima necessità di modifiche. Forse usando proprio il mio webserver potresti facilitarti notevolmente la vita, visto che ti darebbe la possibilità di fare la pagina come singolo file HTML contenente dei tag tipo #TEMPERATURA#, che vengono poi sostituiti con quello che vuoi al momento in cui la pagina viene richiesta. Prova a dare un'occhiata a questo esempio: https://github.com/SukkoPera/Sukkino/blob/master/Webbino/examples/SubstitutionTags/SubstitutionTags.ino. Il tuo sketch sarebbe più o meno simile, solo con una funzione per ogni valore da sostituire.

PS: Come l'hai fatto lo schermo solare?

Grazie Sukko per la risposta! A quanto vedo è una cosa non da poco quello che voglio fare, forse ho fatto troppe parole e niente di vero significato.
Praticamente ho un file “meteo.txt” salvato sulla microSD che è inserita nello slot dell’ethernet shield. Questo file voglio che venga caricato/visualizzato insomma, dalla microsd a meteoflaminia.zapto.org:4600/meteo.txt ovvero deve essere separato dal sito principale, devo accederci soltanto mettendo anche /meteo.txt
Ovvero questo meteoflaminia.zapto.org:4600 è il mio sito, e questo meteoflaminia.zapto.org:4600/meteo.txt deve essere dove vedo tutte quelle diciture di quel file che rimetto qua sotto in allegato. (deve essere visualizzato tale e quale a come è scritto dentro il file di testo)

Devo guardarmi bene quelle cose che mi hai postato e studiarci su. Adesso lo sketch che uso è quello in allegato, ma comunque è pressoché uguale solo che uso la macro F. Ovviamente ancora non ha la funzionalità che voglio aggiungere per entrare nella rete meteo. So che sono molti client print, però ho voluto usare quello che sapevo usare, posso sempre fare un lavoro più pulito come dici optando per altre soluzioni. Sarebbe bello averlo più stretto e più compatto. Ma comunque questo è lo sketch base che funziona bene, poi so che è bene anche pulirlo. :wink:
Do un’occhiata a tutto, grazie :wink:

P.S. Lo schermo solare è un autocostruito passivo, grazie a uno che conosco di uno shop che mi ha fatto un ottimo prezzo. :slight_smile: E’ fatto davvero bene, ha le prestazioni pressoché simili a un davis passivo.

Weather_station_completa_per_router.ino (92.2 KB)

stazione meteo.txt (318 Bytes)

io quello che non ho capito è cosa centra meteoflaminia.zapto.org:4600 con html nello sketch hai registrato tu questo IP 79.36..con un nome di un dominio? o sei in un server esterno e hai noleggiato uno spazio web?

quelle voglio dire quando scrivo quell'indirizzo entro su arduino o su uno spazio web? hai creato un server in casa tua e lo hai messo in rete? perchè il metodo di caricamento di un file.txt cambia, non capisco i percorsi delle chiamate http.

pablos: io quello che non ho capito è cosa centra meteoflaminia.zapto.org:4600 con html nello sketch hai registrato tu questo IP 79.36.188.209 di telecomitalia con un nome di un dominio? o sei in un server esterno e hai noleggiato uno spazio web? quelle voglio dire quando scrivo quell'indirizzo entro su arduino o su uno spazio web? hai creato un server in casa tua e lo hai messo in rete? perchè il metodo di caricamento di un file.txt cambia, non capisco i percorsi delle chiamate http.

Prima soluzione, ho usato noIP e ho assegnato il mio indirizzo ip esterno dinamico a un nome. Ovviamente quando cambia l'ip esterno viene aggiornato. ;) Quanto tu clicchi su quel sito entri su arduino, non su uno spazio web alla fine, perché è come se cliccassi sull'ip esterno con la porta esterna aperta... forse questo può causare problemi con quello che voglio fare? Entri su arduino, nessun server privato, è semplicemente il mio ip esterno mascherato e aggiornato quando cambia con NoIp I percorsi di chiamata http sono quelli d'esempio del webserver nell'IDE, poi io ho aggiunto tutti i client print ovviamente

@pablos: È un banale dyndns che punta al suo Arduino.

Per il resto, come ti ho detto "basta" estrarre l'indirizzo dalla richiesta. Poi raggruppi tutte le client.print() in una funzione, ne fai una simile a quella che hai postato per caricare il file da SD e a seconda dell'indirizzo chiami una o l'altra.

L'unico (enorme) problema è che il tuo file su SD apparirà esattamente com'è sulla SD. Niente ti sostituirà magicamente sensors.getTempCByIndex(0) con 25, ma comparirà esattamente sensors.getTempCByIndex(0). Altrimenti avresti potuto mettere su SD anche la pagina che c'è attualmente, no? ;) Per cui alla fine dovrai fare una sfilza di client.println() anche per questo secondo file, lasciando perdere la SD.

Se vuoi evitare tutto questo, dai un'occhiata al mio Webbino, fa decisamente al caso tuo e mi farebbe piacere che qualcuno lo usasse. Al momento supporta solo pagine messe nella flash, ma sulla Mega dovrebbero starci tranquillamente. Poi in realtà mi piacerebbe aggiungere supporto alla SD, e se proprio insisti lo farò :D.

Quanto a "caricare", meglio "visualizzare" appunto, anche perché tecnicamente direi che tu vuoi permettere di SCARICARE il file meteo.txt della SD ad un certo indirizzo, quindi l'esatto opposto :D.

Lo so che è banale non insultatemi :D :D Quindi praticamente dici che dovrei raggruppare tutte le client in una funzione che poi richiamo.

Non è un problema quello, è quello proprio che voglio fare :D Non voglio che segni i valori, quelli già li segna la pagina normale, voglio semplicemente che sia visualizzato lì e che dopo c'è questo amministratore del sito di lineameteo che con quelle richieste prende i dati dalla mia pagina... Non so esattamente come funziona, leggete nel campo indirizzo file richiesto: qui

A detta sua ci vuole quel "formato" (passatemi i termini che non so esattamente quali usare :) ) e poi lui tramite quelle diciture nel file di testo "meteo.txt" prende i dati. I dati poi vengono visualizzati su una pagina simile (cliccate sulle stazioni, conosco molto bene questo bel sito, sono iscritto da parecchio :) ) ma dovrebbe fare tutto lui, io gli dico solo come richiederli! E nel mio caso sensors.getTempCByIndex(0) è la richiesta della temperatura. Poi lui con questi dati "ci fa quello che vuole."

Ho capito, si, può fare, ma non è proprio così semplice perchè l'header della richiesta va analizzato bene. Per prima cosa per farlo bene ti suggerisco di piazzare nella SD anche il file HTML che hai nello sketch e nella SD pure i vari file compreso il .txt

Ora tu mi dirai, si ma se ho un html nella SD come faccio a passare i dati alla pagina sul browser? usando il JS e ajax, puoi però in questo modo fare una o più pagine più complesse, molto più grandi e interagire con esse con calcoli complessi che farebbe il browser e non arduino.

Se tu vuoi che arduino distingua questo ... meteoflaminia.zapto.org:4600 da questo ... meteoflaminia.zapto.org:4600/meteo.txt o da qualsiasi altro file meteoflaminia.zapto.org:4600/pinco.pal bisogna che arduino legga tutta la richiesta che distingua la "/", l'estensione del file da cercare, e infine il nome, poi preparare il browser al tipo di file che deve ricevere specificandolo nel mime_type

es nel primo caso se chiedi l'html spedisci l'html con client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html");

nel secondo caso col txt client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/plain");

ecc

@As: No, credo che tu non abbia capito cosa serve a loro: chiunque scarichi quel file con sensors.getTempCByIndex(0) non ci fa proprio niente. Sono sicuro che vorrebbe che al suo posto ci fosse "25" (la temperatura attuale, insomma), e così via per tutto quel che compare nel file.

Io ti sto dicendo proprio che NON è banale, se non sei parecchio pratico di parsing di testo e protocollo HTTP.

Una libreria che fa tutto questo https://github.com/ovidiucp/TinyWebServer

gestisce i POST, GET, PUT, DELETE .... puoi anche da pc remoto fare il download e l'upload di tutti i file che vuoi sulla SD senza toglierla, gestire gli accessi con password base64 (o MD5, un po' complesso ma si può fare)

Io non conosco la Webbino, visto che ti ha proposto quella ti può assistere lui direttamente che la conosce

SukkoPera: @As: No, credo che tu non abbia capito cosa serve a loro: chiunque scarichi quel file con sensors.getTempCByIndex(0) non ci fa proprio niente. Sono sicuro che vorrebbe che al suo posto ci fosse "25" (la temperatura attuale, insomma), e così via per tutto quel che compare nel file.

Io ti sto dicendo proprio che NON è banale, se non sei parecchio pratico di parsing di testo e protocollo HTTP.

Io dicevo che il mio come E' adesso hai detto che E' banale :) Comunque allora se fosse così perché non prendere il tutto dalla pagina che già c'è? Non mi è chiara questa cosa...

Comunque per pablos: dici che dovrei riscrivere tutta la mia pagina attuale in html su un file di testo e poi piazzarlo nella SD insieme a meteo.txt?

Te l'ha detto sukko

se non sei parecchio pratico di parsing di testo e protocollo HTTP.

dici che dovrei riscrivere tutta la mia pagina attuale in html su un file di testo e poi piazzarlo nella SD insieme a meteo.txt?

non basta mettere il testo, leggeresti tutti UNDEFINED al posto dei numeri, ti serve tutta la parte javascript da aggiungere all'html Conosci un po' di javascript? non è difficile e ci sono molti tutorial.

Perché se dovessero prelevare i dati da una pagina che è diversa per ciascuno diventerebbero matti, per ciascuno servirebbe un metodo ad hoc. È decisamente più semplice supportare un unico formato standard, sarà cura di cui fornisce i dati rispettarlo.

Sicuramente mettere la pagina attuale in html su SD è la cosa "giusta" da fare, nonché quello che Webbino ti permette di fare (e immagino anche altri webserver tipo quello citato da pablos), cosa che te ne semplifica notevolmente la manutenzione. Però ti serve sempre un metodo per far sì che dove scrivi TEMPERATURA compaia la temperatura corretta. Webbino gestisce questo, altri server non so. In alternativa dovresti fare le sostituzioni con Javascript e/o AJAX, come dice pablos.

Scusa As, prova la lib di sukko, se ti dice che fa al caso tuo lo saprà no?