从 Java 服务器向 ESP8266 发送数据
Sending data from Java server to ESP8266
这是我第一次 post 在这里,如果我有任何错误,请多多包涵...
好的,所以我只是想在我的计算机上安装一个 Java 程序 运行ning 将信息发送到 ESP8266 运行ning arduino 软件。首先,这是代码。
ESP8266(Arduino):
#include <ESP8266WiFi.h>
#define NAME "********"
#define PASS "********"
const char* host = "192.168.1.6";
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.println();
WiFi.begin(NAME, PASS);
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
if (client.connect(host, 9090)) {
Serial.print("Connected to: ");
Serial.println(host);
String data = "No Message";
client.print("ESP8266 connected!");
if(client.available()) {
data = client.readStringUntil('\n');
}
Serial.print("Host message: ");
Serial.println(data);
client.stop();
} else {
client.stop();
}
}
void loop() {
}
Java 服务器:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket listener = new ServerSocket(9090);
try{
while(true){
Socket socket = listener.accept();
socket.setKeepAlive(true);
try{
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("Hello from Java!\n");
} finally {
socket.close();
}
}
} finally {
listener.close();
}
}
}
问题是 client.available() 永远不会 returns 为真,即使 Java 服务器向客户端发送信息也是如此。我试过将数据从 Arduino 发送到服务器,效果很好。我还制作了一个快速 Java 程序,它可以 运行 作为客户端,并 运行 在网络上的另一台计算机上运行。本例中的 Java 服务器和客户端通信正常。所以问题出在 Arduino 的某个地方,但我不知道它是什么。
您的那部分代码属于 loop()
事件:
if (client.connect(host, 9090)) {
Serial.print("Connected to: ");
Serial.println(host);
String data = "No Message";
client.print("ESP8266 connected!");
if(client.available()) {
data = client.readStringUntil('\n');
}
Serial.print("Host message: ");
Serial.println(data);
client.stop();
} else {
client.stop();
}
setup()
函数仅 运行 一次。在它移动到 loop()
并停留在那里之后。而你的 loop()
函数是空的...
我遇到了同样的问题,这是我的解决方案:
Java 仅在添加 out.flush() 时更新输出流;在 out.write();
之后
还有
client.available()
返回 0 直到你读到一些东西。例如
String first_line = client.readStringUntil('\n');
之后你可以使用 available() 方法。
使用字符串 "Hello,\nthis is a text\n":
进行测试
client.println(client.available()); // 0
String first_line = client.readStringUntil('\n');
client.println(first_line); // Hello,
client.println(client.available()); // 17
要将所有消息发送回客户端:
client.print("First: ");
client.println(first_line);
while(client.available() > 0) {
client.println("Next: " + client.readStringUntil('\n'));
}
输出:
First: Hello,
Next: this is a text
Next:
这里的问题似乎与
有关
client.print()
将其替换为
client.println()
解决了我的问题。
我相信这在某种程度上拖延了输入缓冲服务器端,因为它正在等待换行但从未得到换行。我将 post 更新后的代码,适用于任何有此问题的人。
ESP8266:
#include <ESP8266WiFi.h>
#define NAME "********"
#define PASS "********"
const char* host = "10.0.0.15";
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.println();
/* Set Client up as station */
WiFi.mode(WIFI_STA);
WiFi.begin(NAME, PASS);
/* Connect to the network */
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (client.connect(host, 9090))
{
Serial.print("Connected to: ");
Serial.println(host);
/* Send "connected" to the server so it knows we are ready for data */
client.println("deviceconnected"); //USE client.println()!!
Serial.println("Host message: \n");
/* Wait for data for 5 seconds at most before timing out */
unsigned long timeout = millis();
while(client.available() == 0)
{
if(millis() - timeout > 5000)
{
Serial.println("Timeout to server!");
break;
}
}
/* Read in the data in the stream */
while(client.available() > 0)
{
Serial.println(client.readStringUntil('\n'));
}
client.stop();
}
else
{
client.stop();
}
delay(5000);
}
Java 服务器:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket listener = new ServerSocket(9090);
try{
while(true){
Socket socket = listener.accept();
socket.setKeepAlive(true);
System.out.println("Client Connected");
try{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Client response: " + in.readLine());
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("Sending Message...");
out.write("Hello\n from Java!\n");
out.flush();
} finally {
socket.close();
}
}
} finally {
listener.close();
}
}
}
这是我第一次 post 在这里,如果我有任何错误,请多多包涵...
好的,所以我只是想在我的计算机上安装一个 Java 程序 运行ning 将信息发送到 ESP8266 运行ning arduino 软件。首先,这是代码。
ESP8266(Arduino):
#include <ESP8266WiFi.h>
#define NAME "********"
#define PASS "********"
const char* host = "192.168.1.6";
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.println();
WiFi.begin(NAME, PASS);
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
if (client.connect(host, 9090)) {
Serial.print("Connected to: ");
Serial.println(host);
String data = "No Message";
client.print("ESP8266 connected!");
if(client.available()) {
data = client.readStringUntil('\n');
}
Serial.print("Host message: ");
Serial.println(data);
client.stop();
} else {
client.stop();
}
}
void loop() {
}
Java 服务器:
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket listener = new ServerSocket(9090);
try{
while(true){
Socket socket = listener.accept();
socket.setKeepAlive(true);
try{
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
out.write("Hello from Java!\n");
} finally {
socket.close();
}
}
} finally {
listener.close();
}
}
}
问题是 client.available() 永远不会 returns 为真,即使 Java 服务器向客户端发送信息也是如此。我试过将数据从 Arduino 发送到服务器,效果很好。我还制作了一个快速 Java 程序,它可以 运行 作为客户端,并 运行 在网络上的另一台计算机上运行。本例中的 Java 服务器和客户端通信正常。所以问题出在 Arduino 的某个地方,但我不知道它是什么。
您的那部分代码属于 loop()
事件:
if (client.connect(host, 9090)) {
Serial.print("Connected to: ");
Serial.println(host);
String data = "No Message";
client.print("ESP8266 connected!");
if(client.available()) {
data = client.readStringUntil('\n');
}
Serial.print("Host message: ");
Serial.println(data);
client.stop();
} else {
client.stop();
}
setup()
函数仅 运行 一次。在它移动到 loop()
并停留在那里之后。而你的 loop()
函数是空的...
我遇到了同样的问题,这是我的解决方案:
Java 仅在添加 out.flush() 时更新输出流;在 out.write();
还有
client.available()
返回 0 直到你读到一些东西。例如
String first_line = client.readStringUntil('\n');
之后你可以使用 available() 方法。
使用字符串 "Hello,\nthis is a text\n":
client.println(client.available()); // 0
String first_line = client.readStringUntil('\n');
client.println(first_line); // Hello,
client.println(client.available()); // 17
要将所有消息发送回客户端:
client.print("First: ");
client.println(first_line);
while(client.available() > 0) {
client.println("Next: " + client.readStringUntil('\n'));
}
输出:
First: Hello,
Next: this is a text
Next:
这里的问题似乎与
有关client.print()
将其替换为
client.println()
解决了我的问题。
我相信这在某种程度上拖延了输入缓冲服务器端,因为它正在等待换行但从未得到换行。我将 post 更新后的代码,适用于任何有此问题的人。
ESP8266:
#include <ESP8266WiFi.h>
#define NAME "********"
#define PASS "********"
const char* host = "10.0.0.15";
WiFiClient client;
void setup() {
Serial.begin(115200);
Serial.println();
/* Set Client up as station */
WiFi.mode(WIFI_STA);
WiFi.begin(NAME, PASS);
/* Connect to the network */
Serial.print("Connecting");
while(WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Connected, IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (client.connect(host, 9090))
{
Serial.print("Connected to: ");
Serial.println(host);
/* Send "connected" to the server so it knows we are ready for data */
client.println("deviceconnected"); //USE client.println()!!
Serial.println("Host message: \n");
/* Wait for data for 5 seconds at most before timing out */
unsigned long timeout = millis();
while(client.available() == 0)
{
if(millis() - timeout > 5000)
{
Serial.println("Timeout to server!");
break;
}
}
/* Read in the data in the stream */
while(client.available() > 0)
{
Serial.println(client.readStringUntil('\n'));
}
client.stop();
}
else
{
client.stop();
}
delay(5000);
}
Java 服务器:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket listener = new ServerSocket(9090);
try{
while(true){
Socket socket = listener.accept();
socket.setKeepAlive(true);
System.out.println("Client Connected");
try{
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("Client response: " + in.readLine());
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
System.out.println("Sending Message...");
out.write("Hello\n from Java!\n");
out.flush();
} finally {
socket.close();
}
}
} finally {
listener.close();
}
}
}