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
标签:动态分析, 可视化界面, 通知系统