6.4 KiB
6.4 KiB
全链路测试结果(第一轮 · 2026-07-28)
执行方式:bridge 模式(host-win 原生 BLE)+
ppclock batch单连接。 计划:docs/field-test-plan.md。结论先行:核心链路全部实机验证通过。
基础设施
| 项 | 结果 |
|---|---|
| 本机 usbip 蓝牙 | ❌ 大 MTU GATT 断流(DECISIONS 2026-07-28),弃用 |
| bridge(host-win 原生) | ✅ 部署于 C:\yi\ble-bridge(build 4,PID 23776,0.0.0.0:8971) |
| 设备 | NRF-5DBF28 @ 18:BC:5A:5D:BF:28 |
协议验证(实机)
| # | 项 | 结果 | 证据 |
|---|---|---|---|
| 1 | 扫描/连接 | ✅ | bridge scan/connect,build 2 后稳定 |
| 2 | GATT 结构 | ✅(有修正) | 实机全表抓取:EPD h=48;1f1f(h=53) 仅 write 不执行命令;331f(h=57) 为活命令通道;fef5 SUOTA 六特征在线 |
| 3 | 取设备 ID(EFEF) | ✅ | 81233F3C267112(经 331f 写+notify) |
| 4 | MAC 反解 | ✅ | ID → 28:bf:5d:5a:bc:18 = 广播地址反转(参数序 MAC5 在前,实机校正) |
| 5 | keygen 离线激活 | ✅ | activate --auto 下发 2564550c1b2d 成功 |
| 6 | 对时 dd | ✅ | batch line 3 ok |
| 7 | 传图(126×244B 双平面) | ✅ 屏显确认 | 棋盘+中央红块上屏(曾杀死 usbip 的流量) |
| 8 | 显示图一 e10000 | ✅ 屏显确认 | 切到图片 |
| 9 | 模式切换 e102xx/e101xx | ✅ 屏显确认 | 331f 通道下 clock 画面出现;1f1f 通道无效(实锤对比) |
| 10 | 倒计时+前缀 | ✅ 命令 ok | 屏显待二次确认(序列中停留 8s,见下) |
| 11 | 停车牌 | ⚠ 一次传输中断 | WinError -2147023673(设备睡眠间隙断连,非协议问题) |
| 12 | 刷屏 00/01 | ✅ | 屏显刷新 |
待第二轮确认/执行
慢速目视序列已完成(见 #10-12 行)- G4 SUOTA 首刷:已推进至设备内部产品头门禁(见下"SUOTA 排障全记录"),用户决策安全收尾(2026-07-29),后续解法见遗留项
- 固件 no-op 验证:rotation/wifi 应无屏效
- 六抖动算法屏显差异、模板 6 种屏显
SUOTA 排障全记录(2026-07-29)
| 层 | 问题 | 根因与处置 |
|---|---|---|
| 传输 | 三轮"首块前静默停滞" | asyncio StreamReader 64KiB 行限制,144KB 镜像请求永不到达(build 9: limit=4MiB) |
| 协议 | 状态码 16 误杀 | 固件反汇编实证 = MEM_DEV type 0x13 信息应答(0x07FCB770),build 10 按信息码处理 |
| 引脚 | 块1 状态 22(0x38000 读失败) | GPIO_MAP 字节序错误;探针实证 BE 序 {05,06,00,40} 电气有效(已固化为服务端默认) |
| 门禁 | 状态 20(产品头无效) | 设备 0x38000 无有效 'pR' 产品头(裸 'pQ' 直启),固件中止首缓冲处理——vendor 级设计 |
全量烧录实证(用户授权 2026-07-29,留证 docs/suota-flash-log.jsonl):mem_dev_ok → 16(信息)→ gpio_map_ok → 块1 发送 → 状态 20 → 安全中止(写 flash 前终止,零写入)。结论:阻断确为 0x38000 产品头缺失/无效,非引脚误读。
vendor 目录逆向(路线 1):qbsg.top /api/firmware/catalog 免认证开放;PP_da14585_4.2_CH.img 与本机镜像 sha256 完全一致(vendor OTA 镜像=本镜像,无产品头附加);NEW 变体同检 0x38000。
解法路线(遗留 K4):①JTAG/UART 写产品头 ②逆向 vendor 付费激活流程(PP_da14585_4.2_NEW 的 activation 疑含产品头写入路径,libapp.so Rust secp256k1/AES)③评估 vendor 原始 OTA 在同类裸启设备上是否同败(vendor 级缺陷)。
设备全程零风险(门禁在写 flash 前中止;END/复位信号从未发出)。
已知问题
| # | 问题 | 状态 |
|---|---|---|
| K1 | 停车牌 EF+双写号码:命令 ACK 但屏不显(含 11 位号码、去 e2 变体均试) | 待查:疑似固件家族格式分叉(d8 hex-concat)或渲染与模式联动;协议帧与 web 证据一致 |
| K2 | 设备睡眠快(广播窗 30-60s,无唤醒按钮、自动周期醒) | 已有工作法:batch 单连接 + 守候循环 |
| K3 | 多次命令间隔断连(WinError -2147023673)1 次 | 瞬态(睡眠间隙),重连即恢复 |
| K4 | SUOTA 产品头门禁:0x38000 无 'pR' | 解法案:①逆向 vendor 镜像目录是否含产品头镜像 ②研究裸启设备的产品头自举写入路径 ③评估 JTAG/UART 写头 |
环境备注
- 设备睡眠:广播窗口 30-60s,连接态清醒;现场统一 batch 单连接+守候循环
- bridge_server build 4:write alt=331f、notify 三订阅、EFEF 走 331f
图片输入机制 review(典狱长测试案例,2026-07-29)
链路全景:源图获取 → 设备适配处理 → 管线量化 → 双平面分块上传 → 槽位显示
| 阶段 | 实现 | 本案例 |
|---|---|---|
| 源图 | 任意 RGB 图(网络/本地) | 典狱长格赫罗斯 960×565(腾讯新闻角色文配图) |
| 设备适配 | 裁剪聚焦 + 风格化(本案例:FIND_EDGES 线稿+红区检测)→ 400×300 | 黑线白底 + 红手套点缀 |
| 管线量化 | image_pipeline.process_image:调整→抖动→1bpp MSB 双平面(bw: 任通道>0;red: R>0,G=0,B=0) |
--algo none(已量化图,保线条锐利) |
| 上传 | 63×2 块 ×244B(03 ff/00 + 2B 偏移),01 结束 |
slot 1(图二) |
| 显示 | mode imageN(e1000N+e2) |
image1 |
机制评审结论:
- 任意风格图均可达:预处理(PIL 全能力)与设备管线解耦,风格化在本地完成,设备只收 1bpp 结果——图片输入机制通用、可编程、agent 可编排。
- 已量化图必须用
--algo none直通,避免二次抖动破坏线条。 - 三色通道映射与固件一致(bw=黑、red=红、双0=白背景)。
- 待办:处理脚本可产品化为
ppclock image --style lineart(后续增强项)。
测试产物:analysis/web/warden_400x300.png(400×300 线稿)+ 上屏实拍(待用户目视确认)。
典狱长测试案例 v2(官图版,2026-07-30)
- 源图:examples/dianyuzhang.png(1448×1086 矢量风官图,黑/白/红手套)
- 处理:400×300 LANCZOS 缩放 +
--algo none直通(已量化) - 上传:slot 1(63×2 块 244B)✅
- 显示:槽位覆盖后设备自动重绘(image1 模式留存效应——覆盖即更新,无需补 mode)✅ 用户目视确认官图上屏
- 机制结论增补:槽位内容覆盖会触发屏幕重绘(设备处于对应 image 模式时),这是"上传即显示"的最短路径。