r/DataArt

Image 1 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 2 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 3 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 4 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 5 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 6 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
Image 7 — [OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.
▲ 621 r/DataArt+2 crossposts

[OC] Bluetooth devices broadcasting in one room over 37 minutes. Each line is a unique device; each step takes its angle from the detection timestamp and its length from signal strength.

Dead Reckoning: This is a data visualization of BLE signals, part of an ongoing print series and a continuation of my creative practice exploring the invisible networks and communication systems around us.

Data source: Custom-built system that scans for and logs Bluetooth LE advertisement packets from devices around me. Devices like phones, watches, laptops, earbuds — captured on my phone. Every device broadcasts its presence continuously, to no one in particular, several times a second; this is a recording of that traffic. 388 device addresses, 68,373 detections, over 37 minutes on Aug. 8, 2026. Each record is the UUID, device address, signal strength, and timestamp.

Tools: BLE captured through my Data as Material app (React Native, react-native-ble-plx), streamed over datanet.art... also a data platform I built. The drawing engine is plain JavaScript (ES modules), HTML canvas on screen, and a hand-written SVG exporter for the print. No charting library.

Encoding — two variables, both straight from the packet:

  • Step angle ← timestamp. Where the detection falls in a repeating 15-second period becomes a compass bearing. Top of the period is straight up, then clockwise: 3.75s is east, 7.5s is south.
  • Step length ← RSSI. Signal strength, mapped linearly from −5dBm (shortest step, closest) to −100dBm (longest, weakest).

Each line starts at a random position on the page. Every detection adds one segment to that device's line, fixed from the previous position using only bearing and distance, with no external reference — which is how ships navigated before GPS (or pirate maps). That's not a metaphor; it's the same procedure, which is where the title comes from. Error compounds, so a line drifts further from any true position the longer it runs.

Two things you can read directly off the image: a device that lingers leaves a long, tangled path, and the busier the room, the denser the picture.

The scan happened in a static location, so this is visualizing the signals at a specific location for a specific duration of time. It's indexical: every line is a trace of a device that was physically present and broadcasting. Replay the same capture, and you get a near-identical drawing (minus the random start position). Device addresses are used only to group a line and seed its colour; nothing else from the packets is stored.

More about the project is available on my site: https://www.jordanshaw.com/home/dead-reckoning

u/jshaw3 — 8 days ago