You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于Arduino IDE的ESP8266 NodeMCU API链接参数解析问询

解析ESP8266 NodeMCU收到的URL查询字符串

嘿,这个需求我之前做ESP8266项目的时候刚好碰到过,给你分享两种实用的实现方式,都是在Arduino IDE的C环境下直接能用的:

方法一:用ESP8266WebServer库的内置函数(最省心)

如果你已经在使用ESP8266WebServer库搭建服务器,那完全不用自己折腾解析逻辑——库已经帮你把查询字符串拆解好了,直接调用现成的方法就能拿到参数值。

代码示例

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
ESP8266WebServer server(80); // 监听HTTP默认80端口

// 处理根路径的请求
void handleRootRequest() {
  // 先检查参数是否存在,避免空值问题
  if (server.hasArg("A")) {
    String data1 = server.arg("A");
    Serial.print("获取到参数A的值:");
    Serial.println(data1);
  }
  
  if (server.hasArg("B")) {
    String data2 = server.arg("B");
    Serial.print("获取到参数B的值:");
    Serial.println(data2);
  }

  // 给请求设备返回响应
  server.send(200, "text/plain", "参数解析完成");
}

void setup() {
  Serial.begin(115200);
  
  // 连接WiFi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi已连接,设备IP:" + WiFi.localIP().toString());

  // 注册根路径的请求处理函数
  server.on("/", handleRootRequest);
  server.begin();
  Serial.println("Web服务器已启动");
}

void loop() {
  server.handleClient(); // 持续处理客户端请求
}

关键说明

  • server.hasArg("参数名"):用来判断指定参数是否存在,防止解析不存在的参数导致异常
  • server.arg("参数名"):直接返回对应参数的字符串值,库会自动处理URL编码(比如%20转空格)

方法二:手动解析查询字符串(适合底层自定义场景)

如果你的项目没有使用ESP8266WebServer库,或者你想自己掌控解析逻辑,可以写一个自定义函数来拆解"?A=data1&B=data2"这样的字符串。

核心解析函数

#include <ESP8266WiFi.h>

// 从查询字符串中提取指定参数的值
String getParamValue(String queryString, String paramName) {
  // 去掉开头的问号(如果存在)
  if (queryString.startsWith("?")) {
    queryString = queryString.substring(1);
  }

  int ampersandPos = 0;
  int equalPos = 0;
  String currentPair;

  while (ampersandPos != -1) {
    // 按&分割键值对
    ampersandPos = queryString.indexOf('&');
    if (ampersandPos != -1) {
      currentPair = queryString.substring(0, ampersandPos);
      queryString = queryString.substring(ampersandPos + 1);
    } else {
      currentPair = queryString;
    }

    // 按=分割键和值
    equalPos = currentPair.indexOf('=');
    if (equalPos != -1) {
      String key = currentPair.substring(0, equalPos);
      String value = currentPair.substring(equalPos + 1);
      
      // 匹配到目标参数,返回值(可添加URL解码)
      if (key == paramName) {
        return urlDecode(value); // 后面会提供URL解码函数
      }
    }
  }

  // 未找到参数,返回空字符串
  return "";
}

// 可选:URL解码函数,处理%20这类编码字符
String urlDecode(String encodedStr) {
  String decoded = "";
  char hexTemp[] = "0x00";
  unsigned int len = encodedStr.length();
  unsigned int i = 0;

  while (i < len) {
    if (encodedStr[i] == '%') {
      if (i + 2 < len) {
        hexTemp[2] = encodedStr[i+1];
        hexTemp[3] = encodedStr[i+2];
        decoded += strtol(hexTemp, NULL, 16);
        i += 3;
        continue;
      }
    } else if (encodedStr[i] == '+') {
      decoded += ' ';
    } else {
      decoded += encodedStr[i];
    }
    i++;
  }
  return decoded;
}

使用示例

void setup() {
  Serial.begin(115200);
  
  // 模拟你已经获取到的查询字符串
  String receivedQuery = "?A=data1&B=data2";
  
  String data1 = getParamValue(receivedQuery, "A");
  String data2 = getParamValue(receivedQuery, "B");
  
  Serial.print("参数A的值:");
  Serial.println(data1);
  Serial.print("参数B的值:");
  Serial.println(data2);
}

void loop() {
  // 这里可以添加你的服务器监听逻辑
}

关键说明

  • 函数先去掉查询字符串开头的?,然后按&拆分所有键值对,再按=拆分每个键值对的键和值
  • 可选的urlDecode函数可以处理URL编码后的特殊字符,让解析结果更准确

内容的提问来源于stack exchange,提问作者Hamza Hajeir

火山引擎 最新活动