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

ESP-01发送AT指令至后端服务器报400错误,寻求解决方案

问题排查与解决方案

一、核心问题定位:HTTP请求格式错误

400 Bad Request是因为ESP发送的HTTP请求不符合协议规范,主要存在以下几个关键点:

1. Content-Length值不匹配

你指定的Content-Length: 20,但实际请求体{"temperature":"25"}的字符数为18(包含大括号、引号),长度不匹配会导致后端JSON解析失败。

2. HTTP请求换行符不规范

HTTP协议要求每一行头部(含请求行)必须以\r\n(回车+换行)结尾,且头部与请求体之间必须是两个连续的\r\n。当前AT指令中的换行可能仅为单纯的\n,导致后端无法正确解析请求结构。

3. CIPSEND长度计算错误

你指定AT+CIPSEND=113,但实际整个HTTP请求的字节数与该值不匹配,会引发请求截断或多余字符,触发解析错误。

二、分步排查方案

  1. 修正Content-Length与请求体
    将Content-Length改为18,确保与请求体长度一致:

    POST /sendData 
    Host: 192.168.1.38
    Content-Type: application/json
    Content-Length: 18
    
    
    {"temperature":"25"}
    
  2. 强制使用\r\n作为换行符
    STM32发送AT指令时,每一行结尾必须添加\r\n,包括请求行、头部行,以及头部和请求体之间的两个\r\n。完整请求内容示例:

    POST /sendData\r\n
    Host: 192.168.1.38\r\n
    Content-Type: application/json\r\n
    Content-Length: 18\r\n
    \r\n
    {"temperature":"25"}
    
  3. 重新计算CIPSEND长度
    计算上述完整请求的总字节数(包含所有\r\n),再在AT+CIPSEND中指定正确数值。比如上述示例的总长度为106,应使用AT+CIPSEND=106。

  4. 添加后端调试日志
    在Node.js接口中添加日志,打印原始请求以定位格式问题:

    // 临时替换express.json()为raw格式查看原始请求
    app.use(express.raw({ type: 'application/json' }));
    app.post('/sendData', (req, res) => {
        console.log('Raw request body:', req.body.toString());
        try {
            const data = JSON.parse(req.body.toString());
            console.log('Parsed data:', data);
            // 原有Firebase写入逻辑...
        } catch (err) {
            console.error('JSON parse error:', err);
            res.status(400).send('Invalid JSON');
        }
    });
    

三、更优解决方案

1. 使用ESP-01的HTTP AT指令(固件支持情况下)

若ESP-01固件支持AT+HTTPPOST,可直接简化流程,无需手动拼接HTTP请求:

AT+CWMODE=1
AT+CWJAP="SSID","PASSWORD"
AT+HTTPCFG="URL","http://192.168.1.38:6355/sendData"
AT+HTTPCFG="CONTENT_TYPE","application/json"
AT+HTTPPOST=18
> {"temperature":"25"}

注:不同厂商固件的HTTP指令格式可能有差异,需参考对应文档。

2. 简化后端接口,改用GET请求

针对简单数据场景,改用GET请求可避免JSON解析问题:

  • 后端修改:
    app.get('/sendData', (req, res) => {
        const temperature = req.query.temperature;
        if (!temperature) return res.status(400).send('Missing temperature');
        db.ref('bme280').push({ temperature })
            .then(() => res.send('OK'))
            .catch(err => {
                console.error(err);
                res.status(500).send('Error');
            });
    });
    
  • ESP的AT指令:
    AT+CIPSTART="TCP","192.168.1.38",6355
    AT+CIPSEND=56
    GET /sendData?temperature=25 HTTP/1.1
    Host: 192.168.1.38
    Connection: close
    
    
    

3. 升级ESP-01固件支持TLS 1.2

部分第三方ESP-01固件(如乐鑫官方新版AT固件)已支持TLS 1.2,刷入后可直接对接Firebase实时数据库REST API,无需后端中转。

内容的提问来源于stack exchange,提问作者JakutenSiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 14:19:04