从Java服务器发送数据到ESP8266

Loubear

这是我在这里的第一篇文章,所以如果我有任何错误,请多包涵...

好的,我只是想让计算机上运行的Java程序将信息发送到运行arduino软件的ESP8266。首先,这是代码。

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();
        }
    }

}

问题在于,即使Java服务器将信息发送到客户端,client.available()也永远不会返回true。我试图将数据从Arduino发送到服务器,并且工作正常。我还制作了一个快速的Java程序,该程序可以作为客户端运行,并可以在网络上的另一台计算机上运行。在这种情况下,Java服务器和客户端可以很好地通信。所以问题出在Arduino的某个地方,但是我对它的含义迷失了。

Loubear

这里的问题似乎与

client.print() 

替换为

client.println()

解决了我的问题。

我认为这在某种程度上使输入缓冲服务器端停滞不前,因为它正在等待换行符,但始终没有得到换行符。我将在下面发布可解决此问题的更新代码。

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();
        }
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ESP8266向远端服务器发送GET请求

无法使用 Retrofit 创建到 ESP8266 服务器的 HTTP POST

ESP8266如何建立TCP服务器?

ESP8266服务器监听所有页面

我需要使用websockets将ESP8266连接到本地Java服务器的帮助

如何防止Ajax溢出/服务器崩溃?(Arduino / ESP8266环境)

更新/删除页面 ESP8266 网络服务器

esp8266 POST请求后服务器无响应

从 ESP8266 Arduino 板向服务器发布 JSON 对象的问题

ESP8266 如何使用 esp8266 库 v2.6.3 作为网络服务器获取客户端的 IP

MicroPython ESP8266 SPI接口发送错误数据

ESP8266,NodeMCU,软AP-类似于UDP服务器的软AP,独立的接入点

在 esp8266 上发送多播?

使用 ESP8266 发送 json 文档

如何与具有多个ESP8266的网络中的一个特定ESP8266通信,其中每个模块都在运行侦听端口80的服务器实例

使用NodeMCU ESP8266将Arduino数据发送到mySQL数据库

TCP 服务器以数据包结构发送文件(到非 Java 客户端)

通过ajax发送数据到express服务器的问题

无法从Flutter应用发送WebSocket数据到服务器

上传文件时如何发送数据到服务器?

WordPress的PHP发送数据到本地服务器

如何防止余烬数据发送请求到服务器?

打字稿发送数据到服务器

ajax发送数据到服务器的问题

从Android设备向ESP8266 Wi-Fi芯片发送数据

如何通过esp8266 wifi模块从arduino uno向网页发送数据?

连接到摄像头和空调继电器的 IoT Nodemcu esp8266 LUA 脚本 www HTML 服务器的 DAST 安全扫描

为什么发布到 php 的数据可以打印但不能在 if 中进行比较。(仅限 esp8266。PC 网络浏览器工作正常)

ESP8266嗅探并发送Mac地址