socket con comunicacion sockets tcp arduino ethernet

sockets - con - arduino tcp ip



Arduino Ethernet Shield connection to socket servidor (1)

Supongo que el servidor de tu PC es una Java o C normal (o cualquier otro servidor tcp estándar)

Pero su cliente arduino no especifica que sea TCP. Entonces, cambie su servidor o el cliente (como aquí , esto usa conexión wifi). Si su servidor está en Java, podría ser así:

int port=9999; try{ System.out.println("Starting server..."); ServerSocket ss=new ServerSocket(port); Socket clientSocket=ss.accept(); System.out.println("Connection has been established..."); PrintWriter out=new PrintWriter(clientSocket.getOutputStream(),true); BufferedReader br=new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; System.out.println("Listening....."); while((inputLine=br.readLine())!=null) System.out.println(inputLine); }catch(Exception e){System.out.println(e.getMessage());}

Estoy usando un escudo de Ethernet para Arduino para conectarlo a un servidor de socket (computadora diferente) para que pueda recibir mensajes de él para activar alguna rutina. Aquí está mi código:

#include <Ethernet.h> #include <SPI.h> byte mac[] = { 0x90, 0xA2, 0xDA, 0x0F, 0x5A, 0x21 }; byte ip[] = { 192,168,1,11 }; //ip shield byte server[] = { 192,168,1,7 }; // ip server EthernetClient client; String readString; int ledPins[] = {19, 17, 2,3, 5, 6, 7, 8, 9}; // leds pins int pinCount = 8;// number of leds int const PINEYES = 9; //pin for different led int const TIMERLEDS = 1000; int const TIMERTOOFF= 3000; //-------------------------------------------------------------------------- void setup() { turnOffLeds(); Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect(server, 1400)) { Serial.println("connected"); client.println(); } else { Serial.println("connection failed"); } pinMode(PINEYES, OUTPUT); int thisPin; for (int thisPin = 0; thisPin < pinCount; thisPin++) { pinMode(ledPins[thisPin], OUTPUT); } } //-------------------------------------------------------------------------- void loop() { if (client.available()) { char c = client.read(); if (readString.length() < 30) { if(c!=''|'') readString.concat(c); else { client.flush(); //if (readString == "START_SENSATIONS") { if (readString == "on") { Serial.println("recebi"); client.stop(); turnOnMaya(); } resetString(); } } Serial.println(readString); } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); client.stop(); for(;;) ; } } //-------------------------------------------------------------------------- void turnOnMaya(){ turnOnLeds(); for (int thisPin = 0; thisPin < pinCount; thisPin++) { delay(TIMERLEDS); digitalWrite(ledPins[thisPin], LOW); } turnOnEyes(); delay(TIMERTOOFF); turnOffLeds(); digitalWrite(PINEYES, LOW); client.connect(server, 1400); } //-------------------------------------------------------------------------- void turnOnLeds(){ for (int thisPin = 0; thisPin < pinCount; thisPin++) { digitalWrite(ledPins[thisPin], HIGH); } } //-------------------------------------------------------------------------- void turnOffLeds(){ for (int thisPin = 0; thisPin < pinCount; thisPin++) { digitalWrite(ledPins[thisPin], LOW); } } //-------------------------------------------------------------------------- void turnOnEyes(){ digitalWrite(PINEYES, 255); } //-------------------------------------------------------------------------- void resetString() { readString = ""; }

El problema es que cuando mi servidor se detiene o no está disponible por algunos momentos, necesito que mi Arduino siga intentando conectarse hasta que esté disponible nuevamente. Pero no puedo hacer que esto funcione. Intenté esto:

while(!client.available()){ Serial.println("connection failed, trying again..."); client.connect(server, 1400); delay(1000); }

Pero no funciona. Simplemente imprime "la conexión falló, intentando nuevamente ..." para siempre. ¿Cómo puedo hacer esto? ¡Gracias!