stramanu/lumalou
GitHub: stramanu/lumalou
通过逆向工程实现的 Fisher-Price Lumalou 蓝牙设备本地控制工具,在官方应用停服后提供无需云端的 Python 和 TypeScript/JS 跨平台控制能力。
Stars: 0 | Forks: 0
# lumalou
[](https://github.com/stramanu/lumalou/actions/workflows/ci.yml)
[](https://pypi.org/project/lumalou/)
[](https://www.npmjs.com/package/lumalou)
[](LICENSE)
**Fisher-Price Lumalou 的本地 BLE 控制** —— 这是一个经过逆向工程的多语言实现,
对应于 *Lumalou Better Bedtime Routine System*(产品代码 `gld09`)
协议,开发于官方的 *Fisher-Price Smart Connect* 应用程序停止服务之后。
无需云平台,无需后端:加密握手及每条指令均在本地通过 Bluetooth LE 运行。
## 为什么使用 monorepo
该协议在多个生态中都有同一种实现。那些复杂且与安全相关的
部分(加密握手和帧封装)在所有语言中都是**固定且完全一致的**,
这得益于一份共享的、与语言无关的契约:
- **`spec/protocol.json`** — 作为 opcode 和枚举的唯一事实来源。各语言模块均
由此**自动生成**(`tools/codegen.py`),因此绝不会发生偏差。
- **`spec/vectors.json`** — 黄金测试向量(输入 → 预期输出)。**每个**绑定均会运行
相同的向量,从而从数学上证明所有语言在字节级完全一致。
未来如果添加新语言(如 Rust、Go、Swift...),相同的测试向量即可对其进行验证。
## 软件包
| 软件包 | 语言 | 安装 |
|---|---|---|
| [`packages/python`](packages/python) | Python (异步, `bleak`) | `pip install lumalou` |
| [`packages/js`](packages/js) | TypeScript / JavaScript (同构核心) | `npm install lumalou` |
Python 提供了完整的 client + CLI。而 JS 包则包含同构协议核心,外加一个
可选的浏览器 client(`import { LumalouBrowserClient } from "lumalou/browser"`),基于 Web
Bluetooth 运行。[在线 Web 应用](https://lumalou.emanuelestrazzullo.dev)正是基于此构建的。
## 可控制的功能
灯光(包含彩虹模式在内的 10 种颜色、亮度、定时器) · 音频(引导睡眠播放列表、音效、
12 首自定义曲目播放列表、音量、定时器) · 午休及每周睡眠/唤醒计划 ·
日常作息 · 时钟 · 实时状态读取。
## 工作原理
Lumalou 通过自定义的 GATT service(`4cea0001-…`)使用 Mattel 的 **MPID** 协议进行通信:
- **握手** — 设备发送签名 token;client 执行临时的 **ECDH
P-256** 交换,并通过 100 轮 AES-128-CTR 拉伸导出会话密钥。无需服务器参与。
- **封装** — 指令被依次封装为 `FE-frame → SSI0 → MPID` 并使用 **AES-128-CTR** 加密
(采用 CRC-8 保证完整性)。响应的解密和解码过程与之完全对称。
详细说明请见:[`docs/protocol.md`](docs/protocol.md)。
## 开发
```
python tools/codegen.py # regenerate language modules from spec/protocol.json
python tools/gen_vectors.py # regenerate golden vectors
# Python
cd packages/python && pip install -e ".[dev]" && pytest
# JS/TS
cd packages/js && npm install && npm test && npm run build
```
CI 会运行上述两套测试套件,如果生成的模块或测试向量已过期,CI 将会失败。
## 安全性
这些库**绝不**会触及用于固件更新 (DFU) 的 service `00001530-…`,也绝不会发送
OTA opcode —— 在那里发生任何错误的写入操作都会导致设备变砖。
## 免责声明
这是一个出于**互操作性**目的(依据欧盟指令 2009/24/EC,第 6 条)而进行的个人逆向工程项目,
开发于官方应用停服之后。本项目与 Mattel / Fisher-Price 没有任何关联,也未获得其认可。
"Fisher-Price" 和 "Lumalou" 是其各自所有者的商标。使用风险自负。
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
标签:数据可视化, 逆向工具