The Python workspace contains three packages built on the shared Rust protocol. Only the client performs device I/O; firmware inspection is read-only.
| Package | Purpose |
|---|---|
soundcore-d3200 |
Async recorder client over Bluetooth LE, optional Wi-Fi, and caller-supplied Classic Bluetooth transport. Start here to talk to a D3200. |
soundcore-d3200-core |
Transport-free protocol bindings: framing, commands, crypto, file parsing, and Ogg output. |
bestechnic-ota |
Read-only Bestechnic OTA image inspection. Does not install firmware. |
soundcore-d3200 depends on soundcore-d3200-core, which uses the Rust protocol crate. Building the native bindings from source requires Rust; installing published wheels may not. Python 3.12+ is required.
For an application using the recorder:
uv add soundcore-d3200 # Bluetooth LE
uv add 'soundcore-d3200[wifi]' # optional Wi-Fi transfersSee the client guide for a working example, pairing, downloads, and transport limitations.
The Python project and uv.lock live at the repository root, while Python's mise tools and tasks live in mise.toml. From the root:
mise -C python install # uv; Rust comes from the root mise.toml
mise -C python run test # all Python tests, no recorder required
mise -C python run lint # Ruff
mise -C python run check:boundaries # build and import wheels in isolationThe root entry points (mise run test:python, mise run lint, and mise run ci) delegate to these tasks. The tests use synthetic and recorded protocol frames; no Bluetooth hardware is needed.