DynamicDevices/lcd-badge-ble
GitHub: DynamicDevices/lcd-badge-ble
一款基于 Rust 和 BlueZ 的 Linux 工具,用于逆向与交互 DG01 风格 LCD 蓝牙徽章的协议与命令。
Stars: 0 | Forks: 0
# lcd-badge-ble
BLE 工具与协议 / 逆向工程笔记,适用于 **DG01** 类 LCD 引脚(SuperBand / FitPro 风格 OEM 应用)。主要参考:**[PROTOCOL.md](PROTOCOL.md)**。
## 仓库布局
| 路径 | 用途 |
|------|------|
| `dg01-ble/` | Linux 上的 Rust CLI(通过 **bluer** 使用 BlueZ):`scan`、`find`、`sync-time`、`query`、**`device-info`**(SIG GATT **0x180A** DIS + **0x180F** 电池,扫描器风格解码)、`upload-dial`(命令 31 表盘)— 详见下文 |
| `PROTOCOL.md` | GATT 映射、帧格式、命令 ID,来自 APK 分析与本地抓包 |
| `ebadge_inspect.py`、`superband_find_device.py` | Python 辅助工具(基于 Bleak;实际环境中相比 BlueZ 较不稳定) |
| `capture_le_passive.sh`、`apk-get` | Shell 辅助脚本 |
**未纳入 Git 跟踪的内容:** APK 文件、JADX 输出树(`superband_jadx_src/`)以及完整的 `tools/` 目录(本地 JADX 安装 / 压缩包)— 请在本地下载或重新生成。
## 需求
- **dg01-ble:** Rust 工具链,通过 BlueZ 管理蓝牙适配器(典型 Linux 桌面 / Pi)。
## BlueZ 连接 / 断开(Linux)
子命令 **`connect`** 与 **`disconnect`** 使用与 Ubuntu **Bluetooth** 设置切换相同的 D-Bus 方法:**`org.bluez.Device1.Connect`** 与 **`Disconnect`**(通过 [bluer](https://github.com/bluez/bluer),路径与 `bluetoothctl` 相同)。在连接前,若 BlueZ 允许,工具会设置 **`Trusted=true`**(这有助于 **未配对** 的 LE 外设 — 面板上可能显示 **Paired: No**)。
- **默认行为:** 连接前不执行额外的 LE 扫描(`--warm-scan-secs` 默认为 **0**)。仅当设备从未被 BlueZ 识别且需要填充设备信息时才使用 **`--warm-scan-secs N`**。
- 如果通用 **`Connect`** 在仅支持 LE 的设备上挂起,可尝试 **`--nus-profile-connect`**(即在 NUS 服务 UUID 上执行 **`ConnectProfile`**)。
```
cd dg01-ble && cargo run --release -- connect --addr 0A:93:79:0C:DD:20
cd dg01-ble && cargo run --release -- disconnect --addr 0A:93:79:0C:DD:20
```
## 查找设备(Linux)
`dg01-ble find` 会通过 **`Device1.Connect`** 打开链接,随后将查找负载写入 NUS TX 特征值。若 ACL 已建立,BlueZ 会快速返回。**`--connect-timeout-secs`**、**`--nus-profile-connect`** 和 **`--reconnect`** 可应对不稳定连接。详见 **[PROTOCOL.md](PROTOCOL.md)**。
可选的 **`--warm-scan-secs N`**( **`N` > 0**):仅在地址尚未存在于 BlueZ 缓存且需要在 **`Connect`** 前填充设备信息时运行 LE 广播发现。
若 **手机应用** 持有唯一的 LE 连接,请断开该连接或关闭手机蓝牙,以便 Linux 可以连接。
快速 BlueZ 检查(不执行 `Connect`):`cargo run --release -- is-connected --addr 0A:93:79:0C:DD:20`。若 **`Connected`** 为假,则退出状态为 **1**(同时会打印 **`ServicesResolved`** 仅作信息提示)。
## 标准 GATT:设备信息 + 电池(`device-info`)
子命令 **`device-info`** 连接并读取:
- **设备信息(0x180A):** 制造商、型号、序列号、固件、硬件、软件、系统 ID、IEEE 监管信息、**PnP ID** — 解码方式类似 nRF Connect(UTF-8 字符串;PnP 字段单独解析)。
- **电池服务(0x180F):** **电池电量级别(0x2A19)** — SIG 定义为 0–100 的单字节百分比;部分 OEM(包括这里的 DG01)会返回额外字节;工具在 ≤100 时显示第一字节为百分比,其余字节以十六进制打印。
若 **0x180F** 缺失,则打印单行提示;**0x180A** 仍为命令成功所必需。
厂商 UART **`query`**(命令 26)与 SIG GATT 分离 — 若需要 APK 风格的密钥 **和** 标准 DIS/电池读取,请同时使用两者。
## 许可证
本仓库中的工具与文档按原样提供,用于互操作性研究。第三方应用与固件仍遵循其各自的许可条款。
标签:BLE协议, bluer, BlueZ, Cutter, D-Bus, DG01, DIS, FitPro, GATT, LCD徽章, Linux工具, NUS, OEM, Rust, SuperBand, 云资产清单, 关键词SEO, 可视化界面, 固件分析, 扫描, 断开, 时间同步, 电池服务, 看面上传, 端口探测, 网络流量审计, 蓝牙低功耗, 设备信息, 连接, 逆向工具, 逆向工程, 通知系统