Madhat69/pyidotmatrix

GitHub: Madhat69/pyidotmatrix

面向 iDotMatrix BLE 像素显示屏的异步 Python SDK,兼作该设备蓝牙通信协议的逆向工程参考文档与实现。

Stars: 0 | Forks: 0

# pyidotmatrix 面向 iDotMatrix BLE 像素显示屏的无预设、async-first 的 Python SDK。 采用 GPL-3.0-or-later 许可证 — 请参阅 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。 本项目有两个同等重要的目标: 1. **iDotMatrix 显示屏的权威 Python SDK** — 控制一个面板 应该感觉像是在控制一台设备,而不是在构造数据包。 2. **设备协议的参考实现和文档** — 每一个经过验证的逆向工程发现都会汇总于此;每一个 未经验证的发现都会被明确标记为实验性的。协议研究是 一等贡献(一份优质的硬件探测日志与一项新功能同等重要)。 有关完整的架构审查、带有证据的功能清单以及迈向 1.0 的路径,请参阅 [docs/ROADMAP.md](docs/ROADMAP.md)。 ## 安装 尚未发布到 PyPI。从检出的代码安装: ``` pip install -e . # library pip install -e .[test] # + test tooling ``` 要求 Python 3.12–3.14。通过 [bleak](https://github.com/hbldh/bleak) 进行 BLE 连接 (支持 Windows/Linux/macOS)。 ## 协议成熟度一览 | 子系统 | 状态 | |---|---| | BLE 传输(重连、ack、通知) | ✅ 经过硬件验证 | | Framebuffer(DIY 全帧 + 进入/退出模式) | ✅ | | Graffiti(局部像素更新) | ✅ | | 图像 / GIF(适配 + 原生播放) | ✅ | | 原生时钟 | ✅ | | 闹钟(定时器槽位、内容和蜂鸣) | ✅ | | 文本(设备渲染) | ⚠ 在 32×32 上破损 — 修复中 | | 特效 / 颜色 | ✅(与厂商应用相比有所简化) | | 倒数 / 秒表 / 记分牌 | ⚠ 来源已确认 | | 每周计划 | ⚠ 部分已验证 | | 音乐同步 / eco / 实验性 | ⚠/❓ | ✅ 经过硬件验证 · ⚠ 实验性(来源已确认,但未验证) · ❓ 逆向工程进行中。带有完整证据的表格:ROADMAP §3。 ## 架构层 ``` protocol/ pure byte builders (no I/O), one per device feature transport/ BLE connection lifecycle, chunked writes, reconnect supervision display/ DisplayBackend interface + BleDisplay (hardware) and SimulatorDisplay client.py IDotMatrixClient — full-feature facade over one connection imaging.py canvas-fitting helpers (image adaptation) ``` 驱动程序负责将字节传输到设备。它不进行调度、渲染应用帧、对帧进行差异比对,也不决定是使用全帧还是像素更新 — 这些都是调用者的任务。 ## 两个接口 **DisplayBackend** — 最小化的帧处理管道接口(`show_frame`、`set_pixels`、亮度、电源)。`BleDisplay` 和 `SimulatorDisplay` 都实现了该接口,因此调用者与后端无关。 ``` from pyidotmatrix import BleDisplay, BleTransport, ScreenSize, SimulatorDisplay display = BleDisplay(ScreenSize.SIZE_32x32, BleTransport(mac_address=None)) await display.connect() await display.show_frame(rgb_bytes) # full frame (32*32*3 bytes) await display.set_pixels((0, 255, 0), [(1, 1)]) # partial update sim = SimulatorDisplay(ScreenSize.SIZE_32x32, on_frame=lambda buf: ...) # no hardware ``` **IDotMatrixClient** — 完整的原生功能外观模式;包含所有设备功能,并与 `.display` 共享同一个连接。 ``` from pyidotmatrix import IDotMatrixClient, ScreenSize client = IDotMatrixClient(ScreenSize.SIZE_32x32) await client.connect() await client.countdown.start(25, 0) # e.g. a Pomodoro (device runs it natively) await client.clock.show() await client.text.show("HELLO", font_path=...) await client.gif.upload_file("anim.gif") await client.display.show_frame(rgb_bytes) # rendered frames, same connection ``` 功能命名空间:`chronograph`、`countdown`、`clock`、`scoreboard`、`eco`、`color`、`graffiti`、`effect`、`music_sync`、`text`、`gif`、`common` 以及 `display`。 ### 设备确认 对于每一个被识别的命令(接受/拒绝),设备都会推送一个状态 ack。 您可以被动地观察它们,或者等待特定命令的 ack: ``` # passive: 为每个命令的 ack 触发 unsubscribe = client.add_response_listener(lambda ack: print(ack.command_type, ack.accepted)) # active (opt-in): 发送命令并等待其 ack,或者在 timeout 时为 None from idotmatrix.protocol import common ack = await client.await_device_ack(common.build_set_brightness(60)) ``` **值得了解的协议真相:** ack 确认的是*接收*,而不是*执行效果* — 设备可以接受一个命令但不执行它。SDK 会记录这些情况,而不是掩盖它们(详见 ROADMAP §4)。 ### 生命周期与可观测性 ``` client.set_auto_reconnect(True) # arm/disarm reconnect at runtime unsub = client.add_event_listener(print) # write failures, reconnects snap = client.snapshot() # address, connected, write_size, reconnect_count, last_failure await client.show_image("photo.png") # adapt to the screen and display ``` 监听器注册会返回一个可调用的取消订阅对象。抛出异常的监听器会被隔离 — 它不会破坏连接处理逻辑。 **低 MTU 面板:** 传输层信任特征值报告的写入大小。在 BlueZ 下,某些 iDotMatrix 面板会少报此值(约 20 字节);在这些设备上,传入 `BleTransport(..., write_size_override=514)` 即可获得全速帧刷新。 ## 测试 ``` pip install -e .[test] pytest ``` 协议构建器由逐字节精确的黄金测试覆盖。硬件探测脚本位于 `probes/` 中 — 由人工针对真实面板运行,从不在 CI 中执行。 ## 贡献 逆向工程是一等贡献:硬件探测结果、BLE 数据包捕获、固件/型号对比以及协议文档,与代码一样宝贵。请从 `probes/` 开始,并参考 `docs/` 中各处提及的逆向工程笔记。 ## 致谢 本 SDK 建立在以下开发者的逆向工程传承之上: [8none1](https://github.com/8none1/idotmatrix)、 [derkalle4](https://github.com/derkalle4/python3-idotmatrix-client) (GPLv3)、 和 [markusressel](https://github.com/markusressel/idotmatrix-api-client) — 请参阅 [NOTICE](NOTICE)。
标签:LED像素屏, Python SDK, 云资产清单, 协议文档, 物联网, 硬件控制, 蓝牙低功耗, 计算机取证, 逆向工具, 逆向工程