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请求的字节数与该值不匹配,会引发请求截断或多余字符,触发解析错误。
二、分步排查方案
修正Content-Length与请求体
将Content-Length改为18,确保与请求体长度一致:POST /sendData Host: 192.168.1.38 Content-Type: application/json Content-Length: 18 {"temperature":"25"}强制使用\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"}重新计算CIPSEND长度
计算上述完整请求的总字节数(包含所有\r\n),再在AT+CIPSEND中指定正确数值。比如上述示例的总长度为106,应使用AT+CIPSEND=106。添加后端调试日志
在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

