andrewseago/d3200-ble-note-downloader
GitHub: andrewseago/d3200-ble-note-downloader
一个通过 BLE 直接下载并解密 Anker Soundcore D3200 录音笔本地加密录音的 Python 工具,让用户无需依赖云端即可获取自己的音频文件。
Stars: 0 | Forks: 0
# Soundcore D3200 BLE 笔记录音下载器
下载并解密存储在 **Anker Soundcore D3200**(“soundcore Work”)AI 录音笔上的语音录音——完全通过低功耗蓝牙(Bluetooth Low Energy)进行,**无需云账号,也无需互联网连接**。
D3200 将其录音以加密的 Opus 音频格式存储在设备上。本项目记录了 BLE 传输协议和加密方案,并提供了一个可用的参考客户端,该客户端可以将录音从设备中导出,并写入普通且可播放的 `.ogg` 文件。
## 为什么开发此项目
D3200 是一款出色的录音笔,但通常从中提取音频意味着要通过 Soundcore 应用程序和 Anker 的云端。这个项目的存在是为了让设备所有者能够在本地从他们**自己**的硬件中获取他们**自己**的录音,并将其输入到他们喜欢的任何 pipeline 中(例如本地转录),而无需经过云端往返。
## 快速开始
### 前置条件
- **Python 3.12+** 以及一个正常工作的 Bluetooth 适配器。
- **D3200 已开机且未连接到 Soundcore 应用程序。** 该录音笔一次只接受一个 BLE 连接——如果手机应用程序已连接(或者应用程序在后台打开并自动重新连接),扫描或连接将会失败。请先强制退出该应用程序,或关闭手机的 Bluetooth。
- **macOS:** 运行 Python 的程序(您的终端或 IDE)需要在*系统设置 → 隐私与安全性 → Bluetooth* 下拥有 Bluetooth 权限。如果没有此权限,扫描将静默地返回空结果。首次运行时 macOS 应该会提示授予权限;如果没有,请手动添加该应用程序。
- **Linux:** 需要 BlueZ(由 `bleak` 的后端提供支持)。运行扫描可能需要为您的用户授予适当的 Bluetooth 权限。
```
git clone https://github.com/andrewseago/d3200-ble-note-downloader.git
cd d3200-ble-note-downloader
python3 -m venv .venv && source .venv/bin/activate
pip install -e . # installs bleak + cryptography
# 1. 确认设备是可发现的
python3 soundcore_d3200_downloader.py --scan-only
# 2. 下载 + 解密最新的录像到 ./downloads
python3 soundcore_d3200_downloader.py --output downloads
# 或者通过 file id (hex) 下载特定的录像,如在扫描期间列出的:
python3 soundcore_d3200_downloader.py --file-id --output downloads
```
输出结果将保存在 `downloads/` 中:
- `decrypted_.ogg` — 可播放的 Ogg/Opus(可在任何音频播放器中打开)
- `decrypted_.raw_opus` — 串联的原始 Opus 数据包
- `raw_.bin`, `detail_.bin` — 原始 BLE 捕获文件,用于分析
### 解密之前保存的捕获文件(离线)
如果您已经拥有 `raw_*.bin` + `detail_*.bin` 文件对以及 session,则可以在没有设备的情况下进行解密:
```
python3 tools/d3200_decrypt_ble.py \
--detail downloads/detail_.bin \
--raw downloads/raw_.bin \
--session-json downloads/session_.json \
--ogg-out downloads/decrypted_.ogg
```
## 故障排除
- **扫描不到任何内容。** 设备可能仍连接到 Soundcore 应用程序——断开连接/强制退出该应用程序(或关闭手机 Bluetooth)。在 macOS 上,还需确认您的终端是否具有 Bluetooth 权限(请参阅前置条件)。该设备使用轮换的 BLE 地址,因此扫描程序是通过 RCSP service UUID 而不是固定的 MAC 进行匹配的——请给它充足的扫描时间。
- **已连接,但未列出任何文件。** 确保录音笔上确实有录音文件,并且在运行期间保持开机状态且在通信范围内。
- **`file-key unwrap failed`。** 这几乎总是意味着 ECDH 握手未能顺利完成。断开连接,稍等片刻,然后重试;生成的 `downloads/qc_keypair.json` 会跨运行重复使用,保留它即可。
- **`.ogg` 文件无法播放。** 任何支持 Opus 的播放器都可以正常播放(如 VLC、`ffplay`)。`ffprobe decrypted_.ogg` 应该会报告一个 Opus 立体声流。
## 工作原理
完整的协议和加密机制记录在 **[docs/BLE_DECRYPTION_GUIDE.md](docs/BLE_DECRYPTION_GUIDE.md)** 中。简而言之:
1. **传输层 (Transport)** — 基于 BLE GATT 的 JieLi RCSP 帧(service `020cf5da-…`,写入 char `00007777-…`,通知 char `00008888-…`)。
2. **握手 (Handshake)** — 在 NIST P-256 上进行 ECDH。共享密钥提供给 HKDF-SHA256(salt/info = `0x010203`)以派生出 32 字节的 **session key**。
3. **单文件密钥 (Per-file key)** — 包含文件详情的响应带有一个 46 字节的包装密钥(wrapped key)。使用 session key 对其进行 AES-256-CTR 解密后会得到 `b"soundcored3200" || <32-byte fileKey>`。
4. **音频 (Audio)** — 每个 160 字节的 Opus 数据包都使用 `fileKey` 和按数据包计算的计数器 `audio_nonce[0:12] || BE32(sequence * 10)` 进行 AES-256-CTR 解密。
5. **容器 (Container)** — 解密后的数据包被封装为标准的 Ogg/Opus 文件。
所有原语都是标准的(ECDH P-256、HKDF-SHA256、AES-256-CTR)。此过程不涉及任何特定于设备的秘密、PIN 码或云账号。
## 目录结构
```
soundcore_d3200_downloader.py Reference BLE client (scan → handshake → download → decrypt)
tools/d3200_sdk_crypto.py Key derivation, file-key unwrap, packet decryption
tools/known_plaintext.py Ogg/Opus parsing and D3200-compatible container writer
tools/d3200_decrypt_ble.py Offline decrypt CLI for saved captures
docs/BLE_DECRYPTION_GUIDE.md Full protocol + crypto reference
tests/ Crypto known-vector and Ogg/Opus container tests
```
## 范围与法律声明
这是一项**个人互操作性和数据可移植性研究**,旨在供拥有 D3200 的用户提取自己的录音。
- 它仅作用于您拥有的硬件和您制作的录音。
- 它使用标准、公开记录的加密原语。它不分发任何 Anker 固件、应用程序二进制文件或专有密钥,也不包含任何规避 DRM 的工具。
- 扫描并连接到他人的 Bluetooth 设备,或访问不属于您的录音,是本项目不支持也不允许的用途。
您有责任遵守您当地的法律以及 Anker 的服务条款。本项目按“原样”提供,不提供任何担保。本项目与 Anker 或 Soundcore 没有关联,也未获得其认可。
## 许可证
[GPL-3.0-or-later](LICENSE)。
标签:Python, 云资产清单, 无后门, 物联网, 硬件互联, 蓝牙低功耗, 逆向工具, 逆向工程, 音频解密