richieste da LAN con GET

Ciao,
non riesco a uscire da un problema, ho necessità da remoto di vedere uno stato da arduino, e fino quà tutto ok, ho anche necessità di comandare un’uscita per un’attivazione, ok anche questo, ma se aggiorno la pagina dal browser, arduino mi attiva sempre l’uscita, cosa che non deve fare, deve fare solo alla pressione dell’apposito tasto…
Allego il codice:

  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
  BufferFiller bfill = ether.tcpOffset();      
  
  
    if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=manda") != 0)
    {
      
      digitalWrite(LED1PIN,HIGH);
      delay (200);
      digitalWrite(LED1PIN,LOW);
      
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=DISATTIVO") != 0)
    {
     
      digitalWrite(LED2PIN,HIGH);
      delay (200);
      digitalWrite(LED2PIN,LOW); 
    }
    
    
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
    "<html><head><title>ANTIFURTO CASA</title></head><body>"));  //scrive nella barra di explorer      
    bfill.emit_p(PSTR("</a>SISTEMA CONTROLLO ANTIFURTO CASA</p>")); 
    bfill.emit_p(PSTR("</a>***************************************</p>"));
    
    bfill.emit_p(PSTR("<body>Stato Antifurto: $S "
    "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
    "</body></html></p>"), statusLabel, buttonLabel, buttonLabel);
       
    bfill.emit_p(PSTR("</body></html>"));
    ether.httpServerReply(bfill.position());
    }

Con un sistema cosi elementare la maniera più semplice è inserire un meta tag di redirect nella pagina restituita con il paramento GET che punti alla pagina originale.
Guarda qua, e dicci se hai capito la procedura.
Ciao

RobertoBochet:
Con un sistema cosi elementare la maniera più semplice è inserire un meta tag di redirect nella pagina restituita con il paramento GET che punti alla pagina originale.
Guarda qua, e dicci se hai capito la procedura.
Ciao

Ciao, scusa ma credo di non aver capito, tu mi parli di redirect, ma cosa c'entra? Non capisco il collegamento con il mio problema, mi spiego meglio, forse ho scritto male, da remoto io accedo alla pagina creata da arduino per vedere dei dati, se i dati cambiano, devo aggiornare la pagina per vederli, in quel caso accade che mi viene attivato il comando di attiva/disattiva...
Scusami se non ho capito io, ma con html proprio ci capisco zero...

Avrai due url di riferimento, uno per ottenere la pagina html che raccoglie tutte le info, e una per inviare il comando di accensione o spegnimento
es arduino.html e arduino.html?status=on
Giusto?
In tal caso svolgono compiti diversi e la prima non dovrebbe poter modificare le impostazioni, quindi quello che accade ora non dovrebbe verificarsi.

Ciao,
si, ho capito cosa vuoi dire, però io non saprei proprio come farlo, chiedo troppo a chiedere un esempio? Ho comunque qualche dubbio sulla funzionalità, sarebbe da provare...
Grazie

Assolutamente lecito

void loop() {
	String httpRequest;
	client = server.available();
	if (client) {
		boolean currentLineIsBlank = true;
		while (client.connected()) {
			if (client.available()) {
				char c = client.read();
				httpRequest += c;
				if (c == '\n' && currentLineIsBlank) {
					if (httpRequest.indexOf(F("GET /js/control.js HTTP/1.1")) != -1) SendPage("text/javascript", "js/control.js");
					else if (httpRequest.indexOf(F("GET /css/control.css HTTP/1.1")) != -1) SendPage("text/css", "css/control.css");
					else if (httpRequest.indexOf(F("GET /css/style.css HTTP/1.1")) != -1) SendPage("text/css", "css/style.css");
					else if (httpRequest.indexOf(F("GET /favicon.png HTTP/1.1")) != -1) SendPage("text/html", "index.htm");
					else if (httpRequest.indexOf(F("GET / HTTP/1.1")) != -1) SendPage("text/html", "index.htm");
					else SendPage("text/html", "404.htm");
					break;
				}
				if (c == '\n') currentLineIsBlank = true;
				else if (c != '\r') currentLineIsBlank = false;
			}
		}
		delay(1);
		client.stop();
	}
}

Ti posto un esempio di un loop con un web server che accetta svariate pagine prelevate da un SD. Chiedi se hai dubbi il codice non è ancora commentato.

Ciao,
scusa, ma non riesco nemmeno a compilarlo, ho dichiarato qualche variabile, ma mi da errore sul client, sicuramente manca qlc, hai il codice completo? Però se utilizza la SD è un problema, non volevo utilizzarla, per quello ero rimasto sul GET, le cose da fare erano pochissime.....

Se non inizializzi il client ovvio che non compila XD la SD è un opzione che ho scelto io per il poco spazio disponibile sul ATmega, cerca di capire la logica di quello che ho fatto, è una richiesta come un altra focalizzati sugli if con indexof.
Ogni if gestisce una pagina diversa, rappresentata dalla funzione sendPage.

