v4.0.11.9 — NVS 0 noise + TWDT/stack 7 fix + TRUE 拼接 + 8MB 救砖
修复 (v4.0.6 → v4.0.11.9 五批 5 commit)
v4.0.6 — NVS / Web / Dashboard P0 批次 (commit 865402c)
- NVS 找不到值 4 个 bug 批次:loadConfig 静默失败、AP 模式 dashboard 裸奔、按钮事件丢失、1970 时间戳
- NTP 真实时间:接
esp_netif_sntp_init+ntp.aliyun.com,时区 CST-8,/api/status新增deviceTimeMs/timeSynced - 恢复出厂:
/api/factory→nvs_flash_erase()+ restart 进 AP 模式 - /send 历史清空 + WiFi 扫描下拉
v4.0.8 — PDU 解码 5 修 + 8MB 救砖 + 凭据硬编 (commit a14bf3b)
- 8MB 救砖:board_upload.flash_size=8MB + 双 OTA partitions,efuse 实测 8MB 但老 config 当 4MB → bootloader 校验越界 boot loop
- 凭据硬编占位符:
YOUR_WIFI_SSID/YOUR_WIFI_PASS/YOUR_PUSHPLUS_TOKEN,首次烧必须 web 配网 - PDU 解码 5 修:UCS-2 高半区 surrogate-pair 边界、7-bit UDL padding、phone 短号短长度 bug、SCA 长度越界、TP-DCS 0xC0/0xF8 表格
- C++ host test 大扩:607 行新测试用例,绑定生产 pdu_codec.cpp 跑 (v3.6 Python 模拟弃用)
v4.0.9 — concat pdu_udh_offset 真定位 UDH 头 + nvsSentList 性能 (commit 3bc2798)
- pdu_udh_offset 搜索范围 从 0 → UDH 起点,SCA 含 '0804'/'0003' 不再误识别为 concat IE
- nvsSentList 性能:
isKey("s0")早返空 history(本批 v4.0.11.9 完整闭环)
v4.0.11.2 — TRUE 拼接 5 P0 批次 (commit 42c0a8a)
- 字母数字 sender("True App") 长短信拼接:UDH 头 6 字节 IE 正确解析 (ref/total/seq),UDH 范围限定不再覆盖 SCA
- TRUE 拼接边界 bug:中间 seq 缺失时不再误拼接
- host test 增 148 行 覆盖 UDH 边界用例
v4.0.11.9 — NVS noise 0 + TWDT/stack 7 fix 批次 (commit d71debc)
- TWDT 踢 cmgs_worker + net_task (v4.0.11.3):10-30s 长阻塞,5s TWDT 会触发 esp_restart;在 setup() 创完 task 后统一踢出 (task 体内 delete 报 "task not found")
- nvsQNoteErr pcTaskGetName trace (v4.0.11.5):5s 节流日志加 task 名,定位刷屏源
- nvsQSanityCheck lazy create pqueue (v4.0.11.6):工厂清 NVS 后 namespace 不存在 → readwrite 写 head=0 count=0,5s readonly begin 不再刷 NOT_FOUND
- csq_poll stack 2048→4096 (v4.0.11.7):boot 35s 实测 overflow,4096 同 usb_rx
- nvsEnsureNamespace 复用 (v4.0.11.8):lazy create cfg + sent namespace,防 loadConfig + nvsSentList 刷 NOT_FOUND
- nvsSentList isKey("s0") 早返 (v4.0.11.9):isKey 走 nvs_get_str 不 log_e vs getString ESP_LOGE,空 history 不再 32 sX NOT_FOUND 刷屏
修复效果 (v4.0.11.9 实测)
- ✅ 60s-once 32 sX NOT_FOUND noise: 从每次 32 行 → 0 行
- ✅ 5s steady-state pqueue NOT_FOUND: 0 行
- ✅ csq_poll boot 35s stack overflow: 修
- ✅ TWDT 5s esp_restart: 修
未修 (后续批次)
- 4 P0 (code-review-p0-pre-flash):
- UAF on cmgs_send_pdu_async timeout
- check_dashboard_auth 永久 true (6 个 POST 端点裸奔)
- smsRateLimitOk 死代码 (
return true+if (false && !...)短路) - handleApiCfgPost 无输入验证 (空 SSID / token<16 / otaPass<4 都收)
- 1 P1 PLAUSIBLE: pdu_udh_offset 搜索区域未限定 (本 v4.0.9 部分修, 待二次复查)
- 1 死代码: g_cmgsJobSem 未初始化声明
验证
- C++ host test: 86/86 pass(
tests/host/,绑定pdu_codec.cpp生产代码) - 实机 v4.0.11.9 (boot #73): 60s NVS noise = 0,OTA 3.6s 烧完,板子稳定运行 4.6 min+
重要:首次使用请 web 配网
固件默认 WiFi/token 改为占位符 YOUR_WIFI_SSID / YOUR_WIFI_PASS / YOUR_PUSHPLUS_TOKEN,首次烧录后必须走 AP 配网页面(SMS-Forwarder-XXXXXX,密码 12345678,192.168.4.1)填写真实凭据。
如 NVS 已有配置(OTA 升级场景),配置直接保留,无需重新配网。
资产
| 文件 | SHA-256 | 大小 |
|---|---|---|
v4.0.11.9.factory.bin |
0d6a1a5323c310c10664388eba2918d1e192ab85bf082c488f9707f5146fadf5 |
1,280,576 bytes |
构建来源
- Commit:
d71debc6ea9ed3de1f62e28fa584babc510e0ddd - 平台: pioarduino 55.03.39 (IDF 5.5 + Arduino-ESP32 3.x)
- Flash: 1,280,576 bytes (38% of 3.3MB app partition, 8MB dual-OTA)