Ciao a tutti!
Siete a conoscenza se esiste la possibilità di leggere un file di testo (txt o csv) tramite protocollo http?
In pratica il dubbio è se arduino riesca a legge un file che è salvato su un server web esterno, per eseguire successivamente un parsing dei dati letti.
Sapete se c'è qualche libreria o magari una funzione di processing che mi sfugge?
Grazie e ciao,
Gianni
Il protocollo non si chiama FTP e non HTTP?
Ciao Uwe
uwefed:
Il protocollo non si chiama FTP e non HTTP?
No, intendo proprio HTTP. FTP implica un accesso autenticato per non creare problemi di sicurezza sul server web. Sono aperto ad ogni tipo di consiglio l'uniche cose: il file è remoto (su un hosting) e la maniera di accesso ai dati scritti sul file deve avvenire senza alcuna autenticazione.
Ciao
Ciao,
se Arduino è dotato di ethernet/wifi shield, ti basta utilizzarlo in modalità client, e puntare all'indirizzo in cui c'è il tuo file.
Se il file è accessibile a te via web browser, allora lo sarà anche per Arduino.
pitusso:
Ciao,
se Arduino è dotato di ethernet/wifi shield, ti basta utilizzarlo in modalità client, e puntare all'indirizzo in cui c'è il tuo file.
Se il file è accessibile a te via web browser, allora lo sarà anche per Arduino.
Pensi che possa usare client.read ()
?
Pensi che possa usare client.read ()?
guarda l'esempio WebClient sia su Ethernet che Wifi (li trovi presenti tra gli esempi dell'IDE), vedi che fanno esattamente quel che dici tu: caricano una pagina HTML, la "leggono" carattere per carattere con la read(), e poi la visualizzano sul monitor seriale.
Tu, invece di visualizzarlo su monitor seriale, lo processerai secondo le tue esigenze.
pitusso:
guarda l'esempio WebClient sia su Ethernet che Wifi (li trovi presenti tra gli esempi dell'IDE), vedi che fanno esattamente quel che dici tu: caricano una pagina HTML, la "leggono" carattere per carattere con la read(), e poi la visualizzano sul monitor seriale.
Tu, invece di visualizzarlo su monitor seriale, lo processerai secondo le tue esigenze.
Grazie
Ma come faccio ad eliminare il DOM e a prelevare solo i valori?
Ho un file csv su cui devo fare un parsing di valori di questo tipo: 0;1;2;3;4;5;6;7;8;9;
E sto utilizzando questo sketch modificando l' esempio WebClientRepeating
void httpRequest() {
if (client.connect(server, 80)) {
client.println("GET /valoridigitali.csv HTTP/1.1");
client.println("Host: www.host.my");
client.println("Connection: close");
client.println();
lastConnectionTime = millis();
}
else {
Serial.println("connection failed");
client.stop();
}
}
if (client.available()) {
char c = client.read();
Serial.print(c);
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
httpRequest();
}
Arduino giustamente mi stampa tutto il DOM seguito dai valori
HTTP/1.1 200 OK
Date: Tue, 03 Dec 2013 18:37:27 GMT
Server: Apache
Last-Modified: Tue, 03 Dec 2013 18:11:42 GMT
ETag: "4a179601-15-4eca53a864f04"
Accept-Ranges: bytes
Content-Length: 21
Connection: close
Content-Type: text/csv
0;1;2;3;4;5;6;7;8;9
Il problema è che non riesco a pensare ad un "trick" per elimiare il DOM e salvarmi solo i valori
0 1 2 3 4 5 6 7 8 9
che successivamente andrò a lavorare con uno switch / case
Da tenere presente che questi valori sul file csv li posso scrivere come voglio e in qualunque formato, in txt, in xml, in html ecc. Li genero da una funzione in php sul mio host. Per intenderci li posso scrivere anche
|0|1|2|3|
...ecc
<val>0</val><val>1</val><val>2</val>
...ecc
<dig0>valore0</dig0><dig1>valore1</dig1><dig2>valore2</dig2>
...ecc
Avete una dritta?
Grazie.
Ok ho risolto in questa maniera:
il codice è da ottimizzare, ci sono troppi if ...
if (client.available()) {
char c = client.read();
currentLine += c;
if (c == '\n') {
currentLine = "";
}
if (currentLine.endsWith("<d0=")) {
readD0 = true;
valD0 = "";
}
if (currentLine.endsWith("<d1=")) {
readD1 = true;
valD1 = "";
}
/* *** ecc *** */
if (readD0) {
if (c != '>') {
valD0 += c;
}
else {
readD0 = false;
Serial.println(valD0);
if (valD0 == "=1") {
Serial.println("ACCESO");
}
if (valD0 == "=0") {
Serial.println("SPENTO");
}
}
}
if (readD1) {
if (c != '>') {
valD1 += c;
}
else {
readD1 = false;
Serial.println(valD1);
if (valD1 == "=1") {
Serial.println("ACCESO");
}
if (valD1 == "=0") {
Serial.println("SPENTO");
}
}
}
/* *** ecc *** */
}
if (client.connect(server, 80)) {
Serial.println("connecting...");
client.println("GET /valoridigitali.xml HTTP/1.1");
client.println("Host: www.host.my");
client.println("Connection: close");
client.println();
Il file che viene che viene letto da arduino è generato ogni tot tempo secondo la seguente logica:
<d0=0><d1=1><d2=1><d3=0>...ecc...
Qualcuno di voi ha un idea su come ottimizzare il codice per levare quella serie di if?
Attendo prima di mettere il tag RISOLTO sul topic.