Lab: scanning Bluetooth Low Energy devices you own
In short: Bluetooth Low Energy devices broadcast small adverts that anyone nearby can receive. In this lab you scan for your own devices, see what names, addresses and identifiers they leak, and learn which design choices protect privacy.
Aim and what you need
Bluetooth Low Energy (BLE) is used by fitness bands, tags, sensors and smart locks. Devices send advertising packets several times a second so phones can find them. The aim is to see that traffic for your own device and judge what it gives away.
- A Linux laptop or Raspberry Pi with Bluetooth (the BlueZ stack is standard), or Windows or macOS for the Python part.
- Python 3 and the
bleaklibrary. - A BLE device you own, for example a fitness band, a sensor or an ESP32.
Ethics and law: scanning picks up other people's devices too. Do not record, track or connect to devices you do not own. Filter your results to your own device and delete raw scan logs. Logging identifiers that can be linked to people may fall under data protection law such as the UK GDPR.
Steps
- Check Bluetooth is up, then scan with
bluetoothctland note your device's address. - Show its details, then stop the scan.
- Install bleak and run the script, replacing the filter with your device's name or address.
- Move the device closer and further away and watch the RSSI (received signal strength) change.
- Check the device's app for privacy options, such as hiding its name or turning off always-on advertising.
rfkill list bluetooth
sudo systemctl status bluetooth
bluetoothctl
power on
scan on
devices
info <your-device-address>
scan off
quit
python3 -m venv ble-env
source ble-env/bin/activate
pip install bleak
# scan_mine.py
import asyncio
from bleak import BleakScanner
MY_NAME = "<part-of-your-device-name>"
async def main():
found = await BleakScanner.discover(timeout=10.0, return_adv=True)
for address, (device, adv) in found.items():
if adv.local_name and MY_NAME in adv.local_name:
print(address, adv.local_name, adv.rssi, adv.service_uuids, adv.manufacturer_data)
asyncio.run(main())
python3 scan_mine.py
How to verify and interpret
Your device should appear with its name, an RSSI value (for example -55 dBm close by and -85 dBm across the house) and one or more service UUIDs (universally unique identifiers) that hint at what it does. Run the scan a few times over an hour. If the address changes, the device uses random private addresses, which make tracking harder. If the address and a personal name such as "Sam's band" stay the same, anyone nearby can recognise and follow it.
| Observation | What it means |
|---|---|
| Rotating address | Privacy feature working |
| Fixed public address and personal name | Easy to track; rename it |
| Advertises all the time | Visible even when unused |
| Connects without pairing | Weak security; check firmware and settings |
Troubleshooting and clean-up
- No adapter:
rfkill unblock bluetooth, or check the USB dongle is supported. - Permission errors: on Linux your user may need to be in the
bluetoothgroup. - Device not seen: many devices stop advertising once paired with a phone; turn phone Bluetooth off briefly.
- No name shown: some names are in the scan response, so scan a little longer.
Deactivate and delete the virtual environment if you no longer need it, delete scan output and rename any device that shows your real name.
Practice
What does a changing BLE address over time tell you?
Why filter the scan to your own device?
What does RSSI give you?
Key takeaways
- BLE devices broadcast adverts anyone nearby can receive.
- Adverts can reveal names, identifiers and presence.
- Random private addresses reduce tracking.
- Scan and record only your own devices.
- Rename devices that broadcast personal names.
Original content written by Mohamed Fayas for FM TecHub. © 2026 FM TecHub. You're welcome to share a link to this page; please don't copy the text elsewhere without permission.