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
相关产品推荐
相关产品推荐

