fix(protocol): RXTX 命令通道切换到 331f(实机证据:1f1f 仅ACK不执行)+ 设备ID反解参数序校正(实机向量),150 测试全绿

This commit is contained in:
agent committed 2026-07-28 16:22:46 +00:00
1 parent 4db823f207
commit aebe0ad317
6 files changed
+33 -18

No files matched your search

+3 -1
View File
@@ -143,7 +143,9 @@ class BridgeTransport:
await self._rpc("write", char="epd", data=data.hex(), response=response)
async def write_rxtx(self, data: bytes, response: bool = True):
await self._rpc("write", char="rxtx", data=data.hex(), response=response)
# 实机证据(2026-07-28):活命令通道是 331f(bridge 服务端 "alt"),
# 1f1f 仅 ATT-ACK 不执行 → RXTX 写统一走 alt
await self._rpc("write", char="alt", data=data.hex(), response=response)
async def write_alt(self, data: bytes, response: bool = True):
"""经 331f 通道写(实机证据:1f1f 仅 ATT-ACK,331f 为活命令通道)。"""
+10 -7
View File
@@ -4,11 +4,12 @@ from __future__ import annotations
import datetime
from typing import Iterator
# GATT(docs/protocol.md §1)
# GATT(docs/protocol.md §1;实机 GATT 表 2026-07-28 经 bridge 诊断确认)
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 = "00001f1f-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,本设备不执行命令
DEVICE_NAME_PREFIX = "NRF-"
BLOCK_PAYLOAD = 240 # my_step=480 hex 字符 = 240 数据字节
@@ -179,9 +180,11 @@ def keygen_code(mac: bytes) -> bytes:
def recover_mac_from_device_id(device_id: str) -> bytes:
"""14hex 设备 ID → 6B MAC。
ID = %02X(|MAC4-0x99|,|MAC5-0x99|,|MAC3-0x99|,|MAC2-0x99|,|MAC1-0x99|,|MAC0-0x99|,flags),
flags bit i = MAC[i] ≥ 0x9A(证据 §4.2 生成函数 0x07FCA22C)。"""
"""14hex 设备 ID → 6B MAC(NVDS 字节序)。
ID = %02X(|MAC5-0x99|,|MAC4-0x99|,|MAC3-0x99|,|MAC2-0x99|,|MAC1-0x99|,|MAC0-0x99|,flags),
flags bit i = MAC[i] ≥ 0x9A。
证据:实机 2026-07-28 ID '81233F3C267112' ↔ 广播 18:BC:5A:5D:BF:28(校正
firmware-analysis §4.2 中前两个参数的顺序,固件 snprintf 实参序为 MAC5,MAC4)。"""
if len(device_id) != 14:
raise ValueError("设备 ID 必须 14 个 hex 字符")
try:
@@ -189,8 +192,8 @@ def recover_mac_from_device_id(device_id: str) -> bytes:
except ValueError:
raise ValueError("设备 ID 含非 hex 字符") from None
*v, flags = vals
# v 顺序:MAC4,MAC5,MAC3,MAC2,MAC1,MAC0 → 反映射
order = [4, 5, 3, 2, 1, 0]
# v 顺序:MAC5,MAC4,MAC3,MAC2,MAC1,MAC0 → 反映射
order = [5, 4, 3, 2, 1, 0]
mac = [0] * 6
for vi, idx in zip(v, order):
if flags & (1 << idx):