Ethernet consiglio e dilemma

Salve a tutti, mi sono avvicinato ad arduino da qualche mese. Attualmente ho un paio di dubbi e problemi con l'ethernet shield (credo di tipo software). Sono abbastanza pratico con Java (anche se non con programmi di questo tipo..) e sto sviluppando un software per controllare 4 motori (velocità e direzione) il programma l'ho testato (in versione ridotta: un solo motore) e funziona. Il problema è che volevo fare così:

1)Client java per controllare i motori (comunica attraverso la porta 8888 ed è sempre connesso ad arduino), questa connessione è perenne e mi serve anche come debug, se si sconnette per più di un minuto arduino attiva un "funzione" d'emergenza;
2)Client http(porta 80): arduino stampa i valori dei pin analogici ogni tot secondi su pagina web;

I due client funzionano da soli, ma quando cerco di unirli nello stesso sketch ho problemi. Credo il problema (ed effettivamente ha senso :slight_smile: ) sia che non è possibile avere due server su arduino (uno che comunica con la porta 80 e uno con la porta 8888) contemporaneamente attivi. Sto usando la libreria Ethernet. Ditemi se serve postare il codice arduino. (comunque una volta finito il programma java, lo condividerò con piacere con altri interessati :wink: )

Grazie per le eventuali risposte.

Io ho sia webserver che webclient nello stesso sketch.
in realtà comunico con il server con EthernetUDP sulla 8888 e ricevo richieste sulla 80, ma sono due funzioni ben distinte, prima ne faccio una la chiudo e poi faccio l'altra e la chiudo.

stai usando UDP o HTTP (client.println("GET /************ HTTP/1.0"))per trasmettere al server?
in teoria dovrebbe funzionare nello stesso sketch eseguendone uno alla volta

ciao

Grazie mille per la risposta. Si ho notato che uno alla volta funziona. A me servirebbe invece far funzionare tutti e due contemporaneamente. Cioè mentre è connesso il client java, ogni tot secondi far partire quello http. Per l'http sto usando direttamente l'esempio WebServer (che scrive i valori dei pin analogici) e una versione modificata del webserver per comunicare (sia in ricezione che in trasmissione) sulla porta 8888. Il problema è che il client sulla porta 8888 lo vorrei sempre connesso e mettere all'interno del secondo client, il primo. Non so se si è capito :). E' Possibile?

Quando dici non funziona, cosa intendi? lo sketch da errore di compilazione o si inchioda la ethernet? e non fa nulla?

no nessun errore di compilazione è solo che quando mi connetto con il client java il client http non riesce più a comunicare con arduino. se hai presente l’esempio webserver in pratica non riesce a refreshare la pag dopo la prima volta.

Questo è il codice (il serverControlloMotori è quello che comunica con il java client):

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

// Enter a MAC address, IP address and Portnumber for your Server below.
// The IP address will be dependent on your local network:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xFA, 0xAA };
String analogicPinFunctions[6] = {"Profondità: ", "Batteria : ", "Temperatura: ", "Umidità: ", "Pressione: ", "Umidità2: "};
IPAddress serverIP(192,168,1,4);
int serverPort=8888;

// Initialize the Ethernet server library
// with the IP address and port you want to use
EthernetServer serverControlloMotori(serverPort);
EthernetServer serverAnalogico(80);

void setup()
{
  // start the serial for debugging
  Serial.begin(9600);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, serverIP);
  serverControlloMotori.begin();
  serverAnalogico.begin();
  pinMode(6, OUTPUT);
  Serial.println("Server started");//log
}

void loop()
{
  // listen for incoming clients
  EthernetClient clientControlloMotori = serverControlloMotori.available();
  EthernetClient clientAnalogico = serverAnalogico.available();
  if (clientControlloMotori) {
   
    int clientMsg =0;
    while (clientControlloMotori.connected()) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    
    while (clientAnalogico.connected()) {
      if (clientAnalogico.available()) {
        char c = clientAnalogico.read();
        // 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) {
          // send a standard http response header
          clientAnalogico.println("HTTP/1.1 200 OK");
          clientAnalogico.println("Content-Type: text/html");
          clientAnalogico.println();
          clientAnalogico.println("<meta http-equiv=\"refresh\" content=\"5\">");

          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            clientAnalogico.print(analogicPinFunctions[analogChannel]);
            clientAnalogico.print(analogRead(analogChannel));
            clientAnalogico.println("
");
          }
          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(1);
    clientAnalogico.stop();
    if(clientControlloMotori.available()==2){
        int c = clientControlloMotori.read();
         
        //if the command is the HANDSHAKE
        if(c==1){
        int p = clientControlloMotori.read();  
        Serial.println("HandShake from client");//print it to the serial
        clientControlloMotori.println("Salve Java Client");//modify the string and send it back
        clientMsg=0;
        }
        if(c==2)
        {
          int p = clientControlloMotori.read();
          Serial.print("Modifica velocità motore Dx: ");
          Serial.println(p);
          analogWrite(6, p);
          clientControlloMotori.println("Modifica Riuscita!");
          delay(20);
        }
        if(c==3)
        {
          int p = clientControlloMotori.read();
          Serial.println(p);
          Serial.println("Staccare connessione");
          clientControlloMotori.println("Connessione Chiusa");
         
         }
      }
     }
     delay(1);
    // close the connection:
     clientControlloMotori.stop();
    
    
  }

Ora è più chiaro?

Ho guardato il codice al volo e mi sa che qui

clientAnalogico.println("HTTP/1.1 200 OK");

c'è il primo problema, se il client web ti fa una persistent connection non esci più dal loop, prova ad usare
clientAnalogico.println("HTTP/1.0 200 OK");


che non prevede le connessioni permanenti ma ne fa una per ogni richiesta.

Alberto

Ti ho scritto se si inchioda la ethernet, perchè secondo me il buffer limitato del chip non ce la fa.

grazie per la prima dritta. A proposito c'è un sito dove posso trovare queste informazioni? le varie inizializzazioni http?
Comunque ho fatto un pò di debug prima di postare sul forum il programma. In pratica la prima volta che connetto il java client tutto va bene. Ma dopo i 5 secondi (quando dovrebbe refreshare la pagina html) il programma di controllo motori continua a funzionare tranquillamente mentre il client http non riesce più a comunicare (in pratica il clientAnalogico.connected() restituisce 0). Se dal java client faccio disconnect (funzione che chiudo il socket) e subito dopo riconnect (tasto che inizializza e connette il socket) allora riesce il refresh della pagina html e mi restituisce arduino i valori dei pin analogici (tutto ok quindi). Il vero problema è che non riesco mentre il java client rimane connesso a refreshare la pagina html per vedere i nuovi valori dei sensori. Grazie a tutti per l'aiuto

Scusa pablos ho letto ora. Sembra di no. Perchè il java client riesce a continuare tranquillamente senza problemi mentre la pagina html tenta il refresh senza riuscirci... aspetta che controllo il messaggio di errore

Ecco l'errore che mi dà la pagina html (uso google chrome) Errore 101 (net::ERR_CONNECTION_RESET): La connessione è stata reimpostata.