diff --git a/docs/protocol.md b/docs/protocol.md index 76d8940..3d99e4b 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -131,12 +131,21 @@ ASCII UTF-8 直发:`WIFI_SSID:{ssid};WIFI_PASS:{pass};CITY:{城市代码}`( ## 6. 标准会话流程 -1. 扫描(namePrefix `NRF-`)→ 连接 → EPD service → RXTX service → 订阅两通道 notify。 +1. 扫描(namePrefix `NRF-`)→ 连接 → 读取 DIS 固件版本 → 按固件选择 RXTX 特征。`PP_da14585_4.2` 使用 `331F`(notify/write/read);`HM42_AIO_*` 使用 `1F1F`(write-only,不订阅 notify)。首选特征不存在时才回退到另一特征。 2. (可选)`EFEF` 取设备 ID。 3. 对时:`dd…` + `e2`。 -4. 操作:模式切换(+`e2`)/ 传图(`EA0{slot}` → 数据块×N → `01`/`AA`)/ 倒计时 / WiFi。 +4. 操作:模式切换(+`e2`)/ 传图 / 倒计时 / WiFi。 5. 断线自动重连 ≤5 次。 +### 6.1 图像协议的固件差异 + +| 固件家族 | RXTX | 400×300 单色平面 | EPD 图像会话 | +|---|---|---|---| +| `PP_da14585_4.2` / 未知 | `331F` | 黑白平面 | 旧序列:数据块 → `01`(小图 `AA`) | +| `HM42_AIO_*` | `1F1F` | 黑白 15,000B + 全零红色 15,000B | `8001` → `0000` → `020000` → 双平面数据 → `0101` → RXTX `e2` | + +HM42 的双平面和会话帧均为必需条件:缺红色平面会出现红屏噪点,缺会话帧会出现黑白噪点。400×300 双平面在 Windows BLE 实机约需 8 分钟;调用方不得依赖跨网络的单个长 HTTP 连接,应在 BLE 主机本地执行并持久化结果后再轮询。 + ## 7. 本地化(去云)清单 —— 已全部解决 | 云依赖 | 本地化方案 | 状态 | diff --git a/docs/sdk/API.md b/docs/sdk/API.md index 7ab439d..bac2989 100644 --- a/docs/sdk/API.md +++ b/docs/sdk/API.md @@ -40,7 +40,7 @@ from ppclock import PPClient | 方法 | 签名 | 说明 | |---|---|---| -| `upload_image` | `async (source, slot=None, algo="atkinson", mono=False, size=(400,300), **adjust) -> dict` | source=路径或 PIL.Image;algo∈`none/floydsteinberg/atkinson/bayer/stucki/jarvis`;adjust∈`threshold/diffusion/brightness/contrast/saturation/rotate`;返回 `{"bytes_bw","bytes_red","small","slot"}`。小图(3500B/9000B)自动走 cod=04 | +| `upload_image` | `async (source, slot=None, algo="atkinson", mono=False, size=(400,300), **adjust) -> dict` | source=路径或 PIL.Image;algo∈`none/floydsteinberg/atkinson/bayer/stucki/jarvis`;adjust∈`threshold/diffusion/brightness/contrast/saturation/rotate`;返回 `{"bytes_bw","bytes_red","small","slot"}`。小图(3500B/9000B)自动走 cod=04;`HM42_AIO_*` 会自动补齐双平面并使用厂商图像会话 | | `render_template` | `async (name, payload=None, slot=None, algo="atkinson") -> dict` | 6 模板本地渲染上传:`schedule/businesscard/memo/course/qrcode/custom`;payload 见 `src/ppclock/templates.py` docstring | ### 倒计时与文字 diff --git a/src/ppclock/protocol.py b/src/ppclock/protocol.py index e6b8338..f2e9f1c 100644 --- a/src/ppclock/protocol.py +++ b/src/ppclock/protocol.py @@ -8,8 +8,8 @@ from typing import Iterator EPD_SERVICE_UUID = "13187b10-eba9-a3ba-044e-83d3217d9a38" EPD_CHAR_UUID = "4b646063-6264-f3a7-8941-e65356ea82fe" RXTX_SERVICE_UUID = "00001f10-0000-1000-8000-00805f9b34fb" -RXTX_CHAR_UUID = "0000331f-0000-1000-8000-00805f9b34fb" # 活命令通道(h=57, notify+write+read) -RXTX_CHAR_UUID_LEGACY = "00001f1f-0000-1000-8000-00805f9b34fb" # h=53 仅write,本设备不执行命令 +RXTX_CHAR_UUID = "0000331f-0000-1000-8000-00805f9b34fb" # PP 4.2 活命令通道(h=57, notify+write+read) +RXTX_CHAR_UUID_LEGACY = "00001f1f-0000-1000-8000-00805f9b34fb" # HM42_AIO 活命令通道(h=53, write-only) FIRMWARE_REVISION_UUID = "00002a26-0000-1000-8000-00805f9b34fb" DEVICE_NAME_PREFIX = "NRF-"