v0l/anker-rs
GitHub: v0l/anker-rs
一个通过蓝牙 LE 直接监控和控制 Anker SOLIX 便携电源的 Rust CLI 与库,无需官方 App 或云服务即可读取遥测数据并控制输出。
Stars: 0 | Forks: 0
# anker-rs
一个微型 Rust 库 (`anker_solix`) 和 CLI (`anker`),用于通过 **Bluetooth LE** 监控和控制 **Anker SOLIX** 便携式移动电源——无需云服务、无需账户,也不需要 200 MB 的应用程序。
已在真实硬件上针对 **SOLIX C1000 Gen 2** (A1763) 确认可用:
遥测读取、AC/DC 输出控制以及完整的加密握手。
## 功能
- 🔍 扫描附近的 SOLIX 设备
- 🔐 完整的 ECDH (secp256r1) + AES-128-CBC 会话协商(与应用程序固件匹配)
- 🔋 电池百分比、健康度、充电限制、温度
- ⚡ 输入/输出功率及各端口状态/瓦数(AC、DC 12 V、太阳能、USB-C/A)
- 🎛️ 切换 AC 和 DC 输出
- 🧾 序列号 / 零件号 / 固件
- 📤 文本或 JSON 输出
## 支持的型号
| 型号 | 遥测 | 控制 | 备注 |
|-------|-----------|---------|-------|
| C1000 Gen 2 (A1763) | ✅ 已测试 | ✅ 已测试 | 需要订阅 `4100`;遥测数据在 `c421`/`c900`;AC 在 `4101`,DC 在 `4102` |
| C300 / C800 / C1000 gen 1, F2000, F3800 | ⚠️ 已实现 | ⚠️ 已实现 | Gen-1 布局;尚未在此处验证 |
设备型号会根据广播的 BLE 名称自动检测。
## 构建
```
cargo build --release
```
## 用法
```
# 列出附近的站点
anker scan
# 单个遥测快照(默认匹配名称子串:"C1000")
anker status
anker -d "C1000" status
anker -f json status
# 实时流直到 Ctrl-C
anker monitor
# 控制输出
anker dc on
anker ac off
```
全局标志:`-d/--device `、`--scan-secs `、`-f/--format text|json`,
`-v` / `-vv` 用于日志记录。
## 库
```
use anker_solix::Device;
use std::time::Duration;
#[tokio::main]
async fn main() -> anker_solix::Result<()> {
let mut dev = Device::find_and_connect("C1000", 6).await?;
let t = dev.next_telemetry(Duration::from_secs(10)).await?;
println!("battery {:?}%", t.battery_percentage);
dev.set_dc(true).await?;
Ok(())
}
```
## 工作原理
1. **发现** —— 扫描广播的标识符服务 `0000ff09-…`。
2. **协商** —— 在命令特征值
(`8c85_0002-…`) 上进行固定的 6 阶段握手。客户端私钥是固定的,因此每个发送的帧都是恒定的;设备返回一个临时的公钥,通过 ECDH 将其组合成一个 32 字节的密钥(key = 前 16 字节,IV = 后 16 字节)。
3. **会话** —— 遥测数据通过通知特征值 (`8c85_0003-…`)
以 `0xFF09` 帧格式的数据包到达,从分片重组并经过 AES-CBC 解密
为 TLV 参数。命令以相同方式加密,并带有滚动的时间戳以实现防重放保护。
## 许可证
MIT
标签:动态分析, 可视化界面, 通知系统