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
相关产品推荐
相关产品推荐

