For DEF CON 34 this year I carried an ESP32 badge around and counted the 2.4 GHz traffic I could sense with it. The result is a 55.6-hour census and hereβs the permanent public archive for your enjoyment.
How it worked
The badge ran a passive BLE scan continuously while sweeping every Wi-Fi channel about once every five seconds. It counted unique devices, channel use, signal strength, open networks, hidden networks, and named SSIDs.
I set it up so raw MAC addresses and BSSIDs never left the badge, wanted to be somewhat privacy conscious of the attendees since I knew I would be publishing this. It salted IDs each boot, discarded any BLE names, and uploaded only aggregates plus the six strongest SSIDs in each sample.
Every 30 seconds, the badge wrote a snapshot to a SPIFFS ring journal. When my phone hotspot was available, it connected to m phone and used that to send small HTTPS batches and deleted them only after the server acknowledged them.
Setup
Hardware itself was a Waveshare ESP32-S3-Touch-LCD-1.69: ESP32-S3R8, 8 MB PSRAM, 16 MB flash, and a 240Γ280 display. Firmware used ESP-IDF 5.5.5. Shoutout Steve Ruiz from X for putting everyone on the wave of cheap ESP32 dev devices.
I flashed it with my custom firmware, ran the hardware self-test, then provisioned an uplink over USB:
./dev flash
./dev selftest
net url https://d34-rf-census.pages.dev/api/ingest
net token <shared secret>
net set <hotspot-ssid> <password>
net auto on
The backend was actually pretty cool, it was a Cloudflare Pages Worker writing to D1 directly. The React site (statically compiled) read fixed aggregate endpoints.
ESP32-S3 β phone hotspot β Worker β D1 β archive
I got lucky in not needing a battery, once at the con I discovered I could power it from the COM port of my Laser Tag badge, so I didnβt have to add one or carry one around. It hung off the badge and ran all day without issues (until saturday when I forgot to turn it on lol).
Here it is cycling through the live screens:
Results
- 2,151 samples from Thursday morning through Saturday morning.
- At least 768 Wi-Fi access points in one session.
- At least 3,072 BLE identities in one session.
- 380 named SSIDs and 6,742 observations.
- 45 open networks, or 12% of the named set.
- The tables hit their ceilings 122 times for Wi-Fi and 334 times for BLE.
Unfortunately I hit the max limit for the tables on the BLE and Wifi pretty much immediately at the con (not really suprised).
The explorer tab breaks the data down by each day, with device churn, network arrivals, channels, and SSID info.
Best SSIDs
LAN of Hope and Glory, LOVE_AT_FIRST_BYTE, Nacho Wifi, RACOONS, The Citadel, Ozymandias, Many_Paws_Ranch, and Wine@Cheese.