Vedete questo sketch pls

Eccomi di nuovo a fare domande :stuck_out_tongue:

ho da poco rotto la mia scheda ethernet su cui facevo gli esperimenti (l'ho pistata per sbaglio).
avevo appena finito questo sketch:

#include <Ethernet.h>

String incomingByte = 0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 0, 0, 177 };
byte server[] = { 64, 233, 187, 99 }; // Google, ma sarà il mio indirizzo web

Client client(server, 80);

void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);

delay(1000);

Serial.println("connecting...");

if (client.connect()) {
Serial.println("connected");
client.println("GET /search?q=arduino HTTP/1.0");
client.println();
} else {
Serial.println("connection failed");
}
}

void loop()
{
if (Client.available() > 0) {
incomingByte = Client.read();
if (incomingByte == 'accendi') {
digitalWrite(Led, HIGH);
}
}
if (incomingByte == 'spegni') {
digitalWrite(Led, LOW);
}
}

ma non so se il funzionamento è giusto.

il funzionamento sarà il seguente:

La scheda si connette ad internet va sul sito che gli dico io e incomincerà a leggere la pagine web.
se troverà i valori 'accendi' (accenderà il led) se troverà i valori 'spegni' (spegnerà il led).

potete vedere se può funzionare visto che io non ne ho la possibilità se non prima di un paglio di giorni??

grazie 1000 a tutti

non è giusto perchè:

  1. le connessioni HTTP non son fatte per comunicazioni persistenti, ogni cambiamento dovrebbe essere una richiesta GET. altrimenti dopo qualche secondo la comunicazione dovrebbe andare in time out.
  2. incomingByte = Client.read(); ritorna una lettera alla volta; devi quindi creare un loop che legga una lettera alla volta fino a quando non raggiunge il terminatore di fine messaggio/riga

lesto:
non è giusto perchè:

  1. le connessioni HTTP non son fatte per comunicazioni persistenti, ogni cambiamento dovrebbe essere una richiesta GET. altrimenti dopo qualche secondo la comunicazione dovrebbe andare in time out.
  2. incomingByte = Client.read(); ritorna una lettera alla volta; devi quindi creare un loop che legga una lettera alla volta fino a quando non raggiunge il terminatore di fine messaggio/riga

1- come si fa una richiesta in get? mi puoi dare qualche tutoriali e/o dire qualche comanda che faccio questo tipo di azine??

2- allora farò un ciclo while che accumula i dati letti in un array e poi confronterà i valori degli array e farà l'azione.

lesto:
non è giusto perchè:

  1. le connessioni HTTP non son fatte per comunicazioni persistenti,

Purtroppo devo smentire questo. Persistent http si usa molto da quando esiste HTTP/1.1. Leggi RFC2616:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

giusto, allora è da cambiare la riga

client.println("GET /search?q=arduino HTTP/1.0");

in

client.println("GET /search?q=arduino HTTP/1.1");

scjurgen:

lesto:
non è giusto perchè:

  1. le connessioni HTTP non son fatte per comunicazioni persistenti,

Purtroppo devo smentire questo. Persistent http si usa molto da quando esiste HTTP/1.1. Leggi RFC2616:
HTTP/1.1: Connections

quindi cambiano da 1.0 a 1.1 non ho problemi... giusto??

no, la richesta dovrebbe essere:

GET /wiki/Pagina_principale HTTP/1.1 
Connection: Keep-Alive

e poi dovresti controllare la risposta, se il server è http 1.0 o 1.1

lesto:
no, la richesta dovrebbe essere:

GET /wiki/Pagina_principale HTTP/1.1 

Connection: Keep-Alive




e poi dovresti controllare la risposta, se il server è http 1.0 o 1.1

scusa ma non ho capito quello che vuoi dire...

che vuole dire wiki/pagina_principale...

poi keep-Alive come lo devo scrivere?
a che serve??

scusa se ti faccio le domande ma mi si sono incartate le idee

che vuole dire wiki/pagina_principale...

l'esempio l'ho preso da wikipedia, dove sta richiedendo la pagina "Pagina_principale" nella cartella "wiki"

"Connection: Keep-Alive" lo scrivi come lo vedi scritto adesso, e vuol dire che stai richiedendo di mantenere attiva la connessione

lesto:

che vuole dire wiki/pagina_principale...

l'esempio l'ho preso da wikipedia, dove sta richiedendo la pagina "Pagina_principale" nella cartella "wiki"

"Connection: Keep-Alive" lo scrivi come lo vedi scritto adesso, e vuol dire che stai richiedendo di mantenere attiva la connessione

devi scirvere cosi quindi??

Serial.println("connected");
client.println("GET /wiki/pagina_principale/1.1");
client.println(Connection: Keep-Alive);

no

("GET /wiki/pagina_principale/1.1");

è errato. Scritto giusto sarebbe:

("GET /wiki/pagina_principale HTTP/1.1");

get è il tipo di richiesta (esiste anche la post)
/wiki/pagina_principale è il percorso e nome della pagina. Se manca il nome della pagina o la sua estensione, normalmente i server HTTP aggiungono una di default (solitamente index per le pagine, html per l'estensione, ma spesso si modificano in base alle esigenze)
HTTP/1.1 è il protocollo di comunicazione utilizzato.

edit: anche

client.println(Connection: Keep-Alive);

è errato, giusto sarebbe:

client.println("Connection: Keep-Alive");

ma credo che questa sia una svista :slight_smile:

comunque per testare questi comandi prova via telnet a collegarti a un server http (per esempio arduino.cc) e scrivere a mano qualche richiesta GET..
dato che in telnet non si può cancellare (ogni tasto premuto è subito inviato) conviene prepararsi il comando in blocco note e poi fare copia-incolla