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工作异常
前置验证步骤
在改代码前先做基础验证,排除网络本身问题:
- 把手机WiFi关掉,用移动蜂窝数据访问你预期的Asp.net接口地址,确认手机能正常拿到响应——手机同网络环境下访问失败的话,ESP32不可能连接成功
- 确认本地服务的实际协议(HTTP/HTTPS)、监听端口:如果是HTTP服务不要用443端口,如果是HTTPS服务注意本地开发证书默认不受公共信任,调试阶段需要跳过证书校验
- 本地服务必须通过路由器端口映射、内网穿透等方式暴露到公网,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); }
排查优先级
- 先验证手机蜂窝网络能正常访问服务地址,排除链路不通、端口错误问题
- 匹配协议与客户端类型:HTTP用普通
TinyGsmClient,HTTPS用TinyGsmClientSecure,调试阶段先开setInsecure()跳过证书校验 - 修正
server字段格式,仅保留IP/域名,端口单独在port字段配置 - 调整modem初始化顺序,每次请求结束后主动断开连接清理残留
内容的提问来源于stack exchange,提问作者MinhThong
相关产品推荐
相关产品推荐

