Arduino通过SIM900发送JSON数据至数据库失败:返回SEND OK但无数据
排查SIM900发送JSON到数据库无响应的问题
看起来你遇到的是典型的HTTP请求格式不完整问题——虽然SIM900返回了SEND OK,但这只代表模块把数据发出去了,不代表服务器能正确解析你的请求。你现在只发送了JSON字符串,没有附带HTTP协议要求的头部信息,服务器根本不知道该怎么处理这段数据。
下面是具体的排查和修复步骤:
1. 补全完整的HTTP POST请求
SIM900建立TCP连接后,需要发送符合HTTP规范的完整请求,而不是裸JSON。一个标准的POST请求结构应该是:
请求行 → 请求头部 → 空行 → 请求正文(你的JSON)
给你修改后的代码示例:
String data = "{\"a\": 1000, \"b\": 1000, \"c\": 1000, \"d\": 1000, \"e\": 1000, \"f\": 1000, \"g\": 1000, \"h\": 1000, \"i\": 1000}"; // 1. 建立TCP连接,建议等待模块返回CONNECT OK再继续,而非固定delay client.println("AT+CIPSTART=\"TCP\",\"myapp.herokuapp.com\",\"80\""); delay(4000); // 可以优化为循环读取串口,直到收到"CONNECT OK"再执行下一步 // 2. 构造完整的HTTP POST请求 String postRequest = "POST /your-api-path HTTP/1.1\r\n"; // 替换成你Heroku应用的实际接口路径,比如/submit-data postRequest += "Host: myapp.herokuapp.com\r\n"; postRequest += "Content-Type: application/json\r\n"; // 必须指定,告诉服务器正文是JSON格式 postRequest += "Content-Length: " + String(data.length()) + "\r\n"; // 告诉服务器正文的准确长度 postRequest += "\r\n"; // 空行,分隔请求头部和正文 postRequest += data; // 3. 发送请求:指定发送长度比直接发送更可靠 client.println("AT+CIPSEND=" + String(postRequest.length())); delay(1000); client.print(postRequest); // 用print而非println,避免额外换行破坏请求格式 // 4. 读取服务器响应,排查问题根源 delay(3000); while(client.available()){ Serial.println(client.readString()); // 把服务器返回的内容打印到串口,查看是否有错误(比如404、400) } // 5. 关闭TCP连接 client.println("AT+CIPCLOSE");
2. 关键排查点
- 确认接口路径正确性:Heroku应用不会默认接收根路径的请求,你需要核对后端代码里的路由(比如
/api/save-data),替换到代码的/your-api-path位置。 - 验证服务器接口可用性:先用Postman或curl直接调用你的Heroku接口,传入相同的JSON,确认服务器能正常接收并写入数据库——先排除后端本身的问题。
- 查看HTTP响应状态:通过串口打印服务器返回的内容,如果看到
404 Not Found就是路径错误,400 Bad Request可能是JSON格式或请求头部有问题,200 OK才代表请求成功。 - 优化延迟逻辑:固定delay在网络状况差的时候容易失效,建议改成循环读取SIM900的串口输出,直到收到对应的响应(比如
CONNECT OK、>提示符)再执行下一步。
3. 额外注意事项
- SIM900的
AT+CIPSEND如果不指定长度,需要发送ASCII码0x1A(Ctrl+Z)来结束输入,用指定长度的方式更稳定,不会因为手动结束符丢失导致发送不完整。 - 如果你后续需要用HTTPS端口(443),SIM900需要额外的SSL配置,不过你当前用的是80端口(HTTP),暂时不用考虑这个。
内容的提问来源于stack exchange,提问作者Gla
相关产品推荐
相关产品推荐

