#!/usr/bin/env python3 """ Drone Detection Test Script Sends simulated drone detection data to the API for testing purposes. """ import requests import json import time import random from datetime import datetime # Configuration API_BASE_URL = "http://selfservice.cqers.com/drones/api" # Alternative for local testing: "http://localhost:3002/api" # Device configurations (simulating different detector devices) DEVICES = [ { "id": 1, "name": "Stockholm Central Detector", "lat": 59.3293, "lon": 18.0686 }, { "id": 2, "name": "Arlanda Airport Detector", "lat": 59.6519, "lon": 17.9186 }, { "id": 3, "name": "GΓΆteborg Harbor Detector", "lat": 57.7089, "lon": 11.9746 } ] # Drone types DRONE_TYPES = { 0: "Unknown", 1: "Commercial DJI", 2: "Racing Drone", 3: "Fixed Wing", 4: "Military/Surveillance", 5: "Custom Build" } def generate_detection_data(device): """Generate realistic drone detection data""" # Random position near the device (within ~5km radius) lat_offset = random.uniform(-0.045, 0.045) # ~5km latitude lon_offset = random.uniform(-0.09, 0.09) # ~5km longitude detection = { "device_id": device["id"], "drone_id": random.randint(1000, 9999), "drone_type": random.randint(0, 5), "rssi": random.randint(-90, -30), # Signal strength in dBm "freq": random.choice([2400, 2450, 5800, 5850]), # Common drone frequencies "geo_lat": device["lat"] + lat_offset, "geo_lon": device["lon"] + lon_offset, "device_timestamp": int(time.time() * 1000), # Unix timestamp in ms "confidence_level": round(random.uniform(0.6, 1.0), 2), "signal_duration": random.randint(500, 5000) # Duration in ms } return detection def send_detection(detection_data): """Send detection data to the API""" url = f"{API_BASE_URL}/detections" headers = { "Content-Type": "application/json" } try: response = requests.post(url, json=detection_data, headers=headers, timeout=10) if response.status_code == 201: print(f"βœ… Detection sent successfully: Device {detection_data['device_id']}, " f"Drone {detection_data['drone_id']}, RSSI {detection_data['rssi']}dBm") return True else: print(f"❌ Failed to send detection: {response.status_code} - {response.text}") return False except requests.exceptions.RequestException as e: print(f"❌ Network error: {e}") return False def test_single_detection(): """Send a single test detection""" device = random.choice(DEVICES) detection = generate_detection_data(device) print("🚁 Sending single test detection...") print(f"πŸ“ Device: {device['name']}") print(f"πŸ›°οΈ Drone ID: {detection['drone_id']}") print(f"πŸ“‘ RSSI: {detection['rssi']}dBm") print(f"πŸ“Š Frequency: {detection['freq']}MHz") print(f"🎯 Confidence: {detection['confidence_level']}") return send_detection(detection) def simulate_continuous_detections(duration_minutes=5, interval_seconds=10): """Simulate continuous drone detections for testing""" print(f"πŸ”„ Starting continuous simulation for {duration_minutes} minutes...") print(f"⏱️ Sending detection every {interval_seconds} seconds") print("Press Ctrl+C to stop\n") start_time = time.time() end_time = start_time + (duration_minutes * 60) detection_count = 0 try: while time.time() < end_time: # Generate 1-3 simultaneous detections from different devices num_detections = random.randint(1, 3) for _ in range(num_detections): device = random.choice(DEVICES) detection = generate_detection_data(device) if send_detection(detection): detection_count += 1 # Small delay between simultaneous detections time.sleep(0.5) time.sleep(interval_seconds) except KeyboardInterrupt: print("\n⏹️ Simulation stopped by user") elapsed = time.time() - start_time print(f"\nπŸ“ˆ Simulation completed:") print(f" β€’ Duration: {elapsed/60:.1f} minutes") print(f" β€’ Detections sent: {detection_count}") print(f" β€’ Average rate: {detection_count/(elapsed/60):.1f} detections/minute") def test_api_health(): """Test if the API is responding""" url = f"{API_BASE_URL}/health" try: response = requests.get(url, timeout=5) if response.status_code == 200: print("βœ… API health check passed") return True else: print(f"❌ API health check failed: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"❌ Cannot reach API: {e}") return False def main(): print("🚁 Drone Detection System - Test Script") print("=" * 50) # Test API connectivity if not test_api_health(): print("Cannot connect to API. Please check if the system is running.") return print("\nChoose test mode:") print("1. Send single test detection") print("2. Simulate continuous detections") print("3. Send burst of 10 detections") try: choice = input("\nEnter choice (1-3): ").strip() if choice == "1": test_single_detection() elif choice == "2": duration = input("Duration in minutes (default: 5): ").strip() interval = input("Interval in seconds (default: 10): ").strip() duration = int(duration) if duration else 5 interval = int(interval) if interval else 10 simulate_continuous_detections(duration, interval) elif choice == "3": print("πŸš€ Sending burst of 10 detections...") success_count = 0 for i in range(10): device = random.choice(DEVICES) detection = generate_detection_data(device) if send_detection(detection): success_count += 1 time.sleep(1) # 1 second between detections print(f"\nπŸ“Š Burst completed: {success_count}/10 detections sent successfully") else: print("Invalid choice") except KeyboardInterrupt: print("\nπŸ‘‹ Goodbye!") except ValueError: print("Invalid input") if __name__ == "__main__": main()