Ciao, ci ho smattato mezza nottata, ma non ne vengo a capo.... Ci rinuncio, cercherò un'altra soluzione funzionante da copiare...
ciao ciao :slight_smile:

Guarda che basta chiedere

char c = client.read();
httpRequest += c;
if (c == '\n' && currentLineIsBlank) {
  if (httpRequest.indexOf(F("GET /accendi HTTP/1.1")) != -1) 
  {
    //Accendo o spegno il sistema
  } else {
    //Invio la pagina HTML
  }
  break;
}
if (c == '\n') currentLineIsBlank = true;
else if (c != '\r') currentLineIsBlank = false;

In caso venga richiesta la pagina "/accendi" il micro esegue le suo procedure di avvio. In caso si richiesta la pagina base "/" vieni inviata la pagina.

Ciao,
quà c'è un problema di fondo... cercando ho trovato 2 modi per usare la lan, forse sono 2 librerie diverse, io vorrei avere un progetto funzionante, poi me lo modifico a piacere, ma quà non riesco a compilare nulla, ho trovato progetti col client come il tuo, dove oltre a non compilarlo, non trovo dove settare il CS della schedina LAN, nel mio programma è tutto settato in modo diverso, anche l'ip e il mac, quindi qualcosa cambia..... Se uso la tua parte di programma nei miei settaggi, mi da 1000 errori.....
Lo so che basta chiedere, ma poi si diventa noiosi, purtroppo il problema è mio, che voglio fare una cosa che non so, uff...

Allora, facciamo così, partiamo da un’altra parte… Allego questo sketch trovato in rete, che dovrebbe comandare 5 led; intanto potrebbe funzionare? Se si, questo programma viene compilato, ma non dialoga la shield ethernet, credo perchè non so come impostare il pin del CS…
Io utilizzo il pin 8; nel mio sketch per impostare l’ethernet faccio così:

static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};  //MAC DELLA SCHEDA ETHERNET
static byte myip[] = {192,168,1,100};                   //IP DELLA SCHEDA ETHERNET
byte Ethernet::buffer[700];   
if (!ether.begin(sizeof Ethernet::buffer, mymac, 8)) //pin CS ethernet, + controllo comunicazione
  myGLCD.print( "Accesso Ethernet fallito", CENTER,45);   //scrive sul display
 else
  myGLCD.print("Accesso Ethernet ok", CENTER, 45);          //scrive sul display

Ora nell’esempio trovato in rete è tutto diverso, dove posso impostare il CS???

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
byte ip[] = {192,168,1,100};
EthernetServer server(80);
String readString;
byte out_1 = 9;
byte out_2 = 10;
byte out_3 = 11;
byte out_4 = 12;
byte out_5 = 13;


void setup()
{
 Ethernet.begin(mac, ip);
 pinMode(out_1, OUTPUT);
 pinMode(out_2, OUTPUT);
 pinMode(out_3, OUTPUT);
 pinMode(out_4, OUTPUT);
 pinMode(out_5, OUTPUT); 
 
 Serial.begin(9600);          
}

void loop(){

EthernetClient  client = server.available();

 if (client) {
   boolean currentLineIsBlank = true;
 
   while (client.connected()) {
     if (client.available()) {
       char c = client.read();
       readString.concat(c);  
       if (c == '\n' && currentLineIsBlank) {
         Serial.print(readString);
             
       if(readString.indexOf("on_1") > 0) digitalWrite(out_1, HIGH);        
       if(readString.indexOf("off_1") > 0) digitalWrite(out_1, LOW);          
       if(readString.indexOf("on_2") > 0) digitalWrite(out_2, HIGH);        
       if(readString.indexOf("off_2") > 0) digitalWrite(out_2, LOW);          
       if(readString.indexOf("on_3") > 0) digitalWrite(out_3, HIGH);        
       if(readString.indexOf("off_3") > 0) digitalWrite(out_3, LOW);
       if(readString.indexOf("on_4") > 0) digitalWrite(out_4, HIGH);        
       if(readString.indexOf("off_4") > 0) digitalWrite(out_4, LOW);
       if(readString.indexOf("on_5") > 0) digitalWrite(out_5, HIGH);        
       if(readString.indexOf("off_5") > 0) digitalWrite(out_5, LOW);
       
       //  PAGINA HTML      
       client.println("HTTP/1.1 200 OK");
       client.println("Content-Type: text/html");
       client.println();
       client.print("<html><head><title>ARDUINO Controllo WEB</title><meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' ></head><body>");
       client.print("

");
     
       client.print("<span>STATO LUCE 1 </span>");
       if (digitalRead(out_1)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
       else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
       client.print("<p><p/>");  
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_1'\">");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_1'\">");                  
       client.print("<p><p/>");
       
       client.print("<span>STATO LUCE 2 </span>");      
       if (digitalRead(out_2)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
       else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");      
       client.print("<p><p/>");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_2'\">");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_2'\">");
       client.print("<p><p/>");
       
       client.print("<span>STATO LUCE 3 </span>");
       if (digitalRead(out_3)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
       else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
       client.print("<p><p/>");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_3'\">");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_3'\">");        
       client.print("<p><p/>");
       
       client.print("<span>STATO LUCE 4 </span>");
       if (digitalRead(out_4)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
       else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
       client.print("<p><p/>");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_4'\">");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_4'\">");        
       client.print("<p><p/>");
       
       client.print("<span>STATO LUCE 5 </span>");
       if (digitalRead(out_5)== true) client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"ON\" STYLE=\"background-color:#00FF00\"/>");  
       else client.print("<input disabled=\"disabled\" maxLength=\"50\" size=\"12\" value=\"OFF\" STYLE=\"background-color:#C0C0C0\"/>");
       client.print("<p><p/>");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"On\" onclick =\" location.href='/?on_5'\">");
       client.print("<input type=\"button\" style=\"width:120px; height:80px\" value=\"Off\" onclick =\" location.href='/?off_5'\">");
       client.println("</body></html>");
       
       readString="";
       
       delay(1);
       client.flush();
       client.stop();
       }
     }
   }
 }
}

