Passive Wi-Fi drone detection system for jailbroken Amazon Kindle 4
Detects DJI, Parrot, Autel, and other drone models using Wi-Fi signal analysis on the built-in Atheros AR6003 chipset. Displays real-time detection HUD, threat scores, and RF activity on the device's e-ink display.
β
Real-time Wi-Fi AP scanning (5-second cycle)
β
Threat scoring system (0β100 scale, ML-ready)
β
Distance estimation (log-distance path loss model)
β
Temporal analysis (movement detection, channel hopping, transient tracking)
β
CRC-based external RF detection (2.4 GHz interference indicator)
β
E-ink HUD display (50Γ40 ASCII text, radar images, weather/sensor pages)
β
Hardware sensor integration (battery %, room temperature)
β
Persistent CSV logging (14-column detection history)
β
Power bank keepalive (automatic charging throttle to prevent auto-shutoff)
| Item | Details |
|---|---|
| Device | Amazon Kindle 4 (2011 model, 600Γ800 e-ink) |
| Jailbreak | SSH enabled on /mnt/us/ mounted partition |
| Chipset | Atheros AR6003 hw2.1.1 (built-in, no USB WiFi adapter needed) |
| CPU | ARM, 256 MB RAM minimum |
| WiFi | Passive scanning (no monitor mode required) |
# On development machine
mvn -DskipTests clean package
# Output: drone-app/target/drone-app-2.0.0-SNAPSHOT.jar# Upload JAR and runtime scripts
scp drone-app/target/drone-app-2.0.0-SNAPSHOT.jar root@<kindle-ip>:/mnt/us/
scp scripts/kindle/drone-*.sh root@<kindle-ip>:/mnt/us/
ssh root@<kindle-ip> "chmod +x /mnt/us/drone-*.sh"# Start detector
ssh root@<kindle-ip> "/mnt/us/drone-control.sh start"
# View status
ssh root@<kindle-ip> "/mnt/us/drone-control.sh status"
# Stream logs
ssh root@<kindle-ip> "tail -f /mnt/us/drone-app.log"
# Stop detector
ssh root@<kindle-ip> "/mnt/us/drone-control.sh stop"- Path:
/mnt/us/drone-app.log - Format: Tab-separated fields (timestamp, MAC, SSID, distance, threat, flags)
- Update: Every 5 seconds
- Retention: Auto-trimmed at 10 MB
- Path:
/mnt/us/drone_nets.csv - Columns: mac, ssid, firstSeen, lastSeen, count, peakSignal, oui, keyword, obsTime, distHist, lastCh, surgeCnt, maxApp, lastFlags
- Purpose: Persistent baseline and anomaly tracking
ssh root@<kindle-ip> "cat /mnt/us/drone-app.log | tail -20"DRONE 02:48:34 AP:30 THR:2 #45
CRC+52 NF:-96 SNR:33 LQ:42 ARMED
--------------------------------------
!~* 7m -53dB C6 DJI_MAVIC_3 DJI NEW STR
+ 43m -74dB C3 [HIDDEN] HID RMAC
65m -79dB C9 HomeNetwork
71m -80dB C6 Buffonn
- Main HUD β Top 30 APs by threat score
- Weather page β Current conditions + radar image
- Moon/Space page β Placeholder pages
- Home temp β Room temperature history (if papyrus sensor available)
- Radar β Graphical AP position map (50 sec animation)
| Symbol | Meaning |
|---|---|
! |
Threat β₯60 (likely drone) |
+ |
Threat β₯30 (suspicious) |
~ |
Moving (signal variance >10 dB) |
* |
New device, not in baseline |
ARMED |
Baseline complete, alerting active |
LEARN |
Still building baseline (first 30 loops) |
** RF BURST ** |
CRC delta >200 (non-WiFi 2.4 GHz) |
** EXT RF ** |
Idle CRC detected external RF |
πΈ Display Screenshots (8 pages)
The app opens two ports for control and monitoring:
# Enable loopback access (for local button control)
iptables -A INPUT -i lo -j ACCEPT
# Enable external HTTP access on port 5555
iptables -A INPUT -i wlan0 -p tcp --dport 5555 -j ACCEPT
iptables -A INPUT -i wlan0 -p udp --dport 5555 -j ACCEPT
# Persist firewall rules
iptables-save > /etc/iptables/rules.v4# View current rules
iptables -L -n
# Reset to defaults (WARNING: disconnects SSH)
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
# Restore from backup
iptables-restore < /mnt/us/iptables_backup.confπ₯οΈ Web UI Screenshots
Edit drone-app/src/main/resources/application.properties before building:
# Scan interval (milliseconds)
detector.scan.interval=5000
# Threat score thresholds
detector.threat.alert=60
detector.threat.suspicious=30
# Distance model parameters
detector.distance.rssi.ref=-30
detector.distance.path.loss.exp=2.7
# Baseline learning period (scan cycles)
detector.baseline.loops=30
# CRC detection sensitivity
detector.crc.alert.threshold=200
detector.crc.idle.interval=10000
# E-ink refresh interval (milliseconds)
display.refresh.interval=5000
display.page.hold.ms=300000- Movement threshold (MOV): RSSI standard deviation >10.0 dB
- New device threshold (NEW): Signal >β80 dBm
- Channel hop threshold (HOP): Seen on 2+ channels
- Transient threshold (TRN): Peak signal >β80 dBm + 2+ gaps in history
- Hidden range limit (HID): <80 meters estimated distance
- EMA smoothing factor (Ξ±): 0.25 (Οβ20 seconds)
# Check if port 5555 is in use
netstat -tlnp | grep 5555
# Check Java runtime
ls -la /mnt/us/java/jre/bin/java
# Check logs
cat /mnt/us/drone-app.log- Clear e-ink cache:
eips -c - Restart app:
/mnt/us/drone-control.sh restart - Check for "eips -f" calls in logs (known issue, fixed in v2.1)
- Run:
wmiconfig -i wlan0 --power maxperf(reapplied every 2.5 min automatically) - Check power management:
wmiconfig -i wlan0 --getpower - Reduce scan dwell time:
wmiconfig -i wlan0 --scan --pas=100(default 200 ms)
- Increase scan interval: edit
detector.scan.interval=10000(10 seconds) - Disable radar display: comment out radar page rotation
- Enable power saving:
echo rec > /proc/sys/kernel/...(reduces detection sensitivity)
- Add rule:
iptables -A INPUT -i wlan0 -p tcp --dport 5555 -j ACCEPT - Restart app:
/mnt/us/drone-control.sh restart - Verify:
iptables -L -n | grep 5555
drone/
βββ README.md # This file
βββ docs/
β βββ DETECTION_SCORING.md # Threat scoring algorithm
β βββ CHIPSET_CAPABILITIES.md # AR6003 firmware guide
β βββ DISTANCE_CALCULATION.md # RSSI path loss models
β βββ HARDWARE_SENSORS.md # Kindle 4 I2C sensors
βββ pom.xml # Parent Maven config
βββ drone-util/ # Shared utilities
βββ drone-core/ # Detection engine
βββ drone-display/ # E-ink rendering
βββ drone-app/ # Packaged JAR (main executable)
βββ scripts/kindle/
βββ drone-control.sh # Control script (start/stop/status)
βββ drone-start.sh # Idempotent startup
βββ drone-install-autostart.sh # Enable boot autostart
βββ drone-button-*.sh # Hardware button integration
- DETECTION_SCORING.md β Threat scoring algorithm, temporal analysis flags
- CHIPSET_CAPABILITIES.md β AR6003 firmware, wmiconfig commands, CRC analysis
- DISTANCE_CALCULATION.md β RSSI path loss models, Java implementations
- HARDWARE_SENSORS.md β I2C devices, temperature/battery APIs
- DEPLOYMENT_GUIDE.md β Production setup, firewall, logging, troubleshooting
- scripts/kindle/README.md β Runtime control scripts, button mapping
| Address | Device | Type | Status | Access |
|---|---|---|---|---|
| 1-0048 | Papyrus PMIC | Temperature | β Working | /sys/bus/i2c/devices/1-0048/papyrus_temperature |
| 1-0055 | Yoshi Battery | Fuel gauge | β Working | lipc-get-prop -i com.lab126.powerd battLevel |
| 1-0035 | Maxim AL32 | Ambient light | β No driver | Unreadable |
| 1-001a | WM8962 | Audio codec | β No sensor | Not useful |
| 1-0006 | SMB347 | Charger | β Not responding | See SMB347_INVESTIGATION.md |
- Power mode resets β Kindle daemon resets radio to "rec" every ~2.5 min. App re-applies
--power maxperfevery 30 loops. - CRC errors during scanning β Normal (30β100/interval). Non-WiFi RF >200 = interference, >500 = drone nearby.
- E-ink refresh overhead β Minimize with diff-based updates; avoid
eips -faftereips -g. - Power bank auto-shutoff β At 100% battery, charging current drops, power bank sees low load. App auto-throttles to β€85%.
- Java 8+ (Maven compatible)
- Maven 3.6+
- Bash/Git
mvn clean compilemvn -DskipTests packagemvn testPre-built Kindle-compatible JAR is included in drone-app/target/. To rebuild for ARM:
# Use ARMv7 JDK or cross-compile toolchain
mvn -DskipTests -P arm packageThis project is provided as-is for educational and RF research purposes.
Contributions welcome! Please submit issues and pull requests via GitHub.
- AR6003 Documentation: Atheros datasheets (limited public availability)
- Kindle Jailbreak: MobileRead wiki (https://www.mobileread.com/)
- E-ink Rendering: eips tool documentation
- RSSI Path Loss: See DISTANCE_CALCULATION.md for academic references




