从java读取Arduino上的LED状态

时间:2013-08-29 14:08:34

标签: java arduino

我的项目涉及从java读取Arduino上LED的状态。它将继续从Arduino读取温度,但我卡住了。所以这就是:

我发送“打开/关闭!”来自我的java程序的消息,我希望它显示LED是否打开和关闭。 因此,当我发送“192.168.0.100/ON”时,LED亮起,我在程序中收到“ON”消息。

Arduino上的代码:

byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x2F, 0xD4 };
IPAddress ip(192,168,0,100); 
EthernetServer server(80);
String message = String(30);

void setup()
{
  pinMode(2, OUTPUT);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.begin(9600);
}

void loop()
{
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    // an http request ends with  a blank line
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        if (message.length() < 30) {
          message += c;
        }

        Serial.print(message);
        // 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') {

          if (message.indexOf("ON") > 0) {
            digitalWrite(2, HIGH);
            client.print("ON");
          }
          if (message.indexOf("OFF") > 0) {
            digitalWrite(2, LOW);
            client.print("OFF");
          }

          message = "";
          client.stop();
        }      
      }
    }
    // give the web browser time to receive the data
    delay(1);
  }
}

java中的代码:

public class TestClient {

public static void main(String[] args) {

    HttpURLConnection connection = null;
    BufferedReader serverResponse = null;
    try {
        // OPEN CONNECTION
        connection = (HttpURLConnection) new URL("http://192.168.0.100/ON")
                .openConnection();

        connection.connect();

        // RESPONSE STREAM
        serverResponse = new BufferedReader(new InputStreamReader(
                connection.getInputStream()));

        // READ THE RESPOSNE
        String line;
        while ((line = serverResponse.readLine()) != null) {
            System.out.println(line);
        }
    } catch (MalformedURLException mue) {
        mue.printStackTrace();
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } finally {
        if (connection != null)
            connection.disconnect();

        if (serverResponse != null) {
            try {
                serverResponse.close();
            } catch (Exception ex) {
            }
        }
    }
}

}

会发生什么:LED亮起,但我在java中遇到此错误:

java.net.SocketException: Unexpected end of file from server at TestClient.main(TestClient.java:23) -> connection.getInputStream();

我想要的:发送“开启”信息后,应该在控制台中打印。

提及:如果我从浏览器发送192.168.0.100/ON,则LED会亮起,并且网页上会显示该消息。

3 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 如果在获取InputStream时抛出异常,则会发生这种情况,因为此时连接已关闭,这是因为Arduino发送消息然后立即“关闭”客户端,从而有效地终止连接。你可以做三件事:

    一个。在调用connect()之前尝试创建输入流,但由于此时不存在连接,这很可能会失败。

    湾在调用client.stop();

    之前加一个延迟

    ℃。 (推荐)让客户端关闭连接,不要在服务器上执行此操作。

  2. 尝试在Arduino代码中的client.print()方法中在ON和OFF之后添加\ n。

    
    client.print("ON\n");
    ...
    client.print("OFF\n");
    

  3. readLine()将读取,直到第一个从未出现的行尾字符。

答案 1 :(得分:0)

尝试颠倒finally块中的顺序。关闭套接字之前关闭输入流。

答案 2 :(得分:0)

正如this这里所说的那样,Arduino可以提供HTML页面,所以我猜想我的HttpURLConnection必须知道这一点。 Here,它说“HTTP消息的版本由消息的第一行中的HTTP-Version字段指示。”

所以我在检查后立即将以下代码添加到Arduino草图中(c ==“\ n”):

client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

我没有很快达到这个目标,但在阅读了上面提到的其他代码和资源后,我得出了这个结论。对于我所知道的一切,解释可能都是错误的,但它确实有效,我的项目也在运行。