Files
qianbian/CHANGELOG.md
T

80 lines
5.7 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.
# CHANGELOG
## [Unreleased] — 2026-08-03
- 修复同型号异固件设备的控制通道选择:`HM42_AIO_*` 自动使用 Web-BLE/APK
实际采用的 `1F1F`,已验证 `PP_da14585_4.2` 保持使用 `331F`。
- 本地 BLE 连接时读取 DIS 固件版本 `2A26`;若固件未知,则以 GATT 特征是否存在
在 `331F`/`1F1F` 间安全回退。
- write-only 通道不再强行订阅通知;设备状态新增 `firmware_revision` 与
`rxtx_uuid`,可直接审计当前固件档案与控制通道。
- HP 真机 `HM42_AIO_V1.0.9` 验证:直接 `1F1F` 模式命令由用户目视确认生效;
部署修复后 MCP 报告所选通道为 `00001f1f-...`,`set_mode(clock3)` 返回成功。
- 自动化测试:212 项通过。
## [治理] — 2026-08-02
项目级规则 review 打结(非产品变更):GOVERNANCE §2 目录结构/§5 工具链更新至 0.2.0-beta 现实(jadx→androguard、pyproject 为依赖准绳、交付物扩展为 SDK+CLI+bridge+MCP+examples)、PROGRESS 首日快照误标"最终状态"更正、详细计划 Task 9 标实机完成、DECISIONS 条目 18 标注被取代、README 依赖声明补 qrcode。
## [0.2.0-beta] — 2026-07-31
新增 **ppclock-mcp**:跑在蓝牙物理所在机器上的单层 MCP 服务器,agent 经 stdio 或
streamable HTTP 直驱墨水屏。
### MCP 服务器
- `ppclock-mcp` 命令(`ppclock.mcp_server:main`):stdio / streamable HTTP 双模,
HTTP 绑非回环地址强制 `PPCLOCK_MCP_TOKEN` Bearer 鉴权(ASGI 中间件,不符 401)
- 13 个工具(`ppclock.mcp_tools`):scan_devices / device_status / set_time / set_mode /
toggle / upload_image(路径或 base64,6 抖动+6 调整参数)/ render_template(6 模板)/
countdown / countdown_off / calendar_text / set_sleep / clear_screen / raw_send
- 统一输出契约与 CLI `--json` 同构:`{"ok","tool","data"|"error":{"code","message","hint"?}}`,
错误码 CONNECT_TIMEOUT / DEVICE_NOT_FOUND / BLE_ERROR / INVALID_PARAM / INTERNAL
- **DeviceManager 公开为子包能力**(`ppclock.device_manager`,方案 C 连接管理):
按需连接 + 空闲保持,守候窗口覆盖设备 30-60s 广播窗口(`--connect-timeout` 默认 90s),
空闲自动断开(`--idle-timeout` 默认 300s),全操作串行,掉线重连重试一次
- 有意不暴露:OTA / 激活 / LUT / WiFi / 轮播(高危或本固件 no-op,走 SDK/CLI)
- 文档:`docs/sdk/MCP.md`(工具参考 + agent 挂载 + Windows 部署)
### beta 修正与复测(2026-07-31)
- **HTTP 复测通过**(熠管家,LAN 主机 192.168.61.56 → 192.168.61.35:8972):无 token 401 /
非法 Host 421 / 真实 LAN Host 200(serverInfo=ppclock)/ `device_status` 全链 ok;
详见 spec 末节(`docs/superpowers/specs/2026-07-30-ppclock-mcp-design.md`)
- **mcp 依赖地板抬至 `>=1.23`**:`transport_security`(`--allowed-hosts` 依赖的
DNS 重绑定防护)自 1.23 引入,且 1.23 起含 CVE-2025-66416 修复;钉 `mcp>=1.23,<2`
(2.0 将移除 FastMCP API)
- **`--allowed-hosts` 空串防护**:`--allowed-hosts ""` 逗号拆分得空列表,会启用防护并
连 localhost 族一并 421(自锁);现按 None 处理(保持 mcp 默认),含回归测试
- **qrcode 补入 dependencies**:0.1.0 遗留,`templates.py` qrcode 模板硬依赖
(`render_qrcode` 内 import qrcode),pyproject 现钉 `qrcode>=7`
- 常驻部署(Windows 服务化 + token 持久化)随熠管家进行,不在本发布内
(2026-07-31 当日已完成常驻部署并生产目视闭环,见 docs/sdk/MCP.md §常驻部署、PROGRESS 末节)
## [0.1.0] — 2026-07-30
首个 SDK 化发布。4.2寸墨水屏设备(DA14585 BLE,400×300 黑白红三色)的**完全离线**开发包:
协议三线逆向(Web JS/APK/固件反汇编)+ 实机互证,全部功能经真机验证。
### SDK
- **`PPClient` 统一门面**:`via_local`(本机 bleak)/ `via_bridge(host, mac)`(经 bridge 远程 BLE)/ `via_uri` / `scan_devices`
- 设备操作全集:对时(含 `tz` 时区偏移)、模式/切换、传图(6 抖动+调整+槽位)、本地 6 模板渲染上传、倒计时(时钟/日历/前缀/日历中文字)、休眠、停车牌、轮播、LUT、WiFi 透传、raw 直发、SUOTA OTA
- **离线激活**:`activate_auto`——EFEF 取设备 ID → MAC 反解 → 本地 keygen(破解厂商云激活,实机验证)
- `transports`(base/local/bridge)与 `firmware`(image 解析重打包/ota)分包;`Transport` 协议开放自定义传输
- **BLE bridge 一等公民**:`ppclock-bridge` 命令(bleak 单文件服务端,Windows/Linux 原生运行),JSONL/TCP RPC,解决本机无蓝牙或 USB/IP 透传断流场景
### CLI(同一能力面)
`ppclock` 17 子命令 + `--json` 机器契约 + `batch` JSONL 单连接批量(agent 编排友好)+ `--via bridge://` / `PPCLOCK_VIA`
### 固件工具
镜像解析/修改/重打包('pQ' 头 + zlib CRC32,字节级往返一致);SUOTA 客户端(fef5 自定义 UUID 映射,实机推至产品头门禁);工厂线刷布局已解析(pP 引导+双 bank+pR 产品头,docs/firmware-layout.md)
### 测试与文档
- 165 自动化测试全绿(协议/图像/命令/CLI/bridge/keygen/ota/fw/client 八个域)
- AI-native 文档:`docs/sdk/API.md` + `llms.txt`
- 逆向证据链:analysis/(web/apk/firmware 三域)+ docs/(架构/协议/固件分析/布局/实测记录)
### 已知限制
- 停车牌命令设备端不显示(厂商固件家族渲染差异,K1 待查)
- 本机设备为裸闪存布局(无 'pR' 产品头),SUOTA 止于设备内部门禁;线刷恢复布局路径已成文备查
- 轮播/WiFi 配置在本固件版本为 no-op(固件证据)