STM32F4搭配ESP-01向Firebase实时数据库发送数据失败求助
排查与解决STM32+ESP-01向Firebase Realtime Database发送数据失败的问题
核心排查方向:HTTP POST请求的合规性
Firebase实时数据库对HTTP请求格式要求严格,以下是高频错误点及修复方案:
1. 确认请求URL格式正确
Firebase POST请求的标准URL格式为:
https://<你的项目ID>.firebaseio.com/<数据路径>.json?auth=<你的授权密钥>
- 检查
HOSTAPP是否是完整的项目域名(比如xxx.firebaseio.com),且数据路径(比如/temp/data.json)是否在AT指令中正确拼接。 - 注意:授权密钥必须作为URL的查询参数携带,不能放在请求头里。
2. 补全必要的HTTP请求头
Firebase要求POST请求必须包含Content-Type: application/json,否则会拒绝解析请求体。完整的请求格式必须包含这些部分:
POST /temp/data.json?auth=你的密钥 HTTP/1.1 Host: xxx.firebaseio.com Content-Type: application/json Content-Length: <JSON内容的字节数> {"sensor":"temperature","value":25}
- 必须计算并填写
Content-Length,值为JSON payload的实际字节数(注意特殊字符的编码长度)。 - 请求头和请求体之间必须有空行分隔,这是HTTP协议的强制要求,很多AT指令发送时容易漏掉这一步。
3. 检查AT指令的发送流程
ESP-01的AT+CIPSEND指令有严格的使用逻辑:
- 发送
AT+CIPSEND=<总长度>后,必须等待模块返回>提示符,再发送完整的HTTP请求内容(包括头、空行、payload)。 - 确认发送的总长度等于HTTP请求的总字节数,避免长度不匹配导致数据截断。
4. 验证JSON payload的合法性
- 确保JSON字符串无语法错误,比如引号成对、逗号位置正确。你提供的示例
{"sensor":"temperature","value":25}是正确的,但如果是动态生成的JSON,要检查拼接时是否有额外空格或转义错误。 - Firebase只接受标准JSON格式,非法格式会直接返回
400 Bad Request。
5. 读取ESP-01的HTTP响应
发送请求后务必读取模块返回的响应信息,比如:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 ... {"name":"-Nxxxxxxxxx"}
- 返回
400说明请求格式错误;返回401说明授权密钥无效或数据库权限配置错误。
数据库权限配置检查
登录Firebase控制台,进入实时数据库的规则页面,确认当前规则允许写入操作。开发阶段可临时设置为:
{ "rules": { ".read": true, ".write": true } }
(上线后务必修改为安全的权限规则)
修正后的代码逻辑参考
void fireBaseConnectSend(char* host, char* authKey, char* jsonPayload) { // 构造完整请求路径 char requestPath[256]; sprintf(requestPath, "/sensor/data.json?auth=%s", authKey); // 计算JSON内容长度 int payloadLen = strlen(jsonPayload); // 拼接完整HTTP请求 char httpRequest[512]; sprintf(httpRequest, "POST %s HTTP/1.1\r\n" "Host: %s\r\n" "Content-Type: application/json\r\n" "Content-Length: %d\r\n" "\r\n" "%s", requestPath, host, payloadLen, jsonPayload); // 建立TCP连接 ESP_SendAT("AT+CIPSTART=\"TCP\",\"%s\",80", host); // 发送CIPSEND指令,指定总长度 ESP_SendAT("AT+CIPSEND=%d", strlen(httpRequest)); // 等待>提示符后发送完整请求 HAL_UART_Transmit(&huart2, (uint8_t*)httpRequest, strlen(httpRequest), HAL_MAX_DELAY); // 后续可添加读取响应的逻辑 }
调试技巧
- 用串口助手监听STM32发给ESP-01的所有指令和HTTP内容,对比标准格式找差异。
- 用curl工具直接测试请求是否有效:
curl -X POST -H "Content-Type: application/json" -d '{"sensor":"temperature","value":25}' "https://你的项目ID.firebaseio.com/sensor/data.json?auth=你的密钥"
如果curl能成功写入数据,说明问题出在STM32的请求构造或AT指令发送流程上。
内容的提问来源于stack exchange,提问作者JakutenSiz
相关产品推荐
相关产品推荐

