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

ESP32使用httpGet访问本地Asp.net WebAPI失败如何解决

问题排查与修复方案

核心错误点

你的代码存在4个直接导致连接失败的问题:

  • 地址配置错误:server字段填写的localhost:28212不符合规范:
    • localhost是设备本地回环地址,ESP32发起请求时访问的是它自身,不是你部署Asp.net服务的电脑/服务器
    • 端口号被错误写在server字段内,和单独定义的port=443冲突,server字段仅允许填写IP/域名,不能带端口、协议前缀
  • 端口与协议不匹配:本地Asp.net开发环境默认的28212端口基本都是HTTP协议端口,不是HTTPS默认的443端口,公网API能联通是因为公网HTTPS服务默认使用443端口,本地服务未在443端口绑定HTTPS服务时,强行连接443端口会直接失败
  • 网络链路不通:ESP32通过GPRS联网时,处于运营商的蜂窝网络内,和你部署Asp.net服务的本地局域网完全隔离,没有做公网暴露的本地服务,ESP32根本无法路由到对应地址
  • 初始化顺序错误:原代码在setup()中先调用GSM_Init(),再初始化串口、启动modem,时序错误会导致modem工作异常

前置验证步骤

在改代码前先做基础验证,排除网络本身问题:

  1. 把手机WiFi关掉,用移动蜂窝数据访问你预期的Asp.net接口地址,确认手机能正常拿到响应——手机同网络环境下访问失败的话,ESP32不可能连接成功
  2. 确认本地服务的实际协议(HTTP/HTTPS)、监听端口:如果是HTTP服务不要用443端口,如果是HTTPS服务注意本地开发证书默认不受公共信任,调试阶段需要跳过证书校验
  3. 本地服务必须通过路由器端口映射、内网穿透等方式暴露到公网,ESP32通过GPRS才能访问到;如果不想做公网暴露,需要把ESP32切换到和服务同局域网的WiFi模式联网,不能用GPRS

修正后参考代码

// 仅填写服务对应的公网IP/域名,不要带端口、http/https前缀
const char server[]   = "你的服务公网IP/域名";
const char resource[] = "/api/Led";
// 填写服务实际监听端口:HTTP默认80,HTTPS默认443,自定义端口填实际映射后的值
const int  port       = 28212;

#include <TinyGsmClient.h>
#include <ArduinoHttpClient.h>
TinyGsm        modem(SerialAT);
// HTTP服务用普通客户端,HTTPS服务替换为TinyGsmClientSecure
TinyGsmClient client(modem);
// HTTPS客户端定义:TinyGsmClientSecure client(modem);
HttpClient    http(client, server, port);

void setup() {
  Serial.begin(115200);
  // 先初始化modem串口,再做modem初始化
  SerialAT.begin(115200, SERIAL_8N1, MODEM_RX, MODEM_TX);
  delay(6000);
  Serial.println("Initializing modem...");
  modem.restart();
  TinyGsmAutoBaud(SerialAT, GSM_AUTOBAUD_MIN, GSM_AUTOBAUD_MAX);
}

void loop() {
  Serial.print(F("Connecting to "));
  Serial.print(apn);
  if (!modem.gprsConnect(apn, gprsUser, gprsPass)) {
    Serial.println(" fail");
    delay(10000);
    return;
  }
  Serial.println(" success");

  if (modem.isGprsConnected()) {
    Serial.println("GPRS connected");
  }
  Serial.print(F("Performing GET request... "));
  http.connectionKeepAlive();
  // HTTPS调试阶段打开下面这行,跳过证书校验
  // client.setInsecure();
  int err = http.get(resource);
  if (err != 0) {
    Serial.print(F("failed to connect, error code: "));
    Serial.println(err);
    // 主动清理连接残留,避免影响下次请求
    http.stop();
    modem.gprsDisconnect();
    delay(10000);
    return;
  }
  int status = http.responseStatusCode();
  Serial.print(F("Response status code: "));
  Serial.println(status);
  // 响应读取完成后主动关闭连接
  http.stop();
  modem.gprsDisconnect();
  delay(30000);
}

排查优先级

  1. 先验证手机蜂窝网络能正常访问服务地址,排除链路不通、端口错误问题
  2. 匹配协议与客户端类型:HTTP用普通TinyGsmClient,HTTPS用TinyGsmClientSecure,调试阶段先开setInsecure()跳过证书校验
  3. 修正server字段格式,仅保留IP/域名,端口单独在port字段配置
  4. 调整modem初始化顺序,每次请求结束后主动断开连接清理残留

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:01:41