求助:Arduino Uno WiFi调用PHP脚本失败(仅能连接服务器)
排查Arduino Uno WiFi调用PHP脚本无响应的问题
先把你提供的代码整理并补全(看起来代码有截断,先还原已有的部分):
#include <Wire.h> #include <UnoWiFiDevEd.h> void setup() { const char* connector = "rest"; const char* server = "https://________.com"; const char* method = "POST"; const char* resource = "/send.php"; Serial.begin(9600); Ciao.begin(); pinMode(2, INPUT); delay(10000); // 代码到这里截断了,缺少请求发送的核心逻辑 } // 大概率还缺少loop函数或完整的请求执行代码
接下来从几个核心方向帮你排查问题:
1. 补全Arduino端的请求逻辑
你目前的代码只完成了初始化,没有实际发送Rest请求的代码。UnoWifiDevEd库需要调用Ciao.write()来触发请求,尤其是POST请求需要携带参数或请求体才能让PHP脚本识别到调用。
给你一个完整的POST请求示例:
#include <Wire.h> #include <UnoWiFiDevEd.h> const char* connector = "rest"; const char* server = "https://your-domain.com"; const char* method = "POST"; const char* resource = "/send.php"; void setup() { Serial.begin(9600); while (!Serial); // 等待串口连接完成 Ciao.begin(); pinMode(2, INPUT); delay(2000); // 构造要发送的POST数据(比如读取引脚2的状态) String postData = "sensor_state=" + String(digitalRead(2)); // 发送请求并获取响应 CiaoData response = Ciao.write(connector, server, method, resource, postData); // 打印调试信息 if (response.isValid()) { Serial.println("✅ 请求成功,服务器响应:"); Serial.println(response.getContent()); } else { Serial.println("❌ 请求失败"); Serial.println("错误码:" + String(response.getCode())); } } void loop() { // 可以添加定时重复请求的逻辑 delay(5000); }
2. 检查PHP脚本的有效性
2.1 确保脚本能正确接收POST请求
如果你的PHP脚本需要处理POST参数,要确保它能正确获取数据,比如:
<?php // send.php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 接收POST参数 $sensorState = isset($_POST['sensor_state']) ? $_POST['sensor_state'] : '无数据'; // 执行你的业务逻辑(比如写入数据库、记录日志) file_put_contents('sensor_log.txt', $sensorState . "\n", FILE_APPEND); // 必须返回响应,Arduino才能判断请求是否成功 echo "已接收数据:" . $sensorState; } else { echo "仅支持POST请求"; } ?>
注意:如果Arduino发送的是原始文本(不是表单格式),PHP需要用file_get_contents('php://input')来读取,而不是$_POST。
2.2 排查服务器端权限与错误
- 确保
send.php的文件权限设置为755,让服务器能正常执行它。 - 查看服务器的错误日志(比如Apache的
error.log或Nginx的error.log),如果PHP脚本有语法错误、权限不足等问题,日志里会有明确提示。
3. HTTPS连接的特殊问题
你用的是HTTPS协议,UnoWifiDevEd库对HTTPS的支持有几个坑:
- 旧版本库可能不支持SNI(服务器名称指示),如果你的服务器是共享主机,建议先换成HTTP协议测试,排除HTTPS的影响。
- 服务器的SSL证书必须是受信任的,部分嵌入式设备无法识别自签名证书。如果测试HTTP正常,再考虑更新库版本或配置证书信任。
4. 用串口调试定位问题
在代码中添加更多串口输出,能帮你看清请求的细节:
// 在发送请求前打印请求信息 Serial.println("请求方法:" + String(method)); Serial.println("请求地址:" + String(server) + String(resource)); Serial.println("发送数据:" + postData); // 请求后打印响应状态码 Serial.println("服务器状态码:" + String(response.getCode()));
状态码能直接说明问题:比如404是脚本路径错误,500是PHP脚本内部报错,200是请求成功但脚本逻辑有问题。
内容的提问来源于stack exchange,提问作者evocorsa
相关产品推荐
相关产品推荐

