Files
qianbian/docs/superpowers/plans/2026-07-24-eink-4.2-reverse.md
T

172 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 4.2寸 e-ink 设备逆向与本地化改造 · 总体实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking.
> 工作准则见根目录 `GOVERNANCE.md`;进度记录于 `PROGRESS.md`。
**Goal:** 摸清 4.2寸墨水屏设备(DA14585 BLE SoC)软硬件架构,交付离线可用的 agent 友好 CLI 上位机,并获得固件级可控能力。
**Architecture:** 三条证据线(Web 上位机 JS / Android APK / DA14585 固件镜像)互证还原 BLE GATT 协议与图像协议 → 以 Python+bleak 实现离线 CLI(JSON I/O,面向 agent)→ 固件镜像解析/修改/SUOTA 工具链实现软硬件可控。
**Tech Stack:** Python 3.12、bleak(BLE)、Pillow(图像抖动)、jadx/androguard(APK)、capstone(固件反汇编)、pytest。
## Global Constraints
- 交付物运行**零互联网依赖**(仅本机 BLE)。(任务说明 目标2)
- CLI 面向 agent:所有命令支持 `--json` 机器可读输出。
- 功能集必须先对齐 Web 上位机现有功能,再谈增强。(任务说明 目标2)
- 固件指 DA14585 镜像;可控 = 能解析、能修改、能重生成可烧录镜像、SUOTA 流程文档化。(任务说明 目标3 + GOVERNANCE G4)
- `app/` 原始输入只读;所有结论须附证据。
---
## 阶段总览与门禁
| 阶段 | 内容 | 门禁 |
|------|------|------|
| P0 | 治理+工具链 | git 就绪;jadx/androguard/capstone/bleak 可用 |
| P1 | 三线逆向(Web→APK→固件) | G1:architecture.md + protocol.md,三线互证 |
| P2 | CLI 上位机(功能对齐) | G2、G3:测试全绿,功能清单逐项覆盖 |
| P3 | 增强 + 固件可控 | G4、G5:镜像工具+SUOTA 文档;离线验收 |
---
## P0:工具链(Task 1)
### Task 1: 分析环境搭建
**Files:**
- Create: `requirements.txt`, `tools/check_env.py`
- [x] Step 1: 创建 venv 并安装依赖
```bash
python3 -m venv .venv && .venv/bin/pip install -q --upgrade pip
.venv/bin/pip install bleak pillow pytest capstone androguard
apt-get install -y jadx 2>/dev/null || (cd /opt && curl -sL -o jadx.zip https://github.com/skylot/jadx/releases/download/v1.5.1/jadx-1.5.1.zip && unzip -qo jadx.zip)
```
- [x] Step 2: 写环境自检 `tools/check_env.py`(导入 bleak/pillow/capstone/androguard;检查 jadx 可执行;打印版本表)
- [x] Step 3: 运行自检,预期全 OK
- [x] Step 4: 冻结 `requirements.txt` 并提交
---
## P1:三线逆向(Task 2–4)
### Task 2: Web 上位机协议提取(最快路径,先做)
**Files:**
- Create: `analysis/web/fetch.sh`, `docs/protocol.md`
- [x] Step 1: 抓取站点全部 JS/HTML 到 `analysis/web/`(curl 递归,含 file_down.php 固件列表)
- [x] Step 2: 提取并记录:BLE service/characteristic UUID、通知/写入选项、命令字节格式、图像分块与应答协议、模板/时钟/倒计时命令
- [x] Step 3: 写入 `docs/protocol.md`(每条注明来源文件与行号)
- [x] Step 4: 提交
### Task 3: APK 反编译与互证
**Files:**
- Create: `analysis/apk/notes.md`, 修改 `docs/protocol.md`
- [x] Step 1: jadx 反编译到 `analysis/apk/jadx-out/`(不入库);搜索 `BluetoothGattCharacteristic`、`writeCharacteristic`、UUID 常量、激活码网络请求
- [x] Step 2: 与 Web 端逐项比对协议字段;差异写 DECISIONS.md
- [x] Step 3: 整理功能清单(时钟模式/倒计时/传图抖动算法/6 模板/睡眠/停车牌/WiFi 配置/高级命令)入 `docs/protocol.md` 附录
- [x] Step 4: 提取图像处理参数(4.2寸=400x300,三色屏 B/W/R 通道编码方式)
- [x] Step 5: 提交
### Task 4: DA14585 固件分析
**Files:**
- Create: `analysis/firmware/disasm.py`, `docs/firmware-analysis.md`, 修改 `docs/architecture.md`
- [x] Step 1: 解析镜像头(0x70 0x51 'pQ' 签名、长度、校验),定位加载基址(向量表显示 0x07FCxxxx)
- [x] Step 2: capstone 反汇编(Thumb, Cortex-M0),定位:GATT 属性表(UUID 字节型匹配)、命令解析跳转表、SPI 墨水屏驱动初始化序列、SUOTA 服务
- [x] Step 3: 与 protocol.md 互证命令集;记录墨水屏型号线索(4.2" 400x300 三色 → SSD16xx/UC81xx 系驱动 IC 初始化序列比对)
- [x] Step 4: 写 `docs/firmware-analysis.md`(内存布局、关键函数偏移、镜像校验算法)+ `docs/architecture.md`
- [x] Step 5: 提交;**G1 门禁检查**
---
## P2:CLI 上位机(Task 5–9)
### Task 5: BLE 传输层 + 协议编解码(TDD)
**Files:**
- Create: `src/ppclock/protocol.py`, `src/ppclock/transport.py`, `tests/test_protocol.py`
**Interfaces:**
- Produces: `encode_command(cmd: int, payload: bytes) -> bytes`、`decode_notification(data: bytes) -> dict`、`BLETransport.open/close/write/notify`(UUID 常量全部来自 docs/protocol.md)
- [x] Step 1: 用 Task 2/3 的真实测试向量写失败测试(编解码往返、分块序号、校验字节)
- [x] Step 2: 跑测试确认失败
- [x] Step 3: 实现 protocol.py(纯函数,无 BLE 依赖)
- [x] Step 4: 实现 transport.py(bleak 封装:扫描按名称/MAC 过滤、连接、MTU 协商、写+等通知)
- [x] Step 5: 测试全绿后提交
### Task 6: 图像管线
**Files:**
- Create: `src/ppclock/image_pipeline.py`, `tests/test_image.py`
- [x] Step 1: 失败测试:400x300 输入 → 设备原生位平面字节流(对照 APK 提取的编码:B/W/R 通道映射、扫描方向、字节序)
- [x] Step 2: 实现六种抖动(Floyd-Steinberg/Atkinson/Bayer/Stucki/Jarvis-Judice-Ninke/无抖动阈值)+ 亮度/对比度/饱和度/旋转/缩放
- [x] Step 3: 全绿提交
### Task 7: 功能命令层(时钟/日历/倒计时/模板/睡眠/停车牌/高级命令)
**Files:**
- Create: `src/ppclock/commands.py`, `tests/test_commands.py`
- [x] Step 1: 逐功能写失败测试(参数→字节流,向量来自 protocol.md)
- [x] Step 2: 实现全部功能命令
- [x] Step 3: 全绿提交
### Task 8: CLI 入口(agent 友好)
**Files:**
- Create: `src/ppclock/cli.py`, `src/ppclock/__main__.py`, `tests/test_cli.py`
- [x] Step 1: argparse 子命令:`scan / clock / calendar / countdown / image / template / sleep / parking / wifi-config / raw / ota`;全局 `--json`、`--mac`、`--timeout`
- [x] Step 2: `--json` 输出 schema 固定(`{"ok":bool,"cmd":str,"data":...,"error":...}`),错误码文档化
- [x] Step 3: mock transport 的 CLI 集成测试全绿;提交;**G2 门禁检查**
### Task 9: 真机功能对齐验证 —— ⚠ 降级(无设备在 BLE 范围内,2026-07-24)
- [ ] Step 1: 对照 protocol.md 功能清单逐项在真机执行 CLI(每步记录结果与抓包)——**待设备到场执行**
- [x] Step 2(降级): 以 FakeTransport 逐帧断言 + 三线证据互证替代(tests/test_cli.py、test_commands.py);G3 以协议级达标记录于 PROGRESS.md
---
## P3:增强与固件可控(Task 10–12)
### Task 10: 功能增强
- [x] Step 1: 本地模板渲染(Pillow 离屏渲染 6 模板 → image 推送,摆脱 App 画布)
- [x] Step 2: `schedule` 子命令:定时/周期推送(cron 友好,单次执行语义,调度交给系统)
- [x] Step 3: `batch` 子命令:JSONL 批量执行,面向 agent 编排
- [x] Step 4: 测试+提交
### Task 11: 固件可控工具链
**Files:**
- Create: `tools/fw_info.py`, `tools/fw_pack.py`, `tests/test_fw.py`
- [x] Step 1: 失败测试:解析原始镜像头字段与校验;重打包字节级一致
- [x] Step 2: 实现 fw_info(解析/校验)与 fw_pack(修改后重算校验生成可烧录镜像)
- [x] Step 3: SUOTA 流程写入 docs/firmware-analysis.md(服务 UUID、握手、分块、CRC)
- [x] Step 4: 全绿提交;**G4 门禁检查**
### Task 12: 最终验收
- [x] Step 1: 断网环境跑通 CLI 全部命令(除 apt/pip 外)→ **G5**
- [x] Step 2: 写 README.md(安装/使用/离线说明)与 docs/architecture.md 终稿
- [x] Step 3: 对照任务说明三条目标逐项验收,更新 PROGRESS.md,提交
---
## Self-Review 记录
- 规格覆盖:任务说明目标1→P1;目标2→P2+P3-Task10;目标3→P1-Task4+P3-Task11。✔
- 已知风险:真机不在手时 Task 9 降级为协议仿真测试(以 APK/Web 证据为准),在 PROGRESS.md 显式标注。
- 占位符扫描:无 TBD/TODO。