You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android TCP客户端无法向ESP8266服务器发送数据求助

解决Android TCP客户端无法向ESP8266发送数据的问题

我帮你排查了代码里的几个关键问题,这应该就是你的App发不出数据的核心原因:

1. AsyncTask参数处理错误,发送了无效内容

在MessegeSender的doInBackground方法里,你错误地把传入的参数数组直接转成字符串发送了——这实际上发送的是数组的内存地址字符串,而不是用户输入的文本!

比如你输入"test",代码里String.valueOf(messege)会输出类似[Ljava.lang.String;@xxxxxxx的内容,ESP8266自然无法识别。

修正代码:

@Override
protected Void doInBackground(String... params) {
    // 取传入的第一个参数(也就是输入框的文本)
    String message = params[0];
    try {
        s = new Socket("192.168.4.1", 502);
        pw = new PrintWriter(s.getOutputStream());
        pw.write(message);
        // 关键:添加换行符,ESP8266的readLine()需要这个才会返回数据
        pw.write("\n");
        pw.flush();
        // 用完记得关闭资源
        pw.close();
        s.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

2. 缺少换行符(大概率是Roboremo能工作但你的App不行的原因)

Roboremo发送数据时默认会自动添加换行符,而你的代码里没有。绝大多数ESP8266的TCP服务器代码会用readLine()读取数据,这个方法会一直等待直到收到换行符才会返回结果。如果你的App不发送换行,服务器就会一直处于等待状态,看起来像是没收到数据。

你也可以直接用println()简化代码,它会自动添加换行:

pw.println(message);
pw.flush();

其他必要的检查和优化

  • 添加网络权限:确保你的AndroidManifest.xml里已经添加了网络权限,否则App会被禁止访问网络:
<uses-permission android:name="android.permission.INTERNET" />
  • 规范命名:MessegeSender的拼写有误,应该是MessageSender,虽然不影响功能,但规范命名能让代码更易维护。
  • 异常反馈:可以在AsyncTask的onPostExecute方法里添加用户提示(比如Toast),这样你能直观知道是否出现连接失败等问题,而不是只在Logcat里看堆栈信息。

内容的提问来源于stack exchange,提问作者user5427986

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:31:47