
Bluehound active
A continuous BLE and Classic Bluetooth scanner with time-searchable SQLite logging and a built-in web dashboard.
- role
- author & maintainer
- language
- Objective C++
- radios
- BLE + Classic Bluetooth
- storage
- SQLite (time-searchable)
- status
- active
Overview
Bluehound is a continuous Bluetooth scanner that watches the airwaves and records everything it sees. It sweeps for both BLE and Classic Bluetooth devices in a tight scan/rest loop, decodes what each advertisement exposes, and writes every sighting to a time-searchable log — so you can ask “what was around at 3pm last Tuesday?” and get an answer.
It’s built for small always-on machines: run it on an embedded device, let it listen, and stream the results off over WiFi.
How it works
scan (BLE + classic) ──▶ decode ──▶ SQLite log ──▶ HTTP server ──▶ dashboard- Scanning — cycles through short BLE and Classic Bluetooth scans on a fixed interval, deduplicating devices it has already enumerated within a session.
- Decoding — resolves standard GATT service UUIDs and Classic device-class metadata (major/minor class, service records) into human-readable labels.
- Storage — every sighting lands in a SQLite database with timestamps, so the history is queryable after the fact; the log rotates after a configurable entry cap to stay bounded.
- Dashboard — an embedded HTTP server (single-header cpp-httplib) serves a live web dashboard, making the scanner self-contained with no external services.
Stack
Written in C++17, with a thin Objective-C++ layer bridging Apple’s
IOBluetooth / CoreBluetooth frameworks for Classic scanning on macOS. Radio
access goes through SimpleBLE; persistence is plain SQLite3. Dependencies
(SimpleBLE, cpp-httplib) are vendored for offline builds, and the whole thing
compiles with a single CMake invocation.