http response header

Salve,
ho scritto una bozza di codice che mi permtte di accendere un led da una pagina web in ajax.
La pagina javasript contiene questa funzione che si appoggia alla libreria prototype per inviare la richiesta http

function ActiveLED(valore){
	
	stringa = valore;

	myxhr = new Ajax.Request("http://192.168.1.177",{														
		
		parameters : stringa,
		encoding:'utf-8',
		method:'GET',
		onSuccess: function(transport){
			  
			var risultato_generale = transport.responseText;

						
				document.getElementById('operazione_in_corso').innerHTML = risultato_generale;

					
    	},
	
	
		onFailure : function(transport){ 

			alert(transport.status);
			document.getElementById('operazione_in_corso').innerHTML = "Errore";

		},
	
	
		onTimeout : function(transport){ 

			document.getElementById('operazione_in_corso').innerHTML = "Timeout";

		},
	
	
		timeoutDelay : 100000
	
	
	});
	

	return false;
	
}

invece il codice che ho scritto per arduino è questo

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 177 };

int ledPinStart = 7;

String readString;
int StatusLed;

Server server(80);

void setup()
{
  readString = String("");
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(ledPinStart, OUTPUT);
}

void loop()
{

  Client client = server.available();
  if (client) {
    boolean currentLineIsBlank = true;

    while (client.connected()) {

      if (client.available()) {

        char c = client.read();

        readString += c;

        if (c == '\n') {

          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
  
          if (readString.indexOf("MYLED=2") > 0){
          
            if (digitalRead(ledPinStart) == 1){
            
                  digitalWrite(ledPinStart, LOW);
            
            }else{
              
                  client.print(" LED GIA' SPENTO ");
                  client.println("
");
              
            }
            
          }else
          
          if (readString.indexOf("MYLED=1") > 0){
          
            if (digitalRead(ledPinStart) == 0){
            
                  digitalWrite(ledPinStart, HIGH);
            
            }else{
              
                  client.print(" IL LED GIA' ACCESO ");
                  client.println("
");
            
            }
            
          }
          

          
          //server.write(client.read());
          StatusLed= digitalRead(ledPinStart);
          client.println(StatusLed);
          
          break;
        }

      }
    }

    delay(1);
    client.stop();
    readString = "";

  }
}

il tutto funziona, infatti se invio la richiesta in ajax, arduino ottiene la stringa in get che gli passo ed esegue quello che voglio io.
Fatto ciò vorrei che l’output che creo su arduino, venga ritornato alla pagina web. Il problema è che per ajax la richiesta http non è andata a buon fine. Se controllo lo status della richiesta http non è a 200 ma a 0, quindi per ajax la richiesta non è andata a buon fine e non si prende alcun output.

come potre risolvere secondo voi??

un’altra domanda veloce ma a che serve server.write();??

grazie mille

visto che ti stai collegando via ajax, non è meglio se usi i socket, così non hai lo sbatti del protocollo http? comunque credo che la risposta di arduino non sia corretta. prova a fingere una get via telnet, e poi confronta con una get fatta ad un server tipo google.

effettivamente avevo pensato ad utilizzare i socket, anche perchè se due persone in conteporanea stanno visualizzando la pagina web, non visualizzano lo stato del led in tempo reale. Ad esempio se una persona spegne il led, l'altra persona continua a vedere lo stato attivo. Sarebbe bello che lo stato venisse aggiornato automaticamente a tutti i client collegati.

Però non ho idea di come utilizzare le socket... sapresti consigliarmi dei link, documentazioni, esempi dove prendere spunto, perchè ho cercato su internet ma sono entrato in confusione.

dato che arduino ha risorse limitate, piuttosto che una connessione per ogni utente credo sia meglio che sia arduino a fare da client. guarda l'esempio telentClient, o se vuoi continuare a usare HTTP WebClient: ogni volta che cambia un ingresso, arduino si collega alla pagina inviando una richiesta get (se http) o un codice inventato da te, se socket, e i dati vengono salvati su un file. ogni client a questo punto legge i dati dal file, ora non so se ajax riesce ad accorgersi che un file lato server è stato modificato, al massimo metti un refresh automatico della pagina ogni tot secondi ;)

Per capire cosa sono i socket, in pratica telnet si interfaccia direttamente con un socket TCP... in pratica l'unico standard nel caso di socket TCP o UDP è l'uso di caratteri dalla tabella ascii

innanzitutto grazie mille per il tempo che mi stai dedicando, inizialmente volevo installare un webserver su arduino cosi da far collegare direttamente i client ad arduino, però da quando ho letto in giro è troppo macchinosa l'installazione di un web server).. poi ho pensato alla soluzione che anche tu mi hai proposto adesso, però in questo caso è arduino a comunicare lo stato su un file xml o di testo che sia ma come soluzione mi sembra un po sporca... quello che mi chiedevo io e se c'è un modo per far si che i client si connettono direttamente ad arduino, comunicano con esso attraverso socket e al tempo stesso restano in ascolto di una porta , e ogni volta che avviene un cambiamento questo viene comunicato a tutti i client collegati.

c’è il codice di esempio Ethernet->WebServer che rende l’arduino un server HTTP a cui ci si può collegare direttamente.
Però accetta un client alla volta: nulla di troppo complicato, basta che anzichè avere una variabile Client si abbia un array Client.

purtroppo per l’aggiornamento in HTTP non si può fare, deve essere il client a richiedere la pagina aggiornata. L’unica è usare i socket, e la pagina html contiene un programma javascript o qualchelè che fa collegare il client via socket (in pratica telnet) all’arduino.

Questo perché in teoria l’http è nato per inviare contenuti statici, mentre il TCP è per flussi dati

edit: usando i socket puoi creare un’architettura p2p: se l’arduino ha troppe connessioni, e arriva un nuovo client A, arduino invia semplicemente l’ip di un’altro dei client connesso B. A quindi si collega a B per richiedere i dati. La cosa funziona solo se il client B è senza firewall, l’UPNP è molto comodo in questo frangente… ma si tratta un discorso un poco complicato :slight_smile:

e come faccio a collegarmi via socket in javascript, se non sbaglio non credo si possa fare

hai ragione, esistono però altri metodi http://www.webdeveloper.com/forum/showthread.php?t=68045