Go Down

Topic: Ethernet, TextFinder e stream: pagine incomplete (risolto!) (Read 1 time) previous topic - next topic

zoomx

Ogni tanto manca il Current Cond mentre la temperatura manca sistematicamente. Però in quel periodo non avevo ancora scoperto la linea per abilitare il debug della libreria.
Se abiliti il debug ( porti il serial print a 115200, 9600 è troppo lento) puoi notare che anche qui il caricamento si interrompe nelle righe che riguardano il forecast poco dopo il current Cond. Non vedi mai il tag </html> che segnala il fine pagina.

pablos71

Ho giorni pienissimi e poco tempo, non ho tralasciato l'argomento, a giorni penso di riuscire a riprendere gli sketch

ciao
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zoomx

Non ti preoccupare anche io sono in condizioni simili altrimenti avrei già provato con il portatile.
Il mio sospetto si concentra sulla libreria stream.
GRAZIE! Del pensiero, almeno.

pablos71

Secondo me è textfinder che incasina tutto quando si trova in una linea troppo lunga.

prova questo se crasha
Code: [Select]
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(0,0,0,0);

//IPAddress server(173,194,40,24); //google
//IPAddress server(54,225,234,35); //arduino cc
//IPAddress server(104,16,14,15);  //jquery
IPAddress server(94, 32, 108, 10);   //IlMeteo 94.32.108.10
EthernetClient client;

void setup() {
  
  delay(1000);
  pinMode(4, OUTPUT);
  digitalWrite(4, 1);
  pinMode(10, OUTPUT);
  digitalWrite(10, 1);
  Serial.begin(115200);
  if (Ethernet.begin(mac) == 0){
    Serial.println("Failed to configure Ethernet using DHCP");
   Ethernet.begin(mac,ip);
}
 Serial.print(Ethernet.localIP());
   delay(100);
  
  if (client.connect(server, 80))   {
    Serial.println(" Connected!");
    client.println("GET http://www.ilmeteo.it/box/previsioni.php?citta=5913");      
    client.println("Connection: close");
    client.println();
  
  }
    else  Serial.println(" Connection failed!");
  int n_righe=0;

  while (client.connected()) {
        if (client.available()) {
        char c = client.read();
        //Serial.write(c);// debug char di risposta
        
         //if (c == '\n') {
          //n_righe++;
          //Serial.print(n_righe); // degug per trovare le linee che servono
        //}
        
            if (n_righe > 68 &&  n_righe < 75) Serial.write(c);// debug char riga di risposta  
       }  
  }
  
  client.stop();
    delay(1);
}

void loop(){
}


da come uscita su seriale questo
Quote
<td class="dati tMin">9</td>
 <td class="dati tMax">17</td>
 <td class="dati">W</td>
 <td class="dati">2&nbsp;km/h</td>
 <td class="dati"><table style='height:15px' width='100%'><tr><td align='right' width='48' bgcolor='#EDF000'><font color='#000030'>32%&nbsp;</font></td><td width='102'></td></tr></table></td>
ora devi solo spulciare le linee
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zoomx

No, non credo sia textfinder. La seconda versione che ho postato usa direttamente stream come fa textfinder e succede esattamente la stessa cosa. Però non c'è il debug. Puoi anche provare a cercare altro nello stream ma semplicemente non lo trovi.
Se noti, dopo la stampa del pezzo html ricevuto e prima della stampa dei dati estratti c'è una pausa. Textstream aspetta dati e poi va in timeout, se allunghi il timeout si allunga la pausa. Ho provato ad aggiungere pause, pensavo che ci fossero ritardi nella ricezione dei dati ma non è cambiato nulla. Magari devo allungare di molto il timeout....

Però il tuo esempio mi ha dato un'indizio. Magari con un contatore posso saltare gran parte della pagina e processare il resto. Resta sempre una pezza ma forse è meglio di niente.

pablos71

Si è una pezza, anche perchè se domani cambiano il design della pagina e anche se i dati sono sempre quelli devi rivedere il tuo programma... per questo volevo mirare ad una richiesta diretta al loro database, purtroppo non ho trovato tra tutti i collegamenti JS e PHP di quel sito un request e split che mi aiutasse, molto probabilmente il database non è nemmeno il loro, sarà a pagamento di qualche altra fonte che a noi non è dato sapere.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

zoomx

L'ho scritto prima, il meteo.it pernette lo scaricamento di un xml ma a pagamento. E in fondo è giusto così.
Oltre a yahoo c'è anche wundergound e altri siti che richiedono la sola iscrizione.
Ma ilmeteo è uno dei pochi che fornisce indicazioni triorarie e anche orarie, non sempre precise ma che spesso mi hanno permesso di capire se era il caso di ripararmi da future piogge o meno. Inoltre è molto più localizzato di altri servizi.

Al limite posso mettere su un raspberry con uno schermino. O un vecchio tablet Android.

Se trovo il tempo vedo di indagare di più.

zoomx

Ho messo su rapidamente un server sul mio PC (com'é che non ci ho pensato prima?)
Il codice funziona e ho così corretto meglio la ricerca di stringhe.
Con Wireshark ho visto che la pagina arriva in due pacchetti, più tutta una serie di pacchetti di accompagnamento.

Su ilmeteo.it però continua a non funzionare. 
Si rafforza il sospetto che il secondo pacchetto vada perso e non avvenga la ritrasmissione.
Devo vedere se c'è qualche timeout nella libreria ethernet.

zoomx

Forse ho risolto.

Cercando in rete problemi analoghi sono arrivato in questa pagina.
http://www.scriptscoop.net/t/e84ccc17595f/arduino-ethernet-client-available-not-working.html
Dove ad un certo punto trovo scritto:
Code: [Select]
Sample HTTP Get Request:
 GET /pub/WWW/TheProject.html HTTP/1.1
 Host: www.w3.org


Al che mi viene un sospetto. Vado a vedere nel codice e trovo che la linea
Code: [Select]
client.println("HOST:www.ilmeteo.it/n/n");
ha due newline alla fine
Li rimuovo, carico il codice e sembra che funzioni. In effetti può essere benissimo che il server che avevo messo su ignorava completamente il campo host che invece in un server serio sembra sia importante.

Edit: pensavo fosse risolto perché ottengo tutti i dati interessanti. Quello che però è successo è che si è allungata la parte di pagina che ricevo ma continuo a non riceverla tutta.

zoomx

Finalmente ho risolto!!!
La colpa era ovviamente mia, come sospettavo e l'errore uno dei più comuni: un buffer troppo piccolo.

Il buffer che doveva contenere la parte estratta, 20 caratteri, era troppo puccolo per alcune condizioni meteo ricavate dal tempo attuale. Con Sereno andava bene ma con "poco nuvoloso" c'erano già problemi.

Il buffer overrun era anche responsabile del fatto che a volte funzionava e a volte no!

Ho risolto facendo in modo che le parti recuperate fossero più piccole eliminando in partenza il testo inutile.

Go Up