Questo è lo sketch completo… Credo che sia simile a quello da te postato, se riesco a capire perchè non va, forse poi posso passare a capire il resto che realmente mi interessava…
Scusa di nuovo
un saluto

Ma tu usi la Ethernet shield originale Aduino?

RobertoBochet:
Ma tu usi la Ethernet shield originale Aduino?

no, uso questa:

http://www.ebay.it/itm/Modulo-Ethernet-ENC28J60-LAN-Arduino-PIC-shield-module-SPED-IN-GIORNATA-/111646682619?hash=item19fea92dfb

se aggiorno la pagina dal browser, arduino mi attiva sempre l'uscita, cosa che non deve fare

Perchè sulla barra dell’indirizzo del browser hai sempre il comando attivo dell'ultima get inviata ... non puoi farci nulla se usi il metodo GET, usa il POST cerca qualcosa con "arduino post ENC28J60"

Auguri, con quella ethernet non vai molto lontano.

ciao

Quello non è un prodotto nativamente supportato da Arduino. Dovrai fare riferimento al suo datasheet o procurarti una libreria e documentazione di terzi specifica per il prodotto in questione.

pablos:
Perchè sulla barra dell’indirizzo del browser hai sempre il comando attivo dell'ultima get inviata ... non puoi farci nulla se usi il metodo GET, usa il POST cerca qualcosa con "arduino post ENC28J60"

Auguri, con quella ethernet non vai molto lontano.

ciao

Ciao, grazie, cercherò qualcosa con post, perchè mi dici così di questa ethernet? cos'ha che non va? Nemmeno per cose così semplici come quella che sto facendo? L'unica è quella ori di arduino allora?
ciao, grazie

Finora ho usato gli esempi di Lucadentella, tutti funzionanti, non ho avuto problemi con questa shield, magari in futuro proverò anche quella 5100 di arduino... Ho cercato un po' degli esempi con POST, ma non ho trovato nulla, se qualcuno sa come fare, e gentilmente mi facesse una riga di esempio, ne sarei grato...
Grazie a tutti

Bhe se l'hai comprata immagino che tu abbia fatto una scelta ponderata con ricerche e confronti ... su google c'è un bel po' di documentazione sulle differenze e non riguarda solo il prezzo. Una cosa è certa, un oggetto che costa 100 non significa che valga 100, ma lo stesso oggetto che costa 5 può davvero essere il suo valore.

Il GET o il POST hanno poco/nulla a che fare con arduino o il C/C++, è solo una questione di formattazione delle richieste http che avvengono tramite invio di char al client, se non esiste un protocollo già fatto puoi sempre creartelo interpretando correttamente i dialoghi.

Penso che l'ENC l'abbiano comprata Dentella e altri 9.
9 l'hanno buttata e Dentella continua a farci tutorial ahahahhaha

pablos:
Bhe se l'hai comprata immagino che tu abbia fatto una scelta ponderata con ricerche e confronti ... su google c'è un bel po' di documentazione sulle differenze e non riguarda solo il prezzo. Una cosa è certa, un oggetto che costa 100 non significa che valga 100, ma lo stesso oggetto che costa 5 può davvero essere il suo valore.

Il GET o il POST hanno poco/nulla a che fare con arduino o il C/C++, è solo una questione di formattazione delle richieste http che avvengono tramite invio di char al client, se non esiste un protocollo già fatto puoi sempre creartelo interpretando correttamente i dialoghi.

Penso che l'ENC l'abbiano comprata Dentella e altri 9.
9 l'hanno buttata e Dentella continua a farci tutorial ahahahhaha

Ciao,
ahahhahahhaha, azzo, ne parli proprio bene allora :smiley: Non è un problema di prezzo, posso comprare anche l'altra, sperando di trovare un esempio funzionante, e di non ritrovarmi con i soliti problemi che ho ora, in fondo mi interessa solo questo, non è che volevo farci chissachè....
Proverò ancora :slight_smile:
grazie