MeshCore Wardrive Android App - Source Code

March 3, 2026 ยท View on GitHub

A Flutter-based Android application for mapping MeshCore mesh network coverage in real-time.

๐Ÿ“ฅ Download Pre-built APK

Latest Release: Download from Releases Repository

๐Ÿš€ Features

  • Real-time GPS tracking with foreground service
  • USB and Bluetooth connectivity for MeshCore companion radios
  • Auto-ping functionality with configurable intervals (50m, 200m, 0.5 miles, 1 mile)
  • Manual ping testing
  • Success rate based coverage visualization with color coding
  • Clickable coverage squares showing detailed statistics
  • Repeater discovery and tracking
  • Per-repeater coverage filtering
  • Coverage gap finder for identifying dead zones
  • Data export to JSON, CSV, GPX, and KML
  • Share coverage map screenshots with stats
  • Web map upload functionality (multi-site)
  • Route trail with color-coded path
  • Session history with notes and replay
  • Offline map tile caching
  • Heatmap overlay visualization
  • Signal trend charts (RSSI, SNR, response time)
  • Live speed display
  • Repeater response time tracking
  • Color blind accessibility modes
  • Debug terminal with logging
  • Light/Dark theme support

๐Ÿ› ๏ธ Development Setup

Prerequisites

  • Flutter SDK (3.10.0 or higher)
  • Android Studio or VS Code with Flutter extensions
  • Android SDK with API level 21+
  • A MeshCore companion radio device (for testing)

Installation

  1. Clone this repository:
git clone https://github.com/mintylinux/Meshcore-Wardrive-Android-Source.git
cd meshcore_wardrive
  1. Install dependencies:
flutter pub get
  1. Generate app icons:
flutter pub run flutter_launcher_icons
  1. Run on connected device:
flutter run

Building Release APK

flutter build apk --release

The APK will be located at: build/app/outputs/flutter-apk/app-release.apk

๐Ÿ“ Project Structure

lib/
โ”œโ”€โ”€ main.dart                    # App entry point
โ”œโ”€โ”€ constants/
โ”‚   โ””โ”€โ”€ app_version.dart         # Version constant
โ”œโ”€โ”€ models/
โ”‚   โ””โ”€โ”€ models.dart              # Data models (Sample, Coverage, Repeater, WSession)
โ”œโ”€โ”€ screens/
โ”‚   โ”œโ”€โ”€ map_screen.dart              # Main map interface
โ”‚   โ”œโ”€โ”€ debug_log_screen.dart        # Debug terminal
โ”‚   โ”œโ”€โ”€ debug_diagnostics_screen.dart # Advanced diagnostics
โ”‚   โ”œโ”€โ”€ session_history_screen.dart   # Session history viewer
โ”‚   โ””โ”€โ”€ signal_trend_screen.dart      # Signal trend charts
โ”œโ”€โ”€ services/
โ”‚   โ”œโ”€โ”€ location_service.dart         # GPS tracking & auto-ping
โ”‚   โ”œโ”€โ”€ lora_companion_service.dart   # LoRa device communication
โ”‚   โ”œโ”€โ”€ database_service.dart         # SQLite database
โ”‚   โ”œโ”€โ”€ aggregation_service.dart      # Coverage calculation
โ”‚   โ”œโ”€โ”€ upload_service.dart           # Web map upload
โ”‚   โ”œโ”€โ”€ settings_service.dart         # User preferences
โ”‚   โ”œโ”€โ”€ meshcore_protocol.dart        # Protocol implementation
โ”‚   โ”œโ”€โ”€ debug_log_service.dart        # Debug logging
โ”‚   โ””โ”€โ”€ persistent_debug_logger.dart  # Persistent log storage
โ””โ”€โ”€ utils/
    โ”œโ”€โ”€ geohash_utils.dart        # Geohash utilities
    โ””โ”€โ”€ color_blind_palette.dart  # Accessible color schemes

๐Ÿ”ง Configuration

Ping Intervals

Default ping interval can be changed in lib/services/location_service.dart:

double _pingIntervalMeters = 805.0; // 0.5 miles

Coverage Grid Precision

Grid size is set in lib/utils/geohash_utils.dart:

static String coverageKey(double lat, double lon) {
  return geohash.GeoHash.encode(lat, lon, precision: 6); // ~1.2km x 610m
}

Ping Timeout

Timeout for ping responses in lib/services/location_service.dart:

timeoutSeconds: 20,  // 20 second timeout

๐Ÿ“š Documentation

๐Ÿงช Testing

Run tests with:

flutter test

๐Ÿ“ฆ Dependencies

Key packages:

  • flutter_map - Map display
  • flutter_map_cache - Offline tile caching
  • flutter_map_heatmap - Heatmap overlay
  • fl_chart - Signal trend charts
  • geolocator - GPS tracking
  • flutter_foreground_task - Background service
  • usb_serial - USB connectivity
  • flutter_blue_plus - Bluetooth connectivity
  • sqflite - Local database
  • geohash_plus - Geohash encoding
  • pointycastle - Encryption
  • share_plus - Share screenshots & exports
  • screenshot / saver_gallery - Screenshot capture

See pubspec.yaml for complete list.

๐Ÿ› Known Issues

  • Some Android devices may require "Location Always" permission for background tracking
  • USB connectivity requires OTG cable and data-capable cable
  • #meshwar channel must be joined in MeshCore app before first use

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes with co-author line:
    git commit -m "Add amazing feature
    
    Co-Authored-By: Your Name <your.email@example.com>"
    
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ™ Credits

Built for the MeshCore mesh networking community.

๐Ÿ“ง Support

For issues and questions:

  • Open an issue on GitHub
  • Check existing documentation in the repository

Current Version: 1.0.30

Minimum Android Version: Android 5.0 (API 21)