Case study
uniden-r8-ble: reconstructing the Uniden R8 radar detector's BLE telemetry
Decodes the undocumented Bluetooth Low Energy output of a Uniden R8 radar detector into a receive-only collector for a Raspberry Pi, with live telemetry, alert start/update/end events, SQLite history and optional MQTT and Home Assistant publishing. The author worked the protocol out from the wire on a real detector, building on earlier R8w findings from AegisX86/UnidenR8wlink, and grades every claim in PROTOCOL.md by its evidence: measured on this R8, seen on another model, decompiled from an app but untested, or inference. Unknown fields are carried through raw rather than given invented meanings.
- Targets
- Protocol
- Category
- Independent reconstruction cases
- Relationship
- Independent reconstruction project
- Sources reviewed
Requirements & limits
- Reviewed at the main-branch head of 2026-09-09 (package version 0.1.0). README reports 1 Hz telemetry decoded without errors on a moving vehicle and one real Ka-band alert captured on the R8, while PROTOCOL.md still grades active-alert fields as inherited from R8w captures; it also states that the live stream carries no position, and that settings blocks remain undecoded.
- Requires the user's own Uniden R8 and a Linux host with BlueZ, documented on a Raspberry Pi Zero 2 W with an optional systemd service, gpsd-connected GNSS receiver, PiSugar battery and MQTT broker. No vendor app, firmware or captures are committed; README says raw captures are kept in a git-ignored local store, and Bluetooth addresses and coordinates are redacted before publication.
- Python 3.11+, with bleak as the optional BLE extra and paho-mqtt for publishing. README says the installed package sends no application commands to the detector and that an AST audit, run by selftest and in CI, checks this; commands used for the coordinate experiments were sent from separate scripts at the owner's instruction, as SAFETY.md records.
- CI runs ruff and pytest on Python 3.11–3.13 plus a selftest job; README badges 754 tests, which need no hardware, broker, gpsd or network. README notes that MQTT and the dashboard have not met real hardware.
- MIT license. README states the project is not affiliated with or endorsed by Uniden and is diagnostic software, not a substitute for the detector's own display or warnings. HANDOFF.md is written for a person or an agent taking over the project.
About this entry
The description was reviewed against primary sources.
Primary sources
- docs/PROTOCOL.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- README.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- docs/SAFETY.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- docs/EVIDENCE.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- docs/CAPABILITIES.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- docs/HANDOFF.md GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- pyproject.toml GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- .github/workflows/ci.yml GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
- LICENSE GitHub · JeremyWhittaker/unidenr8_bluetooth · Revision 46c7e1a
More in Protocols
- opendash: reconstructing the Scanmatik SM3 J2534 adapter protocol · Case study
- OWL: an open Apple Wireless Direct Link implementation · Case study
- QuestPad: a USB gamepad from the Quest Touch radio protocol · Case study
- Stadiacast: reconstructing the Stadia Controller's Wi-Fi service · Case study
- os-xgs-npu: reconstructing Sophos XGS coprocessor interfaces · Case study
- LibreMP: an Epson EasyMP screen caster from packet-capture research · Case study