- Top-3 accuracy: 50% (up from 33%) - Scoring formula: T:40% + P:25% + R:20% + F:10% + B:5% - Added timing ratio discriminator - Fixed test data generator parameters - Added uniqueness bonus and preamble boost - 15% faster processing (133ms vs 157ms) 🎯 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
19 KiB
GigLez - IoT RF Device Mapping Platform
Primary Directive
Build a Wigle-like crowdsourced platform for mapping Sub-GHz RF IoT devices. Accept .sub/.fff file uploads with GPS coordinates, automatically identify devices using known signature databases, and visualize IoT device distribution on an interactive map.
Core Objectives
1. Platform-Agnostic RF Signature Submission
- Primary Feature: Accept RF signal captures (.sub, .fff files) with GPS coordinates from ANY capture device
- Submission Requirements:
- GPS coordinates (latitude/longitude) - REQUIRED
- Timestamp - REQUIRED
- .sub or .fff file containing signal data - REQUIRED
- Optional: Device photos, user identification, session metadata
- Device Independence: Users can capture with Flipper Zero, LilyGo devices, RTL-SDR, HackRF, or any tool that outputs .sub/.fff format
2. Automatic Device Identification
Extract and identify devices from raw RF captures by:
- File Parsing: Extract protocol, frequency, modulation, bit patterns from .sub/.fff files
- Database Matching: Compare against known signature databases (Flipper Zero, RTL_433)
- Confidence Scoring: Rank matches by similarity (exact, partial, pattern-based)
- Community Verification: Allow users to confirm/correct automatic identifications
3. Wigle-Style Mapping Platform
Provide web-based visualization similar to Wigle.net:
- Interactive Map: Display captured devices with GPS markers
- Heatmap View: Show device density by geographic area
- Search & Filter: By device type, frequency, protocol, date range
- Statistics Dashboard: Total captures, unique devices, geographic coverage
- Leaderboard: Top contributors by uploads/verifications
Wigle.net Analysis & Implementation Strategy
Key Wigle.net Features to Replicate
1. Submission Workflow
Wigle Approach:
- CSV upload with standardized format
- Required fields: MAC, SSID, GPS coords, timestamp
- Pre-header with client metadata
- Batch uploads supported
GigLez Implementation:
- Accept .sub/.fff files + GPS JSON/CSV
- Required fields: GPS (lat/lon), timestamp, signal file
- Upload via web interface or API
- Support batch submissions (ZIP of .sub files + manifest.json)
2. Data Storage
Wigle Stats (2017):
- 349M WiFi networks
- 7.8M cell towers
- Billions of observations
- GPS coordinates for 99%+ of records
GigLez Architecture:
- PostgreSQL with PostGIS for geospatial queries
- Deduplicate by file hash + GPS proximity
- Store both raw files and parsed metadata
- Index by frequency, protocol, location, timestamp
3. Search & Discovery
Wigle Features:
- Text search (SSID, MAC)
- Geographic search (bounding box, radius)
- Advanced filters (encryption, date range)
- Export to CSV/KML
GigLez Equivalent:
- Search by device type, manufacturer, protocol
- Geographic search (radius, bounding box)
- Filter by frequency, modulation, confidence score
- Export to .sub, JSON, CSV, GeoJSON
4. Mapping Interface
Wigle UI:
- Zoom-based detail levels
- Color coding by signal type/quality
- Click for network details
- Overlays from entire database
GigLez UI:
- Leaflet.js/Mapbox for mapping
- Color by device type or frequency band
- Marker clustering for performance
- Click for device details (.sub file viewer)
- Heatmap overlay for density
5. User Accounts & Gamification
Wigle System:
- User registration required
- Upload tracking and statistics
- Leaderboard (global/monthly)
- Contribution milestones
GigLez System:
- Optional accounts (allow anonymous uploads)
- Track uploads, identifications, verifications
- Reputation score for accurate IDs
- Badges for contributions (first capture in city, 100 devices, etc.)
6. API Access
Wigle API:
- JSON-based RPC (not REST)
- Authentication via API token
- Query endpoints for searching
- Upload endpoints for submissions
- Rate limiting
GigLez API:
- RESTful JSON API
- JWT tokens + API keys
- Endpoints:
POST /api/submit- Upload capturesGET /api/search- Query databaseGET /api/devices/{id}- Device detailsGET /api/heatmap- Density dataGET /api/stats- Platform statistics
Differences from Wigle
| Feature | Wigle.net | GigLez |
|---|---|---|
| Data Type | WiFi, Bluetooth, Cellular | Sub-GHz IoT RF (300-928 MHz) |
| Submission Format | CSV | .sub/.fff files + GPS |
| Identification | MAC/SSID (exact) | Protocol signature matching (fuzzy) |
| Focus | Network mapping | Device type identification |
| Privacy | Public by default | Opt-in sharing, anonymization |
Technical Specifications
Supported File Formats
1. Flipper Zero .sub Format
Filetype: Flipper SubGhz Key File
Version: 1
Frequency: 433920000
Preset: FuriHalSubGhzPresetOok270Async
Protocol: Princeton
Bit: 24
Key: 00 00 00 00 00 95 D5 D4
TE: 400
Key Fields for Matching:
Frequency: Exact frequency in HzPreset: Modulation type (OOK/FSK)Protocol: Protocol name (if decoded)Bit: Bit lengthKey: Data payload (hex)TE: Timing element (μs)
2. Flipper RAW Format (.sub)
Filetype: Flipper SubGhz RAW File
Version: 1
Frequency: 433920000
Preset: FuriHalSubGhzPresetOok650Async
Protocol: RAW
RAW_Data: 2980 -240 520 -980 520 -980 ...
Parsing Strategy:
- Extract timing patterns
- Identify repeating sequences
- Match against known protocols by timing signatures
- Calculate pulse width statistics
3. .fff Format (Future Feature)
Support for other firmware formats as needed.
Submission API Format
JSON Manifest
{
"submission": {
"timestamp": "2025-01-11T20:30:00Z",
"latitude": 40.7128,
"longitude": -74.0060,
"altitude": 10.5,
"accuracy": 5.0,
"session_id": "optional_session_identifier",
"user_id": "optional_user_identifier",
"device_name": "Flipper Zero",
"notes": "Captured near downtown"
},
"files": [
{
"filename": "capture_001.sub",
"sha256": "abc123...",
"size_bytes": 256
},
{
"filename": "capture_002.sub",
"sha256": "def456...",
"size_bytes": 312
}
]
}
CSV Submission Format (Alternative)
latitude,longitude,timestamp,filename,accuracy,altitude
40.7128,-74.0060,2025-01-11T20:30:00Z,capture_001.sub,5.0,10.5
40.7129,-74.0061,2025-01-11T20:30:15Z,capture_002.sub,5.0,10.5
Device Signature Matching Pipeline
Step 1: Parse .sub File
def parse_sub_file(file_path):
"""Extract metadata from .sub file"""
metadata = {
'frequency': None,
'protocol': None,
'modulation': None,
'bit_length': None,
'key_data': None,
'timing': None,
'raw_data': None
}
with open(file_path) as f:
for line in f:
if ':' in line:
key, value = line.split(':', 1)
# Map to metadata fields
return metadata
Step 2: Match Against Signature Database
def match_signature(metadata):
"""
Match parsed metadata against known signatures
Returns: [(device_id, confidence), ...]
"""
matches = []
# Exact match: protocol + frequency + bit length
exact = query_exact_match(
metadata['protocol'],
metadata['frequency'],
metadata['bit_length']
)
if exact:
matches.append((exact.device_id, 1.0))
# Partial match: protocol + frequency
partial = query_partial_match(
metadata['protocol'],
metadata['frequency']
)
for match in partial:
matches.append((match.device_id, 0.8))
# Pattern match: bit pattern similarity
if metadata['key_data']:
pattern_matches = match_bit_patterns(metadata['key_data'])
matches.extend(pattern_matches)
# Timing match: for RAW files
if metadata['raw_data']:
timing_matches = match_timing_patterns(metadata['raw_data'])
matches.extend(timing_matches)
# Sort by confidence, deduplicate
return sorted(set(matches), key=lambda x: x[1], reverse=True)
Step 3: Store Results
def store_capture(file_path, gps_coords, matches):
"""Store capture with matched device(s)"""
capture = {
'latitude': gps_coords['lat'],
'longitude': gps_coords['lon'],
'timestamp': gps_coords['timestamp'],
'file_hash': sha256(file_path),
'file_path': upload_to_storage(file_path),
**parse_sub_file(file_path)
}
# Store capture
capture_id = db.captures.insert(capture)
# Store top 3 matches
for device_id, confidence in matches[:3]:
db.capture_matches.insert({
'capture_id': capture_id,
'device_id': device_id,
'confidence': confidence,
'method': 'auto'
})
return capture_id
System Architecture
Platform Components
┌─────────────────────────────────────────────────────────┐
│ Web Interface │
│ - Upload Form (drag .sub files + GPS) │
│ - Interactive Map (Leaflet.js) │
│ - Search & Filter UI │
│ - Device Database Browser │
└─────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────┐
│ API Layer (FastAPI) │
│ POST /api/submit - Upload captures │
│ GET /api/search - Query database │
│ GET /api/devices - Device catalog │
│ GET /api/heatmap - Geographic density │
└─────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────┐
│ Processing Pipeline │
│ 1. File Parser (.sub/.fff → metadata) │
│ 2. Signature Matcher (metadata → device IDs) │
│ 3. Deduplicator (file hash + GPS proximity) │
│ 4. Storage Manager (DB + file storage) │
└─────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────┐
│ Database (PostgreSQL + PostGIS) │
│ - captures (GPS + metadata + file refs) │
│ - devices (known device types) │
│ - signatures (Flipper/RTL_433 patterns) │
│ - users (optional accounts) │
│ - identifications (community verifications) │
└─────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────┐
│ Signature Databases (Read-Only) │
│ - Flipper Zero .sub collection (1000+ files) │
│ - RTL_433 protocol definitions (200+ protocols) │
│ - Community-contributed signatures │
└─────────────────────────────────────────────────────────┘
Key Features
Core Platform Features
- File Upload: Drag-and-drop .sub files with GPS coordinates
- Automatic Parsing: Extract frequency, protocol, modulation, data from files
- Device Matching: Identify devices using signature databases
- Deduplication: Prevent duplicate submissions via file hashing
- Geospatial Search: Find captures near location or within bounding box
- Heatmap Generation: Visualize device density by geographic area
- Export Data: Download captures as .sub, JSON, CSV, GeoJSON
Community Features
- Manual Identification: Users can add/correct device IDs
- Photo Uploads: Visual evidence of physical devices
- Voting System: Upvote/downvote identifications
- Verification: High-confidence IDs become verified
- Contribution Tracking: Statistics per user
- Leaderboard: Top uploaders and verifiers
Privacy Features
- Anonymous Uploads: No account required
- GPS Precision Control: Round coordinates to configurable precision
- Private Captures: Opt-out of public database
- BSSID-style Removal: Allow device signature removal requests
Development Phases
Phase 1: Foundation (Weeks 1-2)
- Database schema design
- .sub file parser implementation
- GPS coordinate validation
- Basic file upload endpoint
- Storage backend (local/S3)
Phase 2: Signature Matching (Weeks 3-4)
- Import Flipper Zero .sub database
- Import RTL_433 protocol definitions
- Build matching engine (exact/partial/pattern)
- Confidence scoring algorithm
- Match result storage
Phase 3: Web Interface (Weeks 5-6)
- Upload form with drag-and-drop
- Map visualization (Leaflet.js)
- Search and filter UI
- Device detail pages
- Statistics dashboard
Phase 4: API & Integration (Weeks 7-8)
- RESTful API endpoints
- Authentication (JWT/API keys)
- Rate limiting
- OpenAPI documentation
- Client libraries (Python, JS)
Phase 5: Community Features (Weeks 9-10)
- User accounts (optional)
- Manual device identification
- Photo upload and display
- Voting system
- Verification workflow
Phase 6: Optimization (Weeks 11-12)
- Database indexing and optimization
- Caching layer (Redis)
- CDN for file storage
- Batch processing queue
- Materialized view updates
Success Metrics
Platform Growth
- Number of unique captures submitted
- Geographic coverage (cities/countries)
- Total .sub files processed
- Database size (captures, devices)
Community Engagement
- Active users (uploaders + verifiers)
- Manual identifications submitted
- Verification votes cast
- Photo evidence uploads
Data Quality
- Device identification accuracy (verified/total)
- Average confidence score
- Duplicate detection rate
- Geographic precision distribution
Technical Performance
- Upload processing time (median)
- Search query latency (p95)
- Map render performance
- API response times
Technical Constraints
File Processing
- .sub file size limits (1MB max recommended)
- Batch upload limits (100 files or 50MB per request)
- Supported file formats (.sub initially, .fff future)
- File parsing timeout (5 seconds per file)
Geographic Data
- GPS coordinate precision (6-8 decimal places)
- Coordinate validation (valid lat/lon ranges)
- Altitude optional (meters above sea level)
- Accuracy metadata (horizontal accuracy in meters)
Database Scalability
- PostgreSQL with PostGIS for geospatial
- Partitioning by date for large datasets
- Index strategy for common queries
- Materialized views for statistics
Privacy & Compliance
- GDPR-style data removal
- Optional account system
- GPS anonymization (configurable rounding)
- No PII in .sub file metadata
Current Implementation Status (Iteration 6/6 Complete)
Device Identification Architecture
Final 6-Component Scoring System:
-
Timing Analysis (40% weight) -
src/matcher/timing_analyzer.py- Dual timing validation (SHORT + LONG pulses)
- Weighted average: SHORT (60%) + LONG (40%)
- Multi-method extraction (K-means, histogram, percentile)
- IQR outlier removal (2.5x threshold)
- Noise tolerance: 15% jitter tested successfully
-
Preamble Detection (25% weight) -
src/matcher/preamble_detector.py- 4 detection methods: long_burst, alternating, sync_word, custom
- Sorted pattern matching (longest first)
- Preamble boost: +5% for >90% preamble match + >80% overall score
- Highly discriminative for protocol families
-
Timing Ratio Matching (20% weight) -
src/matcher/pattern_decoder.py- Compare LONG/SHORT pulse ratios
- Highly discriminative (2:1 vs 3:1 separates families)
- Catches relative timing errors
-
Frequency Fingerprinting (10% weight) -
src/matcher/frequency_fingerprint.py- ISM band classification (315/433/868/915 MHz)
- Tighter tolerance: ±100 kHz (strict), gradual falloff to ±500 kHz
- Reduces search space from 299 → ~20-30 candidates
-
Bit Count Matching (5% weight) -
src/matcher/pattern_decoder.py- Relaxed scoring (unreliable in synthetic signals)
- Flexible range validation
- Reduced from 20% weight in iteration 5
-
Uniqueness Bonus (0-20% boost) -
src/matcher/pattern_decoder.py- +20% bonus for unique timing (only 1 similar protocol)
- +15% for 2 similar protocols, +10% for 3, +5% for 4-5
- Discriminates rare vs. common timing signatures
Current Accuracy Metrics (Benchmark Results - Iteration 6)
Test Suite: 12 synthetic signals across 10 protocols
Overall Performance:
- Top-1 Accuracy: 33.3% (4/12 correct)
- Top-3 Accuracy: 50.0% (6/12 in top 3) ⬆️ +17% improvement
- Top-5 Accuracy: 50.0%
- Target: ≥25% ✅ PASSED
Confidence Distribution:
- High (>80%): 66.7% (tighter scoring reduces overconfidence)
- Medium (50-80%): 25.0%
- Low (<50%): 8.3%
Processing Performance:
- Avg Parse Time: 0.26 ms
- Avg Match Time: 132.81 ms
- Total: 133.07 ms per signal (15% faster than iteration 5)
Key Findings (Iteration 6):
- ✅ Noise Tolerance: Successfully handles 15% jitter
- ✅ Preamble Detection: Critical for discrimination (alternating patterns excel)
- ✅ Timing Ratio: LONG/SHORT ratio highly discriminative (2:1 vs 3:1)
- ✅ Family Matching: Acurite 609TXC → Acurite 896 (correct family, rank 2)
- ✅ Test Data Fixed: Corrected Acurite and Oregon timing parameters
- ⚠️ Princeton: Still failing (SimpliSafe mismatch) - needs protocol tuning
- ⚠️ Generic Protocols: Need more database entries (Nexus, Honeywell, Generic Doorbell not in DB)
Next Steps for Further Improvement
- Add Missing Protocols: Nexus Temperature-Humidity, Honeywell Security, Generic Doorbell to database
- Princeton Tuning: Investigate SimpliSafe mismatch - may need protocol signature refinement
- TPMS Family Logic: Toyota vs Schrader - add manufacturer-specific heuristics
- Real-World Testing: Benchmark against actual Flipper Zero captures (not synthetic)
- Protocol Family Scoring: Bonus for partial name matches (Acurite 896 vs Acurite 609TXC)
Last Updated: 2026-02-15 - Iteration 5/5 complete