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 がオンになり、メッセージが Web ページに表示されます。

4

3 に答える 3

1

ここには 2 つの問題があります。

  1. InputStream を取得するときに例外がスローされた場合は、その時点で接続が閉じられているために発生しています。これは、Arduino がメッセージを送信してすぐにクライアントを「閉じ」、接続を効果的に終了したために発生します。次の 3 つのことを行うことができます。

    a. connect() を呼び出す前に入力ストリームを作成してみてください。ただし、その時点で接続が存在しないために失敗する可能性があります。

    b. 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

この男がここで言っいるように、Arduino は HTML ページを提供できるので、私の HttpURLConnection はこれについて知っているに違いないと推測しました。ここでは、「HTTP メッセージのバージョンは、メッセージの最初の行の HTTP-Version フィールドによって示されます」と述べています。

そのため、確認した直後に、次のコードを Arduino スケッチに追加しました (c == "\n"):

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

私はすぐにこれにたどり着きませんでしたが、他の人のコードと上記のリソースを読んだ後、この結論に達しました. 私が知っている限り、説明は間違っている可能性もありますが、うまくいき、私のプロジェクトは実行されます。

于 2013-08-29T22:37:13.920 に答える