Robert Goodall

Engineering the systems behind the systems.

Listening to

CASTLE OF GLASS

Linkin Park

« Portfolio

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

CI status

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.