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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:45:05