我的项目涉及从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会亮起,并且网页上会显示该消息。
答案 0 :(得分:1)
这里有两个问题:
如果在获取InputStream时抛出异常,则会发生这种情况,因为此时连接已关闭,这是因为Arduino发送消息然后立即“关闭”客户端,从而有效地终止连接。你可以做三件事:
一个。在调用connect()之前尝试创建输入流,但由于此时不存在连接,这很可能会失败。
湾在调用client.stop();
之前加一个延迟℃。 (推荐)让客户端关闭连接,不要在服务器上执行此操作。
尝试在Arduino代码中的client.print()方法中在ON和OFF之后添加\ n。
client.print("ON\n");
...
client.print("OFF\n");
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();
我没有很快达到这个目标,但在阅读了上面提到的其他代码和资源后,我得出了这个结论。对于我所知道的一切,解释可能都是错误的,但它确实有效,我的项目也在运行。