problema connessione

salve, vorrei controllare la connessione di un client con questo codice:

int ledpinc = 7;
int Clock = millis();
int IntervalloPing = 60000;//ogni  minuto controlla se c'è connessione
int TempoAttesa= 10000; //Attesa ping

void setup()

pinMode(ledpinc,OUTPUT);//output del led


void loop()
       {
        if (IntervalloPing > millis() - Clock) 
        Serial.println("millis");
            {
             client.println("POST /Ping");//invia il comando Ping;
             client.println();
             TempoAttesa = millis(); }
        if (TempoAttesa > millis() + 60000) { //impostato a 60 secondi
        String readstring;
        if (readstring.indexOf("Pong") == 6 ) {
        digitalWrite(ledpinc,LOW);
        } 
        else {
              digitalWrite(ledpinc,HIGH);

              }
          }

Purtroppo non riesco a venirne fuori!!! Qualcuno mi può dare una dritta??? grazie

Serial.println("millis"); messa subito sotto all'If credo che sia interpretata come l'unica istruzione del ciclo If stesso. Poi il check sul tempo trascorso ti funzionerà solo la prima volta dato che l'impostazione di Clock l'hai messa fuori dal loop().

Infine... che problemi ti da? Mica siamo indovini :*

grazie della risposta, ma penso di aver sbagliato l'impostazione del programma;se devo controllare la connessione da server dovrò agire in questo modo: da client mando una POST ogni tot secondi; se server per un tempo maggiore dell'intervallo impostato non riceve la POST da client, allora e solo allora accenderà il led. Infatti l' errore è proprio quello di voler inviare al client un comando (Ping) che non riceverà mai, essendo appunto un cient. Che ne pensi? Dove posso reperire qualche esempio per fare ciò??? Grazie, a presto

Non ho mai usato uno shield ethernet per cui non so come gestire queste cose: aspettiamo l'aiuto di qualcun altro. Qui però mi sa che devi prima fare un po' di pratica con cose più semplici e migliorare il tuo livello di programmazione, senza offese eh XD

up

manca la parte di connessione al server

Infatti l' errore è proprio quello di voler inviare al client un comando (Ping) che non riceverà mai, essendo appunto un cient.

??? client e server possono sia inviare che ricevere. l'unica differenza è che il server "ascolta" la rete in attesa di client. (quindi al momento della connessione)

Se stai usando il TCP, sappi che è una comunicazione persistente, quindi la classe client sa già se è connessa oppure no(in pratica quello che vuoi fare tu lo fa già il TCP), però non sono sicuro che sia stato implementato anche su arduino(però credo proprio di sì).

per il resto dovrebbe funzionare, salvo che durante i 60 secondi di attensa non vai a svuotare/leggere il buffer delle comunicazioni in arrivo da qualche altra parte.

Ciao fafidio, come vedi le risposte le si ricevono, basta pazientare e perderci un pò più di tempo per dare qualche risultato in più per agevolare le persone che vogliono aiutarti .

ti ho risposto anche in MP , se ti serve altro aiuto, posta qui ...CIAO!

probabilmente mi sbaglierò... ma mi chiedevo da questo codice: come fa readString ad essere comparato a 6? non mi sembra di aver visto codice che restituisce un qualsiasi valore alla variabile.

String readstring;
        if (readstring.indexOf("Pong") == 6 ) {

non sta comparando readStringa, ma il valore sestituito da indexOf("Pong") dato che è un messaggio POST che riceve, ha calcolato a priori dove inizierà la nuova stringa. Non un bel sistema, ma funzionale allo scopo

prendetemi per demente... ma c'ho capito poco. la cosa sembra "garbarmi", dovrò cercare info da san google...grazie per la pulce nell'orecchio lesto :D.

marbi nessuno nasce imparato.. ti consiglio di tenere sotto mano questa pagina, http://arduino.cc/en/Reference/HomePage

se guardi trovi String che ti spiega: http://arduino.cc/en/Reference/StringObject

in effetti se non conosci la programmazione ad oggetti una variabile che contiene funzioni può fuorviarti un po'...

lesto: marbi nessuno nasce imparato.. ti consiglio di tenere sotto mano questa pagina, http://arduino.cc/en/Reference/HomePage

se guardi trovi String che ti spiega: http://arduino.cc/en/Reference/StringObject

in effetti se non conosci la programmazione ad oggetti una variabile che contiene funzioni può fuorviarti un po'...

veramente "giochicchio da un bel pò di tempo con VB, che dovrebbe essere ad oggetti, e la sezione Reference mi ha dato una grandissima mano sin'ora, ma non sapevo di queste "sfaccettature" nelle variabili, e, come dici tu, nessuno nasce imparato:P

cmq è una guida da visionare tutta, non si sa mai, e grazie delle dritte, come sempre in questo sito trovo sempre le risposte "arduinistiche" che cerco :D

Marbi

Grazie per le numerose risposte; penso però che il problema sia di impostazione: il client effettua una Post ogni diciamo 10 secondi; una domanda: una funzione del genere va gestita con un delay o con millis? il sever deve solo controllare che il TempoAttesa non sia maggiore di 10 secondi; se ciò si verifica accende il led... Penso che questo "modo" semplifichi un po' le cose: chiedo aiuto a più esperto di me se posso gestire il tutto così...grazie e a presto!!!

il dalay blocca l'esecuzione del resto del codice, quindi direi che è assolutamente inadatta al tuo scopo

grazie lesto, infatti è con i millis che devo lavorare; ma che ne pensi di effettuare il controllo solo da server, evitando il ping-pong? Per me sarebbe più facile scrivere il codice con pochi casi da gestire, visto il mio livello sottozero :grin:... Accetto consigli......

esiste la funzione connected() che ti dice se sei connesso... http://arduino.cc/en/Reference/Ethernet

ciao, ma se implemento nel loop un if client.connected , vuol dire che faccio una connessione ogni loop (come i primi sketch che ti proponevo)? e che quindi saturavano la banda del mio router? Con la funzione ping risparmio risorse? Se dovrò usare ping, come mai ,utilizzando i due delay, la parte del codice relativa alla ricezione delle Post del client non mi funziona?

if client.connected , vuol dire che faccio una connessione ogni loop

no, con connect() ti connetti, con connected() sai se sei già connessio (o se è "caduta lal linea")

Con la funzione ping risparmio risorse?

se hai una connessione persistente (cioè sempre attiva, ma NON è il caso, perchè il client rimane connesso solo il tempo di inviare la get e ricevere risposta) allora connected() è la soluzione.

Nel tuo caso, o fai partire una connessione o fai un ping. Il ping occupa molte meno risorse, sia software che di banda.

Se dovrò usare ping, come mai ,utilizzando i due delay, la parte del codice relativa alla ricezione delle Post del client non mi funziona?

non ho capito, codice e qualche info in più?

ricapitolando: visto che il mio sketch si connette solo quando il pulsante cambia stato, conviene il ping diciamo ogni 10 secondi per sapere se il client è vivo oppure no.
Questo è il codice del server in cui, alla fine, controllo se connesso con la funzione ping e in caso il client non risponde mi accende un led sul server.
Il problema è che mi “gira” il programma del ping, ma il resto è come se non esistesse…

/*
 Web server preso dall'esempio dell'ide e modificato da me
 */

#include <SPI.h>
#include <Ethernet.h>
#include <WString.h>
#include <ICMPPing.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x3A, 0xA3 };
byte ip[] = { 192,168,0,107 };
byte pingAddr[] = {192,168,0,108}; // ip address to ping
// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
Server server(80);

int analogChannel = 5; //pin analogico dell LM35
int ledpinc = 7;
int ledpinb = 8;  //pin del led
int ledpin = 9; //pin del led
float tempC = 0;  //temperatura in gradi celsius
int ledstatus = 0;  //stato del led
int ledstatusb = 0;  //stato del led
SOCKET pingSocket = 0;
char buffer [256];


void setup()
{
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  pinMode(analogChannel,INPUT); //input dell' LM35
  pinMode(ledpin,OUTPUT); //output del led
  pinMode(ledpinb,OUTPUT); //output del led
  pinMode(ledpinc,OUTPUT);//output del led
  Serial.begin(9600);
}

void loop()
 {
 Client client = server.available();



  //leggiamo la temperatura
  tempC = (analogRead(analogChannel) * 4.88 * 100)/1024;
  // listen for incoming clients
  
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    String readstring;  //stringa per la lettura dal browser
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        readstring.concat(c);    //aggiunge c alla stringa;
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          readstring.concat('\0');
          //controllo su seriale
          Serial.println("stringa: ");
          Serial.println(readstring);
          Serial.print("indexOf(led=1): ");
          Serial.println(readstring.indexOf("led=1"));
          Serial.print("indexOf(led=0): ");
          Serial.println(readstring.indexOf("led=0"));
          
          if(readstring.indexOf("led=1") == 6){
            digitalWrite(ledpin,HIGH);
            ledstatus = 1;
            Serial.println("LED ON");  //controllo
          }
          if(readstring.indexOf("led=0") == 6){
            digitalWrite(ledpin,LOW);
            ledstatus = 0;
            Serial.println("LED OFF"); //controllo
          
        }
        
          
          if(readstring.indexOf("led=4") == 6){
            digitalWrite(ledpinb,HIGH);
            ledstatusb = 1;
            Serial.println("LED ON");  //controllo
          }
          if(readstring.indexOf("led=3") == 6){
            digitalWrite(ledpinb,LOW);
            ledstatusb = 0;
            Serial.println("LED OFF"); //controllo
          }

          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();
          //Creazione pagina web
          client.println("<html><head>");
          
          client.println("<title>Domotic-Arduino</title>");
          
          client.println("</head>");
          client.println("<body bgcolor=""black"" text=""white"">");
          
          client.println("<h1 align=""center"">Domotic-Home</h1><hr />");
          client.println("
");
          client.print("Temperatura interna : ");
          client.print((int)tempC);
          client.println(" C");
          client.println("

");
          client.println("<h3><a href=""/"">Aggiorna Sensore</a></h3>");
          client.println("
");
          client.println("<hr />");
          client.println("
");
          client.print("Comandi LED su pin ");
          client.println(ledpin);
          client.println("
");
          client.print("Stato LED :");
          if(ledstatus){
            client.println("<font color=""green""> ON</font>");
          }else{
            client.println("<font color=""red""> OFF</font>");
          }
          client.println("
");
          client.println("<h2><a href=""/?led=1"">ACCENDI</a> | <a href=""/?led=0"">SPEGNI</a></h2>" );
          client.println("
");
          client.println("<hr />");
          client.println("
");
          client.print("Comandi LED su pin ");
          client.println(ledpinb);
          client.println("
");
          client.print("Stato LED :");
          if(ledstatusb){
            client.println("<font color=""green""> ON</font>");
          }else{
            client.println("<font color=""red""> OFF</font>");
          }
          client.println("
");
          client.println("<h2><a href=""/?led=4"">ACCENDI</a> | <a href=""/?led=3"">SPEGNI</a></h2>");
          
          client.println("</body></html>");
          
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(50);
    // close the connection:
    client.stop();
  }
 { ICMPPing ping(pingSocket);
  ping(4, pingAddr, buffer);
  
  Serial.println(buffer);
    if(strcmp(buffer, "Request Timed Out") == 0)  // they match
{Serial.println("led");

   digitalWrite(ledpinc, HIGH);
       Serial.println ("request");
}
else
{
   digitalWrite(ledpinc, LOW);
}
  delay(3000);
}
}

Saranno i due delay??? Ciao lesto, a presto

nessuno mi dà una dritta????