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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:05:55