BLE device scanner, fingerprinter, and tracker detector for security research
Project description
ble-radar
BLE device scanner, fingerprinter, and tracker detector. Find nearby Bluetooth devices, identify brands/models, detect AirTags and Tile trackers, and fingerprint IoT devices.
Install
pip install ble-radar
Quick Start
import asyncio
from bleradar import BLEScanner
async def main():
scanner = BLEScanner()
result = await scanner.scan(duration=10.0)
print(f"Found {result.count} devices in {result.scan_duration:.1f}s")
for dev in result.by_rssi(min_rssi=-70):
print(dev)
asyncio.run(main())
Filter Results
result = await scanner.scan(duration=10.0)
# Strong signal only
strong = result.by_rssi(min_rssi=-60)
# By name
apple_devices = result.by_name("AirPods")
# By manufacturer
apple = result.by_manufacturer(0x004C)
# By service UUID
led_controllers = result.by_service("49535343")
# Only connectable
connectable = result.connectable()
Device Fingerprinting
from bleradar import BLEScanner, FingerprintDB
scanner = BLEScanner()
fingerprint_db = FingerprintDB()
result = await scanner.scan(duration=10.0)
for dev in result.devices:
fp = fingerprint_db.identify(dev)
print(f"{dev.name or dev.address}: {fp.brand} {fp.model} ({fp.device_type})")
print(f" Confidence: {fp.confidence:.0%}")
print(f" Clues: {', '.join(fp.clues)}")
Tracker Detection
Find AirTags, Tile trackers, and other tracking devices nearby:
result = await scanner.scan(duration=10.0)
trackers = fingerprint_db.find_trackers(result.devices)
if trackers:
print(f"WARNING: {len(trackers)} tracker(s) detected!")
for dev, fp in trackers:
print(f" {dev.address} ({dev.name}) - {fp.brand} {fp.model} @ {dev.rssi}dBm")
Unknown Devices
Find devices that don't match any known pattern — potential security targets:
unknown = fingerprint_db.find_unknown(result.devices)
for dev in unknown:
print(f"Mystery device: {dev.address} RSSI:{dev.rssi}")
print(f" Manufacturer data: {dev.manufacturer_data}")
print(f" Service UUIDs: {dev.service_uuids}")
Continuous Monitoring
import asyncio
from bleradar import BLEScanner
scanner = BLEScanner()
def on_device_found(dev):
print(f"[NEW] {dev}")
async def monitor():
result = await scanner.scan(
duration=60.0,
callback=on_device_found
)
asyncio.run(monitor())
Requirements
- Python >= 3.10
- Bluetooth adapter (supports BLE 4.0+)
bleak(auto-installed)- Linux recommended (macOS and Windows also supported)
Use Cases
- Security research: Scan for nearby IoT devices, identify vulnerable hardware
- Tracker detection: Find AirTags/Tile trackers being used for surveillance
- Network auditing: Map all BLE devices in an environment
- IoT development: Debug and fingerprint BLE peripherals
- Penetration testing: Recon before targeting BLE-enabled systems
Donate
If this saved you time or caught a tracker:
- PayPal: bill.jtrammell@gmail.com
- Cash App: $slauter99
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ble_radar-0.1.0.tar.gz.
File metadata
- Download URL: ble_radar-0.1.0.tar.gz
- Upload date:
- Size: 6.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a6916586c66ad7a18ad717248d60bb430f0c9ac143ec57fca4208a6922b660b
|
|
| MD5 |
1a1f7d8c5557b948328becbd97d194a6
|
|
| BLAKE2b-256 |
1037ab824c2b77088f71f5a9e8bcdac2ecdaa463090ceed3156ed5d7eab44cf2
|
File details
Details for the file ble_radar-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ble_radar-0.1.0-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
234ed40e14d83f56573a5ab3a62b4d7454c24c5a1a83d19fd50ab655e37d96b3
|
|
| MD5 |
41fb64acd559a59b83e8f9099f2dd738
|
|
| BLAKE2b-256 |
5eac476b850645e817bb0d903f247f6bc9bfe8f101d7c0c3f4426f1c8b9f2ce7
|