Leggere variabili online e memorizzarle in Mysql online

ciao

avrei bisogno di leggere 5 variabili online da 5 url diversi, memorizzarli temporaneamente in un array e poi spedirli ad una pagina php ciclicamente ogni 15 min.

la parte di memorizzazione via php a mysql è semplice, non riesco a leggere le 5 variabili da 5 url differenti nel loop…

Partendo dal classico sketch WebClient trovo difficoltà nel riformulare la richiesta ad un’altro ip

La decodifica della risposta invece l’ho sistemata accettando solo l’undicesima riga (parsing)

#include <SPI.h>
#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,0,20);

// fill in your Domain Name Server address here:
IPAddress myDns(192,168,0,1);

// initialize the library instance:
EthernetClient client;

char server[] = "192.168.0.70";

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 3*1000;  // delay between updates, in milliseconds

//variabili
int riga = 0 ;
String corpo ;

void setup() {
  // start serial port:
  Serial.begin(9600);
  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection using a fixed IP address and DNS server:
  Ethernet.begin(mac, ip);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  double value =0;
  
  if (client.available()) {
    char c = client.read();
    //Serial.print(c);
    delay(1);
    
    if (c == '\n') {
      riga= riga +1 ;
    } 
    
    if(riga==11){
       // corpo pagina
       corpo += c ;
    }
        
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    
    value = corpo.toInt();
    Serial.println(value/10); 
    
    //Serial.println("disconnecting.");
    client.stop();
  }

  // if you're not connected, and ten seconds have passed since
  // your last connection, then connect again and send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
    
     httpRequest();   //richiedo Variabile


  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();
   
}//end loop

// this method makes a HTTP connection to the server:
void httpRequest() {
  // if there's a successful connection:

  if (client.connect(server, 80)) {
   
    // send the HTTP PUT request:
    client.print("GET /variabile.txt HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println("disconnecting.");
    client.stop();
  }
  
  riga = 0 ;
  
}

prima di tutto inizia a fare la richiesta con il pc e vedi cosa succede. Sia che hai mac, linux o windoews (da win 7 in su devi attivare un servizio, ma roba di 2 click, vedi su google) da riga di comando possiedi un programma chiamat "telnet".
Questo permette di inviare caratteri ASCII verso un qualsiasi host attraverso il protocollo TCP, che è alla base di buona parte di internet attuale, e anche del protocollo HTTP., ed è il protcollo usato dal socket arduino; dunque cio che scrivi su tenelet è ciò che dovresti scrivere con client.print(), e ciò che leggi è ciò che leggeresti con una client.read().

Ora, è ovvio che devi provare i comandi che invia l'arduino e verificare che funzionino, o il codice di errore, e controllare che tutto sia ok.

ti do qualche cosiglio:

  1. l'header host che invii non è google.com, ma il nome del server che vuoi raggiungere. se non ha nome ma solo ip allora usa l'ip. questo on può essere omesso
  2. anche se fai la richiesta corretta, il server non risponde SOLO con il contenuto del file, ma con una serie di header che ti dicono se la richiesta è stat compresa ed ha avuto successo (codice 200), se cachare il file, che server web ti ha risposto, che encodig ha il file, che tipo di file è, la data ultima modifica, la richiesta di cookie, etc etc etc... tutti dati che puoi scartare, (giusto controllare che il codice di errorre sia 200, ovvero nessun errore, e puntare direttamente alla sezione di dati.

un ait può anche essere wikipedia, cerca il protocollo HTTP

Probabilmente mi sono spiegato male...

Ciò che non riesco a fare è la chiamata multipla a vari url, non la forma :

All'interno del loop credo che dovrei fare :

Aprire la connessione verso il primo IP, leggere i dati, chiudere connessione, memorizzare dati,
Aprire la seconda connessione, leggere dati......

Prendere i dati memorizzati e inviarli al MySql via php....

:~

Certo che devi chiudere il client prima di chiamare l'altro server, a meno che non apri 4 sessioni Ethernetclient contemporaneamente usando i 4 socket del w5100 o 8 del w5200