1

我的项目涉及从 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();

我想要什么:发送“ON”消息后,应该在控制台中打印。

提一下:如果我从浏览器发送 192.168.0.100/ON,LED 会亮起并且消息会出现在网页中。

4

3 回答 3

1

这里有两个问题:

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

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

    湾。在调用 client.stop(); 之前延迟

    C。(推荐)让客户端关闭连接,不要在服务器上这样做。

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

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

readLine() 将读取直到永远不会出现的第一个行尾字符。

于 2013-08-29T15:26:57.620 回答
0

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

于 2013-08-29T14:32:32.697 回答
0

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

所以我只是在检查 (c == "\n") 之后将以下代码添加到 Arduino 草图中:

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

我没有很快得到这个,但是在阅读了别人的代码和我上面提到的资源之后,我得出了这个结论。据我所知,这个解释也可能是错误的,但它奏效了,我的项目运行了。

于 2013-08-29T22:37:13.920 回答