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

SIM800L模块HTTP POST JSON请求异常:返回301/603/606错误

ESP32+SIM800L向HTTPS服务器POST JSON失败问题解决

硬件环境与问题描述

使用ESP32-Wroom-32D开发板搭配SIM800L模块,尝试向HTTPS服务器POST JSON数据时遇到以下错误:

  • 取消注释send_to_serial("AT+HTTPSSL=1");时,AT+HTTPACTION=1返回606错误
  • 保留该行注释时,AT+HTTPACTION=1返回603错误
  • 保留注释且将URL改为HTTP协议时,AT+HTTPACTION=1返回301错误

用户原代码如下:

#include <SoftwareSerial.h>

String apn = "internet";               //APN
String apn_u = "";                     //APN-Username
String apn_p = "";                     //APN-Password
String url = "https://airpm.io/denek/GetData";  //URL of Server - Website is https://

SoftwareSerial mySerial(14, 12); // sim800l_TX_pin, sim800l_RX_pin
int counter = 0;
void setup()
{
    Serial.begin(9600);
    Serial.println("SIM800 AT CMD Test");
    mySerial.begin(9600);
    delay(5000);
    while (mySerial.available()) {
        Serial.write(mySerial.read());
    }
    delay(2000);
    configure_gprs();
}

void loop() {
    counter++;
    String data = String(counter); //write your data here
    send_to_server("{\"KEY\":" + data + "}");
    delay(2000);
}
void send_to_server( String data) {
    String sendURL = url;
    Serial.println(" --- Start GPRS & HTTP --- ");
    send_to_serial("AT+SAPBR=1,1");
    send_to_serial("AT+SAPBR=2,1");
    send_to_serial("AT+HTTPINIT");
    send_to_serial("AT+HTTPPARA=CID,1");
    send_to_serial("AT+HTTPPARA=URL," + sendURL);
    send_to_serial("AT+HTTPPARA=CONTENT,application/json");
    send_to_serial("AT+HTTPDATA=" + String(data.length()) + ",10000");
    send_to_serial(data);
    //send_to_serial("AT+HTTPSSL=1");
    send_to_serial("AT+HTTPACTION=1");
    send_to_serial("AT+HTTPREAD");
    send_to_serial("AT+HTTPTERM");
    send_to_serial("AT+SAPBR=0,1");
}

//AT+CGACT=1,1
// "AT+CGDCONT=1,\"IP\",\"\\<APN\\>\",\"0.0.0.0\",0,0"

// "AT+CGDNSIP=1,\"\\<PRIMARY_DNS\\>\",\"\\<SECONDARY_DNS\\>\"

//  send_to_serial("AT+HTTPSSL=1");

void configure_gprs() {
    Serial.println(" --- CONFIG GPRS --- ");
    send_to_serial("AT+SAPBR=3,1,Contype,GPRS");
    send_to_serial("AT+SAPBR=3,1,APN," + apn);
    if (apn_u != "") {
        send_to_serial("AT+SAPBR=3,1,USER," + apn_u);
    }
    if (apn_p != "") {
        send_to_serial("AT+SAPBR=3,1,PWD," + apn_p);
    }
}

void send_to_serial(String command) {
    Serial.println("Send ->: " + command);
    mySerial.println(command);
    long wtimer = millis();
    while (wtimer + 5000 > millis()) {
        while (mySerial.available()) {
            Serial.write(mySerial.read());
        }
    }
    Serial.println();

}

错误原因分析

  • 606错误:SIM800L启用SSL证书验证后,目标服务器的证书不在模块内置信任列表中,导致验证失败
  • 603错误:目标URL为HTTPS协议,但未启用SSL连接,协议不匹配
  • 301错误:服务器配置了HTTP到HTTPS的永久重定向,强制要求使用HTTPS连接

解决方案

1. 修复SSL连接问题(解决606/603错误)

SIM800L的AT+HTTPSSL命令有两个有效参数:

  • 1:启用SSL并验证证书
  • 2:启用SSL但关闭证书验证

修改代码中SSL相关命令,关闭证书验证以绕过信任问题:

// 替换原注释的SSL命令为
send_to_serial("AT+HTTPSSL=2");

同时调整命令顺序,确保AT+HTTPSSL在AT+HTTPINIT之后、AT+HTTPPARA之前执行,否则SSL配置不会生效。

2. 修正HTTP数据发送流程

发送AT+HTTPDATA后,模块会输出>提示符,此时才能发送JSON数据。原代码直接发送数据可能导致部分内容丢失,需添加延迟或等待提示符:

void send_to_server( String data) {
    String sendURL = url;
    Serial.println(" --- Start GPRS & HTTP --- ");
    send_to_serial("AT+SAPBR=1,1");
    send_to_serial("AT+SAPBR=2,1"); // 确认获取到IP地址
    send_to_serial("AT+HTTPINIT");
    send_to_serial("AT+HTTPSSL=2"); // 启用SSL并关闭证书验证
    send_to_serial("AT+HTTPPARA=CID,1");
    send_to_serial("AT+HTTPPARA=URL," + sendURL);
    send_to_serial("AT+HTTPPARA=CONTENT,application/json");
    send_to_serial("AT+HTTPDATA=" + String(data.length()) + ",10000");
    delay(200); // 等待模块输出>提示符
    send_to_serial(data);
    send_to_serial("AT+HTTPACTION=1");
    send_to_serial("AT+HTTPREAD");
    send_to_serial("AT+HTTPTERM");
    send_to_serial("AT+SAPBR=0,1");
}

3. 确认网络连接状态

在setup函数中添加网络状态检查命令,确保SIM卡注册和GPRS附着成功:

void setup()
{
    Serial.begin(9600);
    Serial.println("SIM800 AT CMD Test");
    mySerial.begin(9600);
    delay(5000);
    while (mySerial.available()) {
        Serial.write(mySerial.read());
    }
    delay(2000);
    configure_gprs();
    // 检查SIM卡网络注册状态
    send_to_serial("AT+CREG?");
    // 检查GPRS附着状态
    send_to_serial("AT+CGATT?");
}
  • AT+CREG?返回+CREG: 0,1或+CREG: 0,5表示注册成功
  • AT+CGATT?返回+CGATT: 1表示GPRS附着成功

4. 关于301错误的说明

301是服务器端的强制重定向配置,无法通过代码绕过,必须使用HTTPS协议连接服务器,因此无需尝试改用HTTP。

内容的提问来源于stack exchange,提问作者sir-user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:25:20