esp8266烧了mqtt的固件,怎么判断它能使用mqtt
作成日: 2025年4月26日
作成日: 2025年4月26日
esp8266烧了mqtt的固件,怎么判断它能使用mqtt
下面给你几种最简单也最可靠的方法,用来确认 ESP8266 在刷入带 MQTT 功能的固件后,确实已经能正常连上 MQTT 服务器并收发消息。
(以下假设你已经把 ESP8266 连上了本地 Wi-Fi,并知道它要去连的 MQTT Broker 的地址、端口、用户名和密码。)
把 ESP8266 接到串口工具
上电或软重启
固件若内建 MQTT 客户端,启动时通常会打印类似
textConnecting to WiFi... WiFi connected: 192.168.1.50 Connecting to MQTT... MQTT Connected Subscribing /test/topic ...
如果你能看到 “MQTT Connected” 或 return code = 0,就说明握手成功,固件确实在跑 MQTT。
本地回环测试
mosquitto_pub
往某个主题(如 /esp/test
)发消息需要 PC 端已装好 Mosquitto CLI(或其他 MQTT 客户端)
bash# ① 打开订阅端终端 mosquitto_sub -h 192.168.1.50 -t /esp/echo -v # ② 在 ESP8266 上的应用里把传感器数据 publish 到 /esp/echo # 串口会显示 “Publish ok” # ③ PC 端终端应该同步显示 payload
随后再反向测试:
bashmosquitto_pub -h 192.168.1.50 -t /esp/cmd -m "LED_ON"
如果 ESP8266 能马上响应(亮 LED 或串口打印),说明发布-订阅链路都通。
如果你用的是本地 Mosquitto:
/etc/mosquitto/mosquitto.conf
把 connection_messages true
打开。New client connected from 192.168.1.50 as esp8266-123456 (p2, c1, k60).
这就是服务器侧的佐证。项目 | 典型症状 | 解决思路 |
---|---|---|
Wi-Fi 没连好 | 串口反复打印 Connecting... | 核对 SSID/密码、信号强度 |
端口不对/被防火墙挡 | 无法握手,错误 RC = 5 | 确保 Broker 在 1883(或你设的端口)且防火墙已放行 |
TLS/SSL 配置不匹配 | 握手失败、证书错误 | 统一用非加密 1883 先排错,再上 8883/SSL |
Client ID、用户名冲突 | server kick 掉旧连接 | 改唯一 ID 或关闭 “clean session” |
只要能在串口里或 Broker/App 里看到 “MQTT Connected” + 成功的收发,就证明固件的 MQTT 功能是 OK 的。
按上面任何一种方法验证通过,你就可以放心把业务逻辑往 ESP8266 里加了。祝调试顺利!
烧了固件就能用了吗
不一定。
把 ESP8266 的 MQTT 固件「烧」进去只是第一步——相当于给单片机换了一个能说 MQTT “语言”的大脑,但它要想真正工作,还得能“找到 Wi-Fi、找到 Broker、学会说暗号”。下面是烧完之后必须再做、或者至少要确认的几件事:
环节 | 还需要做什么 | 没做好的常见现象 |
---|---|---|
Wi-Fi 配网 | 在固件配置文件、Web 配网页或 AT 指令里填对 SSID/密码 | 开机后串口/日志一直 Connecting to WiFi... |
Broker 信息 | 把 MQTT 服务器 IP/域名、端口、用户名、密码写进去 | MQTT connect failed, RC= -2/-4/5 等错误码 |
Client ID / Topic 设计 | 设唯一的 Client ID,规划要订阅/发布的主题 | Broker 日志提示 “client id not unique”、消息收不到 |
QoS、Keep-alive、SSL 证书 | 需按实际网络状况与安全要求调 | 时不时掉线、握手失败 |
业务代码 | 写 loop() 或回调,把订阅的指令解析、把传感器数据 publish | 能连上但“什么都不做” |
换句话说:
烧固件 → ⭕ 基础能力具备;
配置参数 + 写业务 → ⭕⭕ 才能真正“能用”。
mosquitto_sub/pub
做回环:ESP 发布 /hello,PC 收得到;PC 发 /cmd,ESP 串口能打印。这样就能一步步确认“固件本身 OK ➜ 参数 OK ➜ 环境 OK ➜ 业务 OK”。
如果你已经烧好固件但连第一步都没通过,告诉我你看到的串口日志/错误码,我帮你一起排查。
能连上wifi
好,既然 ESP8266 已经成功拿到 Wi-Fi IP,下一步就是确认 MQTT 连接是否真正建立。下面给你一条最省事的“快检通道”;如果任何一步出问题,再把日志贴给我一起排:
步骤 | 要做什么 | 如何判断成功 |
---|---|---|
① 写入 Broker 参数 | 把 MQTT 服务器的 IP/端口/用户名/密码/ClientID 填到固件里(不同固件位置不一样,见下) | 参数保存后重启,串口里出现 “Connecting to MQTT…” |
② 看串口握手结果 | 接串口调试器,波特率通常 74880 或 115200,重启板子 | 串口打印 MQTT connected, rc=0 / OK,CONNECT / CONNACK 0 等字样 |
③ 做回环测试 | 在 PC 上装 Mosquitto CLI:<br>mosquitto_sub -h <brokerIP> -t /esp/test -v <br>让 ESP 执行 publish("/esp/test","hello") | PC 终端马上显示 hello |
④ 反向下行测试 | PC 端执行:<br>mosquitto_pub -h <brokerIP> -t /esp/cmd -m "LED_ON" | 串口里打印收到的 payload,或板载 LED 亮起 |
⑤ 长跑观察 | 让它空跑 5-10 分钟,看有没有自动掉线重连 | 串口里保持静默或偶尔心跳,无反复 “reconnect” |
前三步全绿灯,就说明固件的 MQTT 功能是正常可用的。
固件类型 | 入口/命令 | 示例 |
---|---|---|
Espressif AT 固件 ≥ v2.1 | 串口 AT 指令 | AT+MQTTUSERCFG=0,1,"esp01","user","pass",0,0,""\r\r\nAT+MQTTCONN=0,"192.168.1.2",1883,0\r\r\n |
NodeMCU / Lua | init.lua 或 WebIDE | m = mqtt.Client("esp01", 60, "user", "pass") m:connect("192.168.1.2",1883) |
Tasmota | WebUI → Configuration ▸ Configure MQTT | 依次填 Host / Port / User / Password / Client |
ESPHome | my_esp.yaml | mqtt: broker: 192.168.1.2 username: user password: pass |
返回码/现象 | 含义 | 处理办法 |
---|---|---|
rc = -2 / DNS fail | Broker 域名解析不到 | 用 IP 测试或检查 DNS |
rc = 5 / Not authorized | 用户名/密码/ACL 错 | 核对账号、Topic 权限 |
不停 reconnect | Keep-alive 太短 / Wi-Fi 波动 | 把 keepalive 调到 60 s ↑,检查信号 |
如果你已经按表格设好 Broker 参数但串口里看不到 “MQTT connected, rc=0”,请把串口完整日志、所用固件名称和你发的配置命令贴出来,我再帮你定位具体问题 💪
AT+MQTTUSERCFG的参数是什么
AT+MQTTUSERCFG 命令格式
AT+MQTTUSERCFG=<LinkID>,<scheme>,<"client_id">,<"username">,<"password">,<cert_key_ID>,<CA_ID>,<"path">
作用:一次性写入 MQTT 连接必需的 8 个核心字段。设备返回
OK
即代表保存成功。Espressif Docs
参数 | 含义 | 典型取值 | 备注 |
---|---|---|---|
<LinkID> | 连接序号 | 0 | 目前仅支持单连接 |
<scheme> | 连接类型 | 1-10 | 1=TCP;2-5=TLS;6-10=WebSocket(见下表)Espressif Docs |
"client_id" | MQTT Client ID | esp8266-01 | ≤256 字节。需全局唯一 |
"username" | 用户名 | user1 | ≤64 字节 |
"password" | 密码 | pass1 | ≤64 字节 |
<cert_key_ID> | 客户端证书 ID | 0 | 仅 TLS/双向认证时用,ESP 当前只认 0 |
<CA_ID> | CA 证书 ID | 0 | TLS 服务器验证时用,ESP 当前只认 0 |
"path" | WebSocket 路径 | "/mqtt" 或 "" | 仅 scheme 6-10 时需要 |
<scheme>
对照表值 | 协议 | 是否验证服务器证书 | 是否发送客户端证书 |
---|---|---|---|
1 | MQTT over TCP | ✗ | ✗ |
2 | TLS - 不验证 | ✗ | ✗ |
3 | TLS - 验证服务器 | ✔ | ✗ |
4 | TLS - 客户端证书 | ✗ | ✔ |
5 | TLS - 双向验证 | ✔ | ✔ |
6 | WebSocket (TCP) | ✗ | ✗ |
7 | WSS - 不验证 | ✗ | ✗ |
8 | WSS - 验证服务器 | ✔ | ✗ |
9 | WSS - 客户端证书 | ✗ | ✔ |
10 | WSS - 双向验证 | ✔ | ✔ |
textAT+MQTTUSERCFG=0,1,"esp01","demo","123456",0,0,""
textAT+MQTTUSERCFG=0,3,"esp01","secure","p@ss",0,0,""
textAT+MQTTUSERCFG=0,10,"ws01","iotuser","iotpass",0,0,"/mqtt"
写完后 再执行
textAT+MQTTCONNCFG=0,60,0,"lwt","offline",0,0 // 可选:Keep-alive、LWT 等 AT+MQTTCONN=0,"broker.hivemq.com",1883,1 // 真正去连服务器
正常会看到
+MQTTCONN:0,4,...
表示已建立连接。
client_id/username/password
太长,可先用此命令占位,再分别用 AT+MQTTCLIENTID / AT+MQTTUSERNAME / AT+MQTTPASSWORD
或 “LONG” 版本写入长字段。Espressif DocsMQTTUSERCFG
里引用。AT+MQTTUSERCFG?
可随时查看当前保存的 8 个字段内容。照着上面填完并连通 AT+MQTTCONN
后,就能进入订阅/发布阶段 (AT+MQTTSUB
, AT+MQTTPUB
等)。如果还有返回码或连接问题,把日志贴出来我再帮你分析。
AT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D",0,0,""
ERROR
pythonpassword = "version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D" len(password) 127
pythoncmd = 'AT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","'+password+'",0,0,""' len(cmd) 179
ERROR
并不是语法写错,而是参数超限。
官方文档对 AT+MQTTUSERCFG 有如下硬性限制 Espressif Documentation
字段 | 最大长度 |
---|---|
client_id | 256 B |
username | 64 B |
password | 64 B |
整条指令 | 256 B(含 AT+… 本身) |
你传进去的 password
version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D
实际长度 127 B,已经超过 64 B,所以固件直接返回 ERROR
(内部错误码是 AT_MQTT_PASSWORD_IS_OVERLENGTH
,但默认不会打印出来)。
用一个占位密码把配置写进去
textAT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,"" OK
这里的
"x"
只是占位,长度 < 64 B 即可。
再把真正的长密码写进来(最长 256 B)
textAT+MQTTPASSWORD=0,"version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D" OK
如果日后需要改 client_id
或 username
超过 64 B,同理用
textAT+MQTTCLIENTID=0,"your_long_clientid" AT+MQTTUSERNAME=0,"your_long_username"
继续常规流程
textAT+MQTTCONNCFG=0,60,0,"","",0,0 // KeepAlive 60 s,可选 AT+MQTTCONN=0,"broker.example.com",1883,1
项目 | 限制 | 超限现象 |
---|---|---|
指令总长度 | 256 B | 也会直接 ERROR |
path 字段 | 32 B | 若用 WebSocket 必须留意 |
Wi-Fi NTP 时间 | Aliyun IoT 这类“长密码”里嵌了过期时间 (et= ),设备时钟偏差太大会导致登录失败 |
按上面步骤把长密码拆成两条指令写入即可通过,后续 AT+MQTTCONN
就能正常握手了。
我这个是在串口助手发送的
明白,你是在 Windows 或 macOS 用串口调试助手(SSC-OM、SecureCRT、Arduino Serial Monitor 等)直接手敲指令,对吧?
用这些工具可以完全做到,只要注意下面 3 个细节,就不会再碰到 “ERROR”:
关键点 | 具体怎么做 | 常见坑 |
---|---|---|
1 指令必须以 CR+LF 结尾 | 在大多数助手里把 “发送新行” 选为 CR+LF 或 \r\n。<br>如果没有这个选项,就在指令末尾手动按 Enter(它会自动附带 CRLF)。 | 只发 LF 或只发 CR 会被 AT 固件当作不完整指令,返回 ERROR 。 |
2 先发短占位,再发长密码 | 在发送区一次输入:<br>AT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,"" <br>→ 按 Enter,看到 OK 。<br>然后粘贴完整长密码:<br>AT+MQTTPASSWORD=0,"version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D" <br>→ 再 Enter。 | 把两条合并成一条会超 256 字节上限;或者直接把长密码塞进 MQTTUSERCFG 会超 64 字节上限。 |
3 关闭自动换行/插入空格 | 许多中文 “串口调试助手” 默认在 80/120 列处给你插回车或空格来“美观显示”。请把 “自动换行” / “格式化显示” 关掉,或勾选 “发送原始数据”。 | 长字符串被自动折行 → 固件收到的其实是两条指令,自然 ERROR 。 |
🌟 一句口诀:
短占位 → OK → 长密码 → OK,两次回车,每次都看见OK
才算写入成功。
AT+MQTTUSERCFG?
SmartLed
、T1gRn3G57q
和占位 "x"
。AT+MQTTPASSWORD?
都正确后,再照顺序发:
textAT+MQTTCONNCFG=0,60,0,"","",0,0 AT+MQTTCONN=0,"your.broker.ip",1883,1
串口出现
+MQTTCONN:0,4
或
+MQTTCONNECTED:0
就说明握手成功。
ERROR
,请再确认AT+MQTTPASSWORD
。先发 AT+GMR
看固件日期。AT+MQTTPASSWORD=0,""
一共约 170 字节,没问题;如果再长就要考虑用文件系统方式存证书。还有疑问的话,把你在串口窗口里完整的收发日志(从你输入到返回)复制给我,我帮你逐行看。
AT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,""
busy p...
busy p...
busy p...
busy p...
ERROR
pythoncmd = 'AT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,""\r\n' len(cmd.encode()) 55
busy p…
的含义是 “AT 固件正在处理之前的事务,目前拒绝接收新指令”。这是 ESP-AT 返回的一种系统消息,而不是语法错误。Espressif Docs
出现这一行再跟 ERROR
,通常有以下几种原因,对应的解决办法也不一样——
场景 | 触发原因 | 快速排查 & 解决办法 |
---|---|---|
① 前一条指令还没结束就又发了一条 | 串口助手把 CR/LF 又插了一次,或者脚本循环过快 | - 在助手里把“自动换行/自动发送新行”关掉,只保留 \r\n 一次<br>- 手动:** 打一条指令 → 等看到 OK /ERROR → 再发下一条**(间隔 ≥100 ms)fanmimi.com |
② 模块正自动重连旧的 MQTT 会话 | 之前配置过 AT+MQTTCONN ,现在还在后台尝试握手 | 复位或干净释放:<br>```text |
AT+MQTTCLEAN=0 // 断开并释放资源 | ||
AT+RST // 或直接硬件复位 | ||
// 出现 ready 后再重新发配置 |
text| **③ 固件版本太老,MQTT 命令已被识别但执行异常** | 早于 **AT v2.x** 的 ESP8266 固件没有完善的 MQTT 栈 | ```text AT+GMR // 查看版本 ```<br>若版本低于 2.0.x,请刷入 **带 MQTT 功能的 v2.2.0 或更新版 BIN**,再重试。[CSDN Blog](https://blog.csdn.net/weixin_54781965/article/details/137071662) | | **④ 供电/波特率问题导致解析超时** | 3.3 V 电流不足或波特率设置错 | - 确认 3.3 V≥300 mA,稳压芯片有余量<br>- ESP-AT 默认 115200 bps;上电日志是 74880 bps | --- ## 建议的“零报错”流程 1. **完全复位一次** ```text AT+RESTORE // 恢复出厂参数(如不想清 NVS 可跳过) AT+RST // 软复位
等串口只剩 ready
,且 无 busy p… 输出后再继续。
一次写入 8 个基础字段(先用短占位密码,避免超长错误)
textAT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,""
→ 返回 OK
单独写⻓密码
textAT+MQTTPASSWORD=0,"version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D"
→ 返回 OK
(可选)检查是否写入成功
textAT+MQTTUSERCFG? AT+MQTTPASSWORD?
继续 AT+MQTTCONN …
连接服务器,随后做订阅/发布测试。
只要步骤 ① 后串口不再出现 busy p...
,后续配置与连接就会顺利通过;若 刚重启就不停输出 busy p…,基本可以断定还有旧 MQTT 会话未清理或固件版本不支持,按表格 ②/③ 处理即可。祝调通!
还是不行
busy p…
+ ERROR
一直出现,说明 ESP8266 里的任务始终占着 MQTT 资源,新的 AT 指令根本来不及执行。要把“忙”状态解除,必须先搞清楚到底是谁在后台占线。下面给你一份彻底排障脚本(一步都别跳),并请你把 粗体步骤输出的完整串口日志 贴回来,我再帮你定位:
硬件最小系统
查看固件版本
textAT+GMR
请复制贴出完整返回。ESP-AT v2.1.0 及以上才支持分条写长密码。
整板重新上电 → 等出现
ready
→ 立刻 重复执行下列 3 条指令(每条都要拿到OK
,中间不要插别的):
textAT+MQTTCLEAN=0 // 若返回 ERROR 忽略 AT+RESTORE // 恢复出厂配置 AT+RST // 软复位,看到 ready 停止发送
多数情况下,busy p…
到这里就消失了;如果复位后仍然循环刷 busy p…
,说明固件有 BUG 或闪存坏数据——直接 重新烧写最新版 ESP-AT(含 MQTT)整套 BIN 会最快解决。
重新连 Wi-Fi(确认返回 WIFI CONNECTED / GOT IP
)
textAT+CWJAP="你的SSID","你的WIFI密码"
一次写 8 个字段(用占位密码)
textAT+MQTTUSERCFG=0,1,"SmartLed","T1gRn3G57q","x",0,0,""
写入长密码
textAT+MQTTPASSWORD=0,"version=2018-10-31&res=products%2FT1gRn3G57q%2Fdevices%2FSmartLed&et=1956499200&method=sha1&sign=YScT2YFKeMLzTF2EelmhRmCGpsU%3D"
检查是否写进去了
textAT+MQTTUSERCFG? AT+MQTTPASSWORD?
真正去连 Broker(先用本地无证书 TCP 试验)
textAT+MQTTCONN=0,"broker.hivemq.com",1883,1
+MQTTCONNECTED:0
、OK
;+MQTTCONN:0,<err>
,把整个行贴给我。busy p…
,请回传以下信息rst cause
、ready
、任何 busy p…
)。我会据此判断是:
AT+RESTORE
无效,需 erase_flash 重刷);把日志贴出来,我们一步步把锅揪出来 👍
AT version:1.2.0.0(Jul 1 2016 20:04:45)
SDK version:1.5.4.1(39cb9a32)
Ai-Thinker Technology Co. Ltd.
v1.5.4.1-a Nov 30 2017 15:54:29 刷了mqtt固件库还是这个正常吗
不正常。
你的模组根本没刷上带 MQTT 的新版固件,而是仍在跑 2016 年的 Ai-Thinker AT 1.2(Non-OS),这套固件里压根儿没有 AT+MQTT...
指令,所以只要你发这些指令就会出现 busy p…
➜ ERROR
。
关键信息 | 说明 |
---|---|
AT+GMR 回显 | AT version:1.2.0.0 (Jul 1 2016) <br>SDK version:1.5.4.1 … —— 这是 老版 Non-OS AT,最后一次更新是 2017-11-30 |
MQTT 命令首次出现 | 官方 ESP-AT ≥ v2.0 才加入 AT+MQTTUSERCFG/CONN/... 等指令Espressif Documentation CSDN Blog |
最新支持 ESP8266 的版本 | ESP-AT v2.2.2.0 (2024-03-26),zip 包里已带好 MQTT 功能GitHub |
下面以 2 MB Flash 的常见 ESP-12/ESP-WROOM-02 为例;如果你是 1 MB / 4 MB 芯片,只要换成对应的 factory.bin 即可。
ESP-WROOM-02-AT-V2.2.2.0.zip
GitHubfactory/ESP8266_WROOM-02.bin
(一个约 1.1 MB 的整合包)。bashesptool.py --port COM3 --baud 460800 erase_flash
必须先 erase,否则旧固件残留的 NVS 区会继续把 MQTT 任务拉起来,导致你又看到
busy p…
。
bashesptool.py --port COM3 --baud 460800 \ write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB \ 0x0 factory/ESP8266_WROOM-02.bin
--flash_size
改成 1MB / 4MB 视你的模块而定。factory/…bin
选到地址 0x00000
即可,其他地址留空。表示固件真正换新。textready AT version:2.2.2.0(…) SDK version:...
AT+CMD
可以看到完整指令列表,其中就包括AT+MQTTUSERCFG
, AT+MQTTLONGPASSWORD
, AT+MQTTCONN
, …OK
。问题 | 处理 |
---|---|
UART 引脚变了? | ESP-AT v2.x 默认仍然用 UART0(GPIO1/3),与你当前接线一致;只有 ESP32 系列才改到 GPIO15/13。 |
1 MB 芯片没官方包? | 在 release/v2.2.0.0_esp8266 分支的 CI Artifact 里找 esp8285-1MB-at ,里面同样有 factory.bin 可烧Espressif Documentation。 |
busy p... 依旧 | 说明你没擦干净或 USB 供电不足;先 erase_flash ,再确保 3.3 V ≥ 300 mA。 |
想自定义分区/证书 | 别用 factory.bin,而是按包内 download.config 多文件烧录,或者自己编译。 |
结论
看到AT version:2.2.x.x
并能执行AT+MQTTUSERCFG
才算真正“刷上 MQTT 固件”。只要一步:擦干净 ➜ 烧官方 ESP-AT v2.2 的 factory.bin,你的问题就能解决。祝刷新顺利!
烧录完mqtt固件后,版本没有变化正常吗
不正常。
刷入真正带 MQTT 功能的 ESP-AT 新固件后,AT+GMR
一定会显示新的 AT version ≥ 2.x(例如 AT version:2.2.2.0(…2025-03-26)
)——因为 MQTT 指令只在 2.x 系列才加入。仍然停在 AT version:1.2.0.0
说明旧固件仍在 Flash 的启动分区里,新的镜像根本没被 MCU 启动。Espressif Documentation GitHub
类别 | 典型原因 | 如何验证 | 解决办法 |
---|---|---|---|
烧录步骤 | • 只写了 user1.bin 等“增量包”<br>• 地址没对准 0x0000 <br>• Flash 未 erase | 用 flasher 日志确认是否真写到 0x0000 ,并且写入大小≈1 MB | esptool.py erase_flash → 把 factory/ESP8266_WROOM-02.bin 写到 0x0 (或用官方 Flash Download Tool 勾选 “Factory”) Espressif Documentation |
启动 fallback | 校验失败 → Bootloader 退回旧映像 | 上电时 74880 bps 日志会提示 “invalid head” | 确保 --flash_mode dio --flash_freq 40m --flash_size 与芯片实际匹配;写完务必掉电重启 |
未进下载模式 | GPIO0 没拉低,实际上根本没写进去 | 烧录时看不到 “Writing at 0x000000…” | 烧录前:GPIO0→GND、EN→3V3,再上电;烧完松开 GPIO0 |
容量不匹配 | 用 2 MB 镜像烧到 1 MB 芯片 | 烧录日志正常,但复位进不了系统 | 换成 release 页面里 esp8285-1MB-at 或自己编译 1 MB 版 Espressif Documentation |
电源/串口问题 | 烧录 OK,但上电电压掉、波特率错 | 复位后乱码、频繁重启 | 3.3 V≥300 mA,波特率 115200 8N1 |
bash# 1. 擦除整片 esptool.py --port COM3 erase_flash # 2. 烧入官方一体化 factory 镜像(以 2 MB 模块为例) esptool.py --port COM3 --baud 460800 \ write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB \ 0x0 ESP8266_WROOM-02-AT-V2.2.2.0/factory/ESP8266_WROOM-02.bin
换 1 MB / 4 MB 模块时只改 --flash_size
并使用对应的 factory.bin。
烧完 断电 → 恢复 GPIO0,再上电:
textready AT version:2.2.2.0(...) SDK version:3.x
此时 AT+MQTTUSERCFG
, AT+MQTTCONN
等命令均能正常返回 OK
,之后再按“占位密码 → 长密码”方式配置 MQTT。GitHub
烧录好几次版本号都没变
连续刷了几次版本号仍停在
AT version:1.2.0.0 (Jul 1 2016)
→ 固件实际上一次都没有被写进去。
99 %的情况都是“烧录流程某一步没真正执行”,而不是镜像本身有问题。下面按“排线 → 擦除 → 写入 → 验证”给你一个零死角的检查表,照做一次基本就能找出卡点。
必须状态 | 典型接法 |
---|---|
GPIO0 → GND(低电平) | 把模块的 GPIO0 短接到 GND,再给板子上电或按 RST |
EN/CH_PD → 3 V3 | 始终保持高电平 |
TX ↔ RX 交叉接 USB-TTL(3 V3 级) | 波特率先设 115 200 8N1 |
供电 ≥ 300 mA、3 V0 – 3 V6 | 手机充电器 + AMS1117 很容易掉压,最好用稳压模块 |
自测:GPIO0 拉低上电后,用
bashesptool.py --port COM3 flash_id
能返回 Manufacturer, Device ID 就证明你已在“下载模式”。如果连这一条都握不到手,线/供电肯定有问题。
bashesptool.py --port COM3 erase_flash
看到
Chip erase completed successfully in …
才算真正清空。没先 erase_flash
,旧 1.2 固件就会继续保留(因为它仍然在 0x0000 区)。
以 2 MB(16 Mbit)Flash 的 ESP-12F / WROOM-02 为例:
bashesptool.py --port COM3 --baud 460800 \ write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB \ 0x0 ESP8266_WROOM-02-AT-V2.2.2.0/factory/ESP8266_WROOM-02.bin
0x00000
, 文件选 factory.bin,记得先勾 “Erase Flash”。ready
。textAT+GMR
成功:
textAT version:2.2.2.0(…2024-03-26) SDK version:3.x.y
失败:还显示 1.2 或直接乱码 → 回到步骤 1 / 2 重查。
排障点 | 现象 | 处理 |
---|---|---|
① 没进下载模式 | esptool.py flash_id 报 “Failed to connect” | 重新拉低 GPIO0,再复位;部分开发板得按住 FLASH 键上电 |
② 写入地址错 | 烧录日志里地址不是 0x000000 | 写入命令一定要 0x0 factory/…bin |
③ Flash 模式/频率不符 | 上电 74880 日志出现 invalid head 0x?? | 把 --flash_mode 改成 dout 再试;个别旧板子只认 dout 40m |
④ 容量不符 | 烧录 OK,复位后死循环重启 | 1 MB 芯片却烧 2 MB 镜像;换下载页里 esp8285-1MB-at 的 factory.bin |
⑤ 供电掉压 | 烧录时一到 50 % 就断,或复位后花屏 | 给 3 V3 端并个 470 µF 电容,或改用 5 V→3 V3 DC-DC |
--verify
:
写完会自动把 Flash 读回校验。bashesptool.py --port COM3 write_flash --verify … 0x0 factory.bin
看到bashesptool.py --port COM3 read_flash 0x0 0x40 header.bin hexdump -C header.bin
E9 04 00 00
这样的新头标,就说明新镜像真在 0x0 了。AT version:1.2.0.0
为 2016 年 Ai-Thinker 非 MQTT 固件 Arduino Forum Stack OverflowAT+GMR
显示 2.x。AT+MQTTPASSWORD
”配置 MQTT。