Rishi-Goyal/led-hue-cycle
GitHub: Rishi-Goyal/led-hue-cycle
逆向工程蓝牙 LED 灯带 BLE 协议的开源控制器,通过原生 Android 应用和 Python 脚本实现平滑的全色谱循环效果并支持后台常驻与多灯带同步。
Stars: 0 | Forks: 0
# led-hue-cycle
通过你自己的代码控制廉价的蓝牙“梦幻色彩” LED 灯带 —— 实现平滑、连续的整个灯带色调循环,平滑过渡完整的色谱(红 → 橙 → 黄 → 绿 → 青 → 蓝 → 紫 → 品红 → 红 ……),不会变暗、没有跳变、也没有追逐片段。支持**同步驱动多条灯带**,可以在**关闭屏幕的情况下在后台运行**,并自动重连。
专为广播名称为 **`LEDDMX-*`** 且随附 **"LED LAMP"** Android 应用(来自 Shenzhen Zhongji)的 BLE 控制器构建 —— 这些产品由许多品牌销售。本项目逆向工程了该应用的协议,让你能够自行驱动这些灯带。
| | |
|---|---|
| **推荐(目前可用)** | [Android 应用](android/) — 原生,后台前台服务,实时速度 + 起始颜色控制,同时支持两条灯带 |
| **同时包含** | Python (`bleak`) 脚本 + 面向 Linux/BlueZ 或 USB BLE dongle 的协议逆向工程工具 |
## 硬件兼容性
已在以下设备上测试并确认:
- **[One94Store Smart LED Strip Light 5M with App & Remote Control](https://www.amazon.in/One94Store-Lights-Remote-Gaming-Decoration/dp/B0FTQ5Q7BZ)**
(Amazon.in,ASIN `B0FTQ5Q7BZ`)— RGBIC“梦幻色彩”灯带,2× 5 m 串联至 10 m。
只要你的灯带控制器符合以下条件,它就应该能正常工作:
- 通过 BLE 广播,且名称以 **`LEDDMX-`** 开头(例如 `LEDDMX-03-XXXX`),并且
- 由 **"LED LAMP"** 应用(包名为 `com.ledlamp`)控制。该应用被许多商店品牌贴牌,因此许多无品牌的 Amazon/AliExpress“梦幻色彩”/“音乐同步”灯带都在使用它。
你可以使用 BLE 扫描器(例如 nRF Connect for Mobile)来检查你的设备 —— 如果你看到 `LEDDMX-*` 设备暴露了 GATT service `0xFFE0`,本项目就可以驱动它。
### ⚠️ 不同灯带间的颜色顺序会有所不同
这些 RGBIC 灯带的颜色通道接线方式并不完全相同。上面的 One94Store 设备使用字节顺序 **R, B, G**(绿色和蓝色互换),这也是此处的默认设置。如果你的颜色显示错误 —— 典型的迹象是**蓝色显示为绿色**且**橙色显示为粉色** —— 请切换顺序:
- **Android:** 编辑 [`LedService.java`](android/src/com/ledcycle/LedService.java) 中的帧
(即 tick 循环中的 `frame` 字节数组),以重新排列这三个颜色字节。
- **Python:** 在 `led_cycle.py` 中传入 `--color-order`(`rgb`、`rbg`、`grb`、`gbr`、`brg`、`bgr`)。使用 `python led_cycle.py --test red` 进行校准并调整,直到红色显示正常,然后用 `--test green` 确认。
注意:无论设置如何,这些灯带上饱和的**橙色**看起来都会显得浑浊/暗淡 —— 这是 RGBIC LED 的硬件限制(绿色混合较弱),而不是 bug。
## 快速开始 — Android 应用(推荐)
手机将直接驱动灯带。有关完整的构建细节,请参阅 [android/README.md](android/README.md);简而言之(需要 JDK 17 + Android SDK,无需 Gradle):
```
cd android
bash build.sh
adb install -r build/ledcycle.apk
adb shell pm grant com.ledcycle android.permission.BLUETOOTH_CONNECT
adb shell pm grant com.ledcycle android.permission.POST_NOTIFICATIONS
adb shell am start -n com.ledcycle/.MainActivity
```
首先在 [`LedService.java`](android/src/com/ledcycle/LedService.java) 顶部的 `MACS` 数组中设置你的控制器地址
(可以通过 BLE 扫描器找到它们)。然后点击 **LED Cycle** —— 它将启动一个前台服务,并能在屏幕关闭的情况下保持循环;你可以通过通知将其停止。
## 协议参考
逆向工程自 LED LAMP 应用;并与 [user154lt/LEDDMX-00](https://github.com/user154lt/LEDDMX-00) 交叉验证。所有帧均为 9 字节,以 `7B … BF` 作为帧边界。
- **Service:** `0000ffe0-0000-1000-8000-00805f9b34fb`
- **Write characteristic:** `0000ffe1-0000-1000-8000-00805f9b34fb`
(属性:WRITE / WRITE-NO-RESPONSE / NOTIFY / READ)
| 命令 | 帧 |
|---------------|----------------------------------------------|
| 静态颜色 | `7B FF 07 C1 C2 C3 00 FF BF` |
| 开关机 | `7B FF 04 03/02 FF FF FF FF BF` |
| 亮度 | `7B FF 01 (pct*32/100) pct 00 FF FF BF` |
| 图案 | `7B FF 03 idx FF FF FF FF BF` (idx 0–210) |
`C1 C2 C3` 是这三个颜色字节。它们与物理红/绿/蓝的映射关系就是上文描述的**颜色顺序** —— 在经过测试的硬件上,顺序为 `R, B, G`,因此颜色 `(r,g,b)` 会作为 `7B FF 07 r b g 00 FF BF` 发送。
## Python 脚本
纯 `bleak` 实现,以及用于逆向工程协议的工具:
| 文件 | 用途 |
|------|---------|
| [`led_cycle.py`](led_cycle.py) | 色调循环效果(CLI:`--mac`、`--cycle-minutes`、`--brightness`、`--color-order`、`--test`) |
| [`tools/scan.py`](tools/scan.py) | 查找 `LEDDMX-*` 设备,转储它们的 GATT 表 |
| [`tools/send_test.py`](tools/send_test.py) | 写入单帧(颜色或原始十六进制数据)以进行测试 |
| [`tools/parse_btsnoop.py`](tools/parse_btsnoop.py) | 从 Android HCI snoop 日志 / bugreport 压缩包中提取 ATT 写入操作 |
| [`tools/phone_verify.*`](tools/) | 通过 ADB 驱动 nRF Connect 的自动化测试以验证帧 |
```
pip install -r requirements.txt
python tools/scan.py # find devices + GATT
python led_cycle.py --test red # colour-order calibration
python led_cycle.py --cycle-minutes 30 --color-order rbg
```
该控制器**一次只能接受一个连接** —— 在从电脑连接之前,请关闭手机应用(以及本项目的 Android 应用)。
### ⚠️ Python 方式不支持 Windows
这些控制器拒绝 GATT **characteristic discovery** 的方式,是 Windows Bluetooth 堆栈(WinRT,被 `bleak` 以及基本上所有 Windows BLE 应用使用)所无法容忍的(`WinError -2147024838`),尽管 Android 可以正常处理。因此,Python 脚本需要**非 Windows 的 BLE 传输方式**:
- **Linux / Raspberry Pi (BlueZ):** 直接运行 `led_cycle.py` —— 即可使用。
- **USB BLE dongle + [bumble](https://github.com/google/bumble):** 一个纯 Python 实现的 BLE 堆栈,它会接管 dongle 并通过 ATT handle 进行写入,从而绕过有问题的发现机制。无需改动内置无线电即可在 Windows 上工作。
如果是在 Windows 上且只有内置适配器,请改用 **Android 应用** —— 这就是将其作为推荐方案的原因。
## 仓库结构
```
android/ native Android app (the working, recommended solution)
led_cycle.py Python hue-cycle effect (Linux/BlueZ or USB dongle)
tools/ BLE scanner, frame sender, HCI-snoop parser, phone verifier
requirements.txt Python deps (bleak)
```
## 许可证
[Apache-2.0](LICENSE)。
## 免责声明
本项目与 One94Store、Shenzhen Zhongji 或 LED LAMP 应用没有任何关联。这是一个独立的、针对你自己拥有的硬件的互操作性项目。使用风险自负。
标签:JS文件枚举, LED灯带控制, Python, 云资产清单, 域名枚举, 安卓开发, 无后门, 物联网(IoT)控制, 蓝牙低功耗(BLE), 逆向工具, 逆向工程