ESP8266发送GET参数仅带后缀路径生效,如何让index.php可读取参数
你当前的PHP逻辑仅处理单次请求的GET参数,没有存储上传的数据,因此另一台设备访问无参数地址时无法获取之前上传的数值。可以通过轻量文件存储实现数据持久化,无需数据库,改动量最小,具体实现步骤如下:
实现步骤
1. 替换PHP代码
把原来的index.php替换为下面的代码,逻辑是:如果请求带name参数,就把值写入data.txt存储;如果不带参数,就读取data.txt的内容返回。
<?php // 存储数据的文件路径 $data_file = 'data.txt'; // 处理上传请求:带name参数时写入数据 if (isset($_GET['name'])) { $name = $_GET['name']; // 写入文件,加锁避免并发写入冲突 file_put_contents($data_file, $name, LOCK_EX); echo "upload success: " . $name; } // 处理读取请求:不带参数时返回存储的数据 else { if (file_exists($data_file)) { $name = file_get_contents($data_file); echo "name " . $name; } else { echo "name none"; } } ?>
注意:需要给index.php所在目录开启PHP的写入权限,否则无法生成data.txt文件。
2. 发送端ESP8266代码优化
原来的发送逻辑基本可用,补充HTTP状态码判断避免无效请求:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> const char* ssid = "NikitaiPhone"; //替换为自己的WiFi SSID const char* password = "Maxius1"; //替换为自己的WiFi密码 const char* upload_url = "http://104.220.131.254/index.php?name=Joe"; //要上传的name值可以改成变量 WiFiClient client; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected, IP: " + WiFi.localIP().toString()); } void loop(){ if (WiFi.status() != WL_CONNECTED) return; HTTPClient http; http.begin(client, upload_url); int httpCode = http.GET(); if (httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println("上传结果:" + payload); } else { Serial.println("上传失败,错误码:" + String(httpCode)); } http.end(); delay(5000); //上传间隔可自行调整 }
3. 接收端ESP8266代码示例
另一台ESP8266直接请求无参数的index.php即可读取存储的name值:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> const char* ssid = "NikitaiPhone"; //替换为自己的WiFi SSID const char* password = "Maxius1"; //替换为自己的WiFi密码 const char* get_url = "http://104.220.131.254/index.php"; WiFiClient client; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected, IP: " + WiFi.localIP().toString()); } void loop(){ if (WiFi.status() != WL_CONNECTED) return; HTTPClient http; http.begin(client, get_url); int httpCode = http.GET(); if (httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println("读取到的数值:" + payload); // 此处可添加对payload的处理逻辑,比如提取name值 } else { Serial.println("读取失败,错误码:" + String(httpCode)); } http.end(); delay(5000); //读取间隔可自行调整 }
可选优化
- 如果需要存储多个不同变量,可修改PHP逻辑按键值对存储,比如请求地址写成
index.php?key=temperature&value=25,不同参数分开存储 - 数据敏感性高的话可以添加简单的鉴权参数,比如请求带自定义的token校验,避免无关人员篡改数据
内容的提问来源于stack exchange,提问作者Nikita Varfolomeev
相关产品推荐
相关产品推荐

