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

Arduino可正常连接服务器但无法POST温度数据到PHP脚本故障求助

问题排查与修复方案

1. Arduino端代码问题

你现在的HTTP请求逻辑存在数据未完成传输就断开连接的问题,导致服务端无法接收完整POST参数:

  • 发送POST请求时未声明Connection: close头,HTTP/1.1默认开启长连接,你直接提前断开客户端连接会导致服务端丢弃未处理完的请求
  • 发送完POST body后立刻执行client.stop(),部分数据还在缓冲区未发送到服务端就被强制中断

修复后的Arduino请求片段:

if (client.connect(server, 80)) {
    if (connected == false)
    {
        connected = true;
        Serial.print("Connected\n");
    }
    client.println("POST /test/post.php HTTP/1.1");
    client.println("Host: --ADDRESS--");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(postData.length());
    // 新增:告诉服务器本次请求结束后断开连接
    client.println("Connection: close");
    client.println();
    client.print(postData);
    // 新增:等待1秒保证数据完全发送、服务端处理完成
    delay(1000);
}

2. 服务端PHP代码&配置问题

这是故障概率最高的原因,分3类:

路径错误

你用了相对路径$file = 'temp.html',PHP运行时的工作目录≠脚本所在的/test/目录,会导致文件写入到其他路径,你访问/test/temp.html自然是空的。改用绝对路径即可:

// __DIR__ 是当前post.php脚本所在的目录,自动匹配绝对路径
$file = __DIR__ . '/temp.html';

权限不足

你提前创建的temp.html所属用户不对,Debian下Apache默认用www-data用户运行PHP,如果你是用root/个人用户创建的文件,www-data没有写入权限,自然写不进内容。执行命令修复权限:

# 把/path/to/test替换成你test目录的实际绝对路径,比如/var/www/html/test
chown www-data:www-data /path/to/test/temp.html
chmod 664 /path/to/test/temp.html

写入逻辑问题

你现在用的file_put_contents是覆盖写入,每次新数据会直接清空旧内容,就算写入成功也只会显示最新的一条数据。如果需要累加记录,加上FILE_APPEND参数即可:

// 加PHP_EOL是为了每条记录换行,方便查看
file_put_contents($file, $data . PHP_EOL, FILE_APPEND);

3. 快速验证方法

先脱离Arduino单独验证服务端逻辑是否正常,在任意设备执行curl命令模拟POST请求:

curl -d "temp=36.8" http://你的服务器地址/test/post.php

执行后查看/test目录下的temp.html是否有内容,如果正常再调试Arduino端即可。如果还是不正常,查看Apache错误日志定位问题:

tail -f /var/log/apache2/error.log

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:54:02