Arduino Ethernet Shield connection to socket server

走远了吗. 提交于 2020-01-13 20:43:51

问题


I'm using an ethernet shield for Arduino to connect it to a socket server (different computer) so that I can receive messages from it to activate some routine. Here is my code:

#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 = "";
}

The problem is, when my server stops or is not available for some moments, I need my Arduino to keep on trying to connect to it until it is available again. But I can't make this work. I tried this:

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

But it doesn't work. It just prints "connection failed, trying again..." forever. How can I do this? Thanks!


回答1:


I'm assuming that the server in your PC is a normal java or c (or any other standard tcp server)

But your arduino client doesn't specify that it is TCP. So either change your server or the client(like in here - this uses wifi connection). If your server is in java, it could be like this:

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());}


来源:https://stackoverflow.com/questions/25450106/arduino-ethernet-shield-connection-to-socket-server

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!