Salve a tutti,
sto provando ad implementare un codice che estragga le informazioni meteo da una pagina HTML del servizio ilmeteo.it
Per far questo, richiedo la pagina HTML con i dati e faccio la ricerca delle parti utili utilizzando la libreria TextFinder
http://playground.arduino.cc/Code/TextFinder
Il codice è derivato da un'analogo presente in rete che prende i dati da Yahoo.
http://forum.arduino.cc/index.php?topic=121992.msg920175#msg920175
Quello che succede è che la ricezione della pagina si interrompe, quasi sempre dopo lo stesso numero di caratteri. Per accorgermene ho abilitato il debug attivando la linea #define DEBUG_OUTPUT nel file TextFinder.cpp
Questo problema sembra esserci anche nello sketch originale solo che siccome i dati si trovano giusto nella prima parte ricevuta, non si evidenzia l'errore.
Il codice è questo.
/*
* IlMeteo01
* derived from Yahoo01
* http://forum.arduino.cc/index.php?topic=121992.msg920175#msg920175
*
* Original code by Webmeister
* http://forum.arduino.cc/index.php?action=profile;u=15387
* Read Yahoo Weather API XML
* 03.09.2012
* http://arduino-praxis.ch
*
* Maybe this is the original one
* SimpleClientGoogleWeatherDHCP.pde
*
* Modifications by zoomx
* 2015-10-14
* Added DHCP
* Added Current Condition
* http://forum.arduino.cc/index.php?topic=121992.msg933688#msg933688
*
* 2015-10-22
* Changed to IlMeteo.it
*
*/
//#define DEBUG_OUTPUT // in TextFinder.cpp messo qui non funziona!
#include <SPI.h>
#include <Ethernet.h>
#include "TextFinder.h" //http://playground.arduino.cc/Code/TextFinder
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xAD };
byte ip[] = { 10, 0, 1, 101 };
byte gateway[] = { 10, 0, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
IPAddress server(94, 32, 108, 10); //IlMeteo 94.32.108.10
EthernetClient client;
TextFinder finder( client );
char place[20];
char hum[5];
char temp[5];
char currentcond[20];
void setup()
{
// Start Serial Port
Serial.begin(115200);
Serial.println(F("IlMeteo01"));
Serial.println(F("Setup..."));
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
// Start Ehternet
//Ethernet.begin(mac, ip);
if (Ethernet.begin(mac) == 0) {
Serial.println(F("Failed to configure Ethernet using DHCP"));
// no point in carrying on, so do nothing forevermore:
for (;;)
;
}
// print your local IP address:
Serial.print(F("My IP address: "));
for (byte thisByte = 0; thisByte < 4; thisByte++) {
// print the value of each byte of the IP address:
Serial.print(Ethernet.localIP()[thisByte], DEC);
Serial.print(".");
}
Serial.println();
}
void loop()
{
if (client.connect(server, 80))
{
Serial.println(F("Connecting to IlMeteo..."));
client.println("GET /box/previsioni.php?citta=5913&type=real1 HTTP/1.0");
client.println("HOST:www.ilmeteo.it\n\n");
client.println("Connection: close");
client.println();
Serial.println(F("Connected..."));
}
else
{
Serial.println(F(" connection failed"));
}
if (client.connected())
{
// Place/City
if ( (finder.getString("<div class=\"titolo\">", "</div>", place, 20) != 0) )
{
//Serial.print(F("Citta': "));
//Serial.println(place);
}
// Current Condition
//if ( (finder.getString("_blank\" title=\"Meteo %%CITY%%\">", "</a></b>
", currentcond, 20) != 0) )
if ( (finder.getString("%%\">", "</a></b>
", currentcond, 20) != 0) )
{
//Serial.print(F("Tempo attuale: "));
//Serial.println(currentcond);
}
// Temperature
if ( (finder.getString("color:red\">", "°C", temp, 4) != 0) )
{
//Serial.print(F("Temperatura C: "));
//Serial.println(temp);
}
else
{
//Serial.println(F("Nessun dato di temperatura"));
}
if ( (finder.getString("Umidità: ", "
", hum, 4) != 0) )
{
//Serial.print(F("Umidita': "));
//Serial.println(hum);
}
else
{
//Serial.println(F("Nessun dato di umidita'"));
}
// END XML
Serial.println();
Serial.print(F("Citta': "));
Serial.println(place);
Serial.print(F("Tempo attuale: "));
Serial.println(currentcond);
Serial.print(F("Temperatura C: "));
Serial.println(temp);
Serial.print(F("Umidita': "));
Serial.println(hum);
Serial.println(F("FINE"));
}
else
{
Serial.println(F("Disconnected"));
}
client.stop();
client.flush();
delay(60000);
}
Se lo provate, mostrerà la parte scaricata che, appunto, si interrompe. Quindi stampa i dati trovati, in questo caso la sola città. Lo sketch non si pianta ne va in reset, dopo 60 secondi viene rieffettuata la richiesta e così all'infinito.
Ho provato anche ad usare la classe stream ma succede esattamente lo stesso, stampa solo la città. Non so se in stream c'è un debug per vedere cosa effettivamente viene trattato.
Se provo uno degli esempi della libreria Ethernet, quello che scarica la pagina iniziale di Google, va tutto bene e viene stampato l'intero codice ricevuto, ben più lungo della pagina de il meteo.it
Ho provato a cambiare shield ma il risultato è identico.
Ho anche provato su due reti diverse al lavoro e a casa ma il risultato è sempre identico.
Una cosa strana è che a volte, prima che abilitassi il debug, il codice ha funzionato la prima volta ma poi non ha più funzionato alle richieste successive. Da quando ho abilitato il debug però non succede mai.
Avete qualche idea?
In allegato ho messo lo sketch e la libreria già modificata per il debug. Vanno nella stessa cartella.
Edit: ho cambiato ed accorciato il titolo perché non avevo più caratteri a disposizione.
Edit: finalmente risolto! Buffer overrun!!! Vedi post #24.
IlMeteo01.zip (5.64 KB)