From c2851a1e74f9d61afdd9b06da3078bc35377b346 Mon Sep 17 00:00:00 2001 From: Alexander Borg Date: Sun, 7 Sep 2025 12:18:29 +0200 Subject: [PATCH] Fix jwt-token --- test_orlan_detection.py | 127 +++++++++++++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 16 deletions(-) diff --git a/test_orlan_detection.py b/test_orlan_detection.py index 5d7319c..5b598cb 100644 --- a/test_orlan_detection.py +++ b/test_orlan_detection.py @@ -7,7 +7,18 @@ a long-distance approach from undetectable range to directly overhead. Test Scenario: - Starts 50km away (beyond detection range) - Slowly approaches target device -- Triggers critical alerts as it enters detection range +- Triggers critical alerts as print(f"šŸ›« {drone_name} Starting Distance: {float(start_distance):.1f}km from device") + print(f"šŸ“ Device Location: {target_lat:.6f}, {target_lon:.6f}") + + # Verify starting position is undetectable + if is_detectable(start_distance): + print("āš ļø WARNING: Starting position is within detection range!") + else: + print("āœ… Starting position confirmed undetectable") + + print("\n" + "=" * 70) + print(f"STARTING {drone_name.upper()} APPROACH SIMULATION") + print("=" * 70)etection range - Ends with drone hovering directly above target """ @@ -90,6 +101,85 @@ def get_auth_headers(): MAX_DETECTION_RANGE_KM = 25.0 # Maximum range for drone detection MIN_RSSI_THRESHOLD = -95 # Minimum RSSI for detection +# Drone types mapping (matches GuessedDroneType enum) +DRONE_TYPES = { + 0: "None", + 1: "Unknown", + 2: "Orlan", + 3: "Zala", + 4: "Eleron", + 5: "ZalaLancet", + 6: "Lancet", + 7: "FPV_CrossFire", + 8: "FPV_ELRS", + 9: "MaybeOrlan", + 10: "MaybeZala", + 11: "MaybeLancet", + 12: "MaybeEleron", + 13: "DJI", + 14: "Supercam", + 15: "MaybeSupercam", + 16: "REB", + 17: "CryptoOrlan", + 18: "DJIe" +} + +def select_drone_type(): + """Allow user to select drone type for simulation""" + print("\n" + "=" * 50) + print("🚁 DRONE TYPE SELECTION") + print("=" * 50) + print("Available drone types:") + + # Group by category for better display + military_types = [(k, v) for k, v in DRONE_TYPES.items() if v in ["Orlan", "Zala", "Eleron", "ZalaLancet", "Lancet", "CryptoOrlan"]] + maybe_types = [(k, v) for k, v in DRONE_TYPES.items() if v.startswith("Maybe")] + fpv_types = [(k, v) for k, v in DRONE_TYPES.items() if v.startswith("FPV_")] + commercial_types = [(k, v) for k, v in DRONE_TYPES.items() if v in ["DJI", "DJIe", "Supercam", "MaybeSupercam"]] + other_types = [(k, v) for k, v in DRONE_TYPES.items() if v in ["None", "Unknown", "REB"]] + + print("\nšŸŽ–ļø MILITARY DRONES:") + for drone_id, name in military_types: + print(f" {drone_id:2d}: {name}") + + print("\nšŸ¢ COMMERCIAL DRONES:") + for drone_id, name in commercial_types: + print(f" {drone_id:2d}: {name}") + + print("\nšŸŽ® FPV DRONES:") + for drone_id, name in fpv_types: + print(f" {drone_id:2d}: {name}") + + print("\nā“ UNCERTAIN TYPES:") + for drone_id, name in maybe_types: + print(f" {drone_id:2d}: {name}") + + print("\nšŸ”§ OTHER:") + for drone_id, name in other_types: + print(f" {drone_id:2d}: {name}") + + print("\n" + "=" * 50) + + while True: + try: + choice = input(f"Select drone type (0-{max(DRONE_TYPES.keys())}) [default: 2-Orlan]: ").strip() + + if choice == "": + return 2 # Default to Orlan + + drone_type = int(choice) + if drone_type in DRONE_TYPES: + print(f"āœ… Selected: {DRONE_TYPES[drone_type]} (Type {drone_type})") + return drone_type + else: + print(f"āŒ Invalid choice. Please select 0-{max(DRONE_TYPES.keys())}") + + except ValueError: + print("āŒ Please enter a valid number") + except KeyboardInterrupt: + print("\nāš ļø Using default: Orlan (Type 2)") + return 2 + def haversine_distance(lat1, lon1, lat2, lon2): """Calculate distance between two points in kilometers""" R = 6371 # Earth's radius in kilometers @@ -144,7 +234,7 @@ def fetch_devices(): print(f"Error fetching devices: {e}") return [] -def send_detection(device, distance_km, step, total_steps): +def send_detection(device, distance_km, step, total_steps, drone_type=2): """Send a detection to the API using EXACT standard payload format""" # Ensure distance_km is a float distance_km = float(distance_km) @@ -157,9 +247,9 @@ def send_detection(device, distance_km, step, total_steps): "geo_lat": float(device["geo_lat"]), # Device location "geo_lon": float(device["geo_lon"]), # Device location "device_timestamp": int(time.time() * 1000), # Current timestamp in milliseconds - "drone_type": 1, # Orlan/Military type + "drone_type": drone_type, # Selected drone type "rssi": int(rssi), # RSSI indicates distance from device - "freq": 24, # Orlan operates on 2.4 GHz (24 = 2400 MHz) + "freq": 24, # Most drones operate on 2.4 GHz (24 = 2400 MHz) "drone_id": 2000 + step # Unique drone ID for tracking } @@ -178,15 +268,15 @@ def send_detection(device, distance_km, step, total_steps): return False def run_orlan_detection_test(): - """Run the comprehensive Orlan detection test""" + """Run the comprehensive drone detection test""" print("=" * 70) - print("🚨 ORLAN MILITARY DRONE DETECTION TEST") + print("ļæ½ DRONE DETECTION SIMULATION TEST") print("=" * 70) print("Test Scenario:") print("• Starting position: 50km away (undetectable)") - print("• Approach pattern: Straight line to target") + print("• Approach pattern: Gradual approach to device") print("• Detection threshold: ~25km range") - print("• Critical alerts: <5km from target") + print("• Critical alerts: <5km from device") print("• End position: Directly overhead (0m)") print("=" * 70) print(f"šŸ”— API Endpoint: {API_BASE_URL}") @@ -194,6 +284,10 @@ def run_orlan_detection_test(): print("āš ļø AUTHENTICATION DISABLED - Running in local test mode") print() + # Select drone type for simulation + selected_drone_type = select_drone_type() + drone_name = DRONE_TYPES[selected_drone_type] + # Authenticate first (unless skipped) if not SKIP_AUTH and not authenticate(): print("āŒ Authentication failed. Cannot proceed with test.") @@ -278,10 +372,10 @@ def run_orlan_detection_test(): # Send detection only if within detectable range if detectable: if not detection_started: - print(f"\nšŸ” FIRST DETECTION at {float(distance_km):.1f}km - Orlan has entered detection range!") + print(f"\nšŸ” FIRST DETECTION at {float(distance_km):.1f}km - {drone_name} has entered detection range!") detection_started = True - success = send_detection(target_device, distance_km, step, total_steps) + success = send_detection(target_device, distance_km, step, total_steps, selected_drone_type) if not success: print(f"āŒ Failed to send detection at step {step}") @@ -292,9 +386,9 @@ def run_orlan_detection_test(): print(f"🚨 CRITICAL ALERT THRESHOLD REACHED at {float(distance_km):.1f}km!") critical_alerts_started = True elif distance_km <= 1: - print(f"šŸ”„ IMMEDIATE THREAT: Orlan within {float(distance_km):.1f}km!") + print(f"šŸ”„ IMMEDIATE THREAT: {drone_name} within {float(distance_km):.1f}km!") elif distance_km <= 0.1: - print(f"šŸ’„ DIRECTLY OVERHEAD: Orlan at {float(distance_km)*1000:.0f}m altitude!") + print(f"šŸ’„ DIRECTLY OVERHEAD: {drone_name} at {float(distance_km)*1000:.0f}m altitude!") else: # Outside detection range print(f"šŸ“” Step {step}/{total_steps}: Distance={float(distance_km):.1f}km (undetectable, RSSI={float(rssi_from_distance(distance_km)):.0f}dBm)") @@ -312,7 +406,7 @@ def run_orlan_detection_test(): time.sleep(delay) print("\n" + "=" * 70) - print("🚨 ORLAN DETECTION TEST COMPLETED") + print(f"ļæ½ {drone_name.upper()} DETECTION TEST COMPLETED") print("=" * 70) print("Test Summary:") print(f"• Starting distance: {float(start_distance):.1f}km (undetectable)") @@ -320,12 +414,13 @@ def run_orlan_detection_test(): print(f"• Critical alerts triggered: <5km") print(f"• Final position: Directly overhead") print(f"• Target device: {target_device['name']}") + print(f"• Drone type tested: {drone_name} (Type {selected_drone_type})") print(f"• Total simulation steps: {total_steps}") print("") print("Expected Results:") print("āœ… No detections sent while >25km away") print("āœ… First detection when entering ~25km range") - print("āœ… Critical alerts triggered for Orlan type (drone_type=1)") + print(f"āœ… Critical alerts triggered for {drone_name} type (drone_type={selected_drone_type})") print("āœ… All alerts escalated regardless of distance/RSSI") print("āœ… Real-time tracking visible on dashboard") print("=" * 70) @@ -334,6 +429,6 @@ if __name__ == "__main__": try: run_orlan_detection_test() except KeyboardInterrupt: - print("\n\nāš ļø Orlan detection test interrupted by user") + print("\n\nāš ļø Drone detection test interrupted by user") except Exception as e: - print(f"\nāŒ Error during Orlan detection test: {e}") + print(f"\nāŒ Error during drone detection test: {e}")