Arduino通过SIM800L向服务器发送数据时出现HTTP 603错误
兄弟,你碰到的+HTTPACTION: 0,603,0错误,在SIM800系列模块里其实是个挺典型的网络连接或域名解析问题。结合你的串口日志和代码,我整理了几个能快速排查和修复的方向:
1. 先盯紧HTTP/HTTPS的坑!
看你的串口返回里的请求URL是https://system.fabricaid.me/d.php?i=1&f=2,但你代码里定义的HTTPserver是http://--------.me——划重点:普通版SIM800L根本不支持HTTPS!它只能处理HTTP请求。如果你的服务器强制要求HTTPS访问,模块直接就懵了,返回603是必然的。
修复办法:
- 先确认你的服务器是否允许HTTP访问,如果可以,把代码里的
HTTPserver改成不带s的HTTP地址; - 如果服务器必须用HTTPS,那要么换支持HTTPS的模块(比如SIM800H、SIM808),要么在服务器端整个HTTP转HTTPS的代理层。
2. 测试DNS解析是否正常
模块连不上服务器,大概率是域名解析失败。你可以直接给模块发AT指令测试:
AT+CDNSGIP="system.fabricaid.me"
如果返回ERROR或者没给出正确的IP,那就是解析的问题,可能是这两个原因:
- APN设置缺了DNS:你用的APN是
touch,有些运营商的APN需要手动指定DNS,试试加这两条指令:AT+SAPBR=3,1,"DNS1","8.8.8.8" AT+SAPBR=3,1,"DNS2","8.8.4.4" - 信号太差:用
AT+CSQ查信号强度,返回的第一个数值得大于10才够稳定,低于的话赶紧调整天线位置,或者换个信号好的地方试试。
3. 检查URL拼接有没有暗坑
看你代码里拼URL的逻辑:
GSM_serial.print("AT+HTTPPARA=\"URL\","); GSM_serial.print(HTTPserver); // 定义为#define HTTPserver "http://--------.me" GSM_serial.print(HTTPurl); // 定义为#define HTTPurl "/d.php?" GSM_serial.print(message); // message内容为i=1&f=2,完整URL为http://---------.me/d.php?i=1&f=2 GSM_serial.print("\"\r\n");
但串口返回的却是HTTPS,说明你实际的HTTPserver宏定义可能写错了?先确认这个宏的内容是不是真的是HTTP开头。另外,有些模块对&这类特殊字符敏感,你可以试试把message里的&换成URL编码的%26,也就是i=1%26f=2,看看能不能正常请求。
4. 再确认GPRS连接真的没问题
虽然你的日志里AT+CGATT=1和AT+SAPBR=1,1都返回OK,但咱得再较真一下:
- 发
AT+CGATT?,确认返回+CGATT: 1,说明真的附着到网络了; - 发
AT+SAPBR=2,1,如果返回+SAPBR: 1,1,"xxx.xxx.xxx.xxx",说明模块拿到了IP,要是第二个参数是0,那就是GPRS没连上,得检查APN的用户名密码(有些运营商的APN需要这个,比如AT+SAPBR=3,1,"USER","xxx"和AT+SAPBR=3,1,"PWD","xxx")。
5. 给请求多留点儿时间
你代码里AT+HTTPACTION=0之后只等了6秒,有些慢网络环境下,6秒可能不够完成整个请求流程,试试把延迟改成10秒:
GSM_serial.print("AT+HTTPACTION=0\r\n"); updateSerial(); delay(10000);
最后建议你从最简单的请求开始测,比如先请求http://example.com,确认模块能返回200,再逐步换成你的服务器地址和参数,这样更容易定位问题。
内容的提问来源于stack exchange,提问作者Hussam

