gpt4 book ai didi

java - 从 java 读取 Arduino 上的 LED 状态

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:08 25 4
gpt4 key购买 nike

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

我发送“打开/关闭!”来 self 的 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 会亮起,并且该消息会出现在网页中。

最佳答案

这里有两个问题:

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

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

    b.在调用 client.stop(); 之前设置延迟;

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

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


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

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

关于java - 从 java 读取 Arduino 上的 LED 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18513251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com