Fix jwt-token
This commit is contained in:
@@ -277,6 +277,169 @@ def send_detection(detection_data):
|
||||
print(f"❌ Network error: {e}")
|
||||
return False
|
||||
|
||||
def simulate_orlan_detection_test():
|
||||
"""
|
||||
Test Orlan military drone detection system
|
||||
Spawns an Orlan 50km from device, slowly approaches until hovering overhead
|
||||
Tests critical alert escalation for high-threat drones
|
||||
"""
|
||||
print("=" * 70)
|
||||
print("🚨 ORLAN MILITARY DRONE DETECTION TEST")
|
||||
print("=" * 70)
|
||||
print("Test Scenario:")
|
||||
print("• Starting position: 50km away (undetectable)")
|
||||
print("• Drone type: Orlan Military (type 1)")
|
||||
print("• Approach pattern: Straight line to target")
|
||||
print("• Detection threshold: ~25km range")
|
||||
print("• Critical alerts: Auto-escalated for Orlan type")
|
||||
print("• End position: Directly overhead (0m)")
|
||||
print("=" * 70)
|
||||
|
||||
if not DEVICES:
|
||||
print("❌ No devices available for testing!")
|
||||
return
|
||||
|
||||
# Use the first device as target
|
||||
target_device = DEVICES[0]
|
||||
print(f"🎯 Target Device: {target_device['name']}")
|
||||
print(f"📍 Target Location: {target_device['lat']:.6f}, {target_device['lon']:.6f}")
|
||||
|
||||
# Calculate starting position 50km away (due north)
|
||||
start_distance = 50.0 # km
|
||||
start_lat = target_device['lat'] + (start_distance / 111.0) # ~111km per degree latitude
|
||||
start_lon = target_device['lon'] # Same longitude
|
||||
|
||||
print(f"🛫 Orlan Starting Position: {start_lat:.6f}, {start_lon:.6f}")
|
||||
print(f"📏 Initial Distance: {start_distance:.1f}km")
|
||||
|
||||
# Detection range parameters
|
||||
max_detection_range = 25.0 # km
|
||||
min_rssi_threshold = -95
|
||||
|
||||
def is_detectable(distance):
|
||||
"""Check if drone is within detectable range"""
|
||||
if distance > max_detection_range:
|
||||
return False
|
||||
# Calculate RSSI for Orlan (military grade)
|
||||
base_rssi = -50 # Stronger than civilian drones
|
||||
rssi = base_rssi - (20 * 2.3 * math.log10(max(distance, 0.001)))
|
||||
return rssi >= min_rssi_threshold
|
||||
|
||||
def calculate_orlan_rssi(distance_km):
|
||||
"""Calculate RSSI for Orlan military drone"""
|
||||
if distance_km < 0.001:
|
||||
return -25
|
||||
base_rssi = -50 # Military grade transmission
|
||||
path_loss_exponent = 2.3
|
||||
rssi = base_rssi - (20 * path_loss_exponent * math.log10(distance_km))
|
||||
return max(int(rssi), -100)
|
||||
|
||||
# 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("STARTING ORLAN APPROACH SIMULATION")
|
||||
print("=" * 70)
|
||||
|
||||
# Simulation parameters
|
||||
total_steps = 50
|
||||
final_distance = 0.0 # Directly overhead
|
||||
drone_id = 3000 # Unique ID for Orlan test
|
||||
|
||||
detection_started = False
|
||||
critical_alerts_started = False
|
||||
|
||||
try:
|
||||
for step in range(1, total_steps + 1):
|
||||
# Calculate current distance (exponential approach)
|
||||
progress = step / total_steps
|
||||
distance_km = start_distance * (1 - progress) ** 1.8 + final_distance * progress ** 1.8
|
||||
|
||||
# Calculate current position
|
||||
current_lat = start_lat + (target_device['lat'] - start_lat) * progress
|
||||
current_lon = start_lon + (target_device['lon'] - start_lon) * progress
|
||||
|
||||
# Check if detectable
|
||||
detectable = is_detectable(distance_km)
|
||||
rssi = calculate_orlan_rssi(distance_km)
|
||||
|
||||
if detectable:
|
||||
if not detection_started:
|
||||
print(f"\n🔍 FIRST DETECTION at {distance_km:.1f}km - Orlan entered detection range!")
|
||||
detection_started = True
|
||||
|
||||
# Send detection using EXACT standard payload format
|
||||
detection_data = {
|
||||
"device_id": target_device["id"],
|
||||
"geo_lat": current_lat,
|
||||
"geo_lon": current_lon,
|
||||
"device_timestamp": int(time.time() * 1000),
|
||||
"drone_type": 1, # Orlan/Military type
|
||||
"rssi": rssi,
|
||||
"freq": 24, # 2.4 GHz
|
||||
"drone_id": drone_id
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.post(f"{API_BASE_URL}/detections", json=detection_data)
|
||||
if response.status_code == 201:
|
||||
status = "🚨 CRITICAL ALERT" if distance_km <= 5 else "⚠️ DETECTED"
|
||||
print(f"{status} - Step {step}/{total_steps}: Distance={distance_km:.1f}km, RSSI={rssi}dBm")
|
||||
|
||||
# Show escalation messages
|
||||
if distance_km <= 5 and not critical_alerts_started:
|
||||
print(f"🚨 CRITICAL ALERT: Orlan within {distance_km:.1f}km - AUTO-ESCALATED!")
|
||||
critical_alerts_started = True
|
||||
elif distance_km <= 1:
|
||||
print(f"🔥 IMMEDIATE THREAT: Orlan within facility perimeter!")
|
||||
elif distance_km <= 0.1:
|
||||
print(f"💥 DIRECTLY OVERHEAD: Orlan at {distance_km*1000:.0f}m altitude!")
|
||||
else:
|
||||
print(f"❌ Failed to send detection: {response.status_code}")
|
||||
except Exception as e:
|
||||
print(f"❌ Error sending detection: {e}")
|
||||
else:
|
||||
# Outside detection range
|
||||
print(f"📡 Step {step}/{total_steps}: Distance={distance_km:.1f}km (undetectable, RSSI={rssi}dBm)")
|
||||
|
||||
# Variable delay based on distance
|
||||
if distance_km > 30:
|
||||
delay = 2.0
|
||||
elif distance_km > 15:
|
||||
delay = 1.5
|
||||
elif distance_km > 5:
|
||||
delay = 1.0
|
||||
else:
|
||||
delay = 0.8
|
||||
|
||||
time.sleep(delay)
|
||||
|
||||
print("\n" + "=" * 70)
|
||||
print("🚨 ORLAN DETECTION TEST COMPLETED")
|
||||
print("=" * 70)
|
||||
print("Test Summary:")
|
||||
print(f"• Starting distance: {start_distance:.1f}km (undetectable)")
|
||||
print(f"• Detection range: ~{max_detection_range:.1f}km")
|
||||
print(f"• Final position: Directly overhead")
|
||||
print(f"• Target device: {target_device['name']}")
|
||||
print(f"• Total steps: {total_steps}")
|
||||
print("")
|
||||
print("Expected Results:")
|
||||
print("✅ No detections sent while >25km away")
|
||||
print("✅ First detection when entering detection range")
|
||||
print("✅ Critical alerts auto-escalated for Orlan (type 1)")
|
||||
print("✅ All Orlan alerts bypass distance/RSSI rules")
|
||||
print("✅ Real-time tracking visible on dashboard")
|
||||
print("=" * 70)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("\n\n⚠️ Orlan detection test interrupted by user")
|
||||
except Exception as e:
|
||||
print(f"\n❌ Error during Orlan detection test: {e}")
|
||||
|
||||
def simulate_realistic_scenario(duration_minutes=10):
|
||||
"""Simulate realistic drone scenario with persistent tracking"""
|
||||
print(f"🚁 Starting realistic drone simulation for {duration_minutes} minutes...")
|
||||
@@ -405,9 +568,10 @@ def main():
|
||||
print("1. Realistic scenario (persistent drones, RSSI changes, movement)")
|
||||
print("2. Single approaching drone (watch RSSI strengthen)")
|
||||
print("3. Departing drone (watch RSSI weaken)")
|
||||
print("4. 🚨 Orlan military drone detection test (50km approach)")
|
||||
|
||||
try:
|
||||
choice = input("\nEnter choice (1-3): ").strip()
|
||||
choice = input("\nEnter choice (1-4): ").strip()
|
||||
|
||||
if choice == "1":
|
||||
duration = input("Duration in minutes (default: 10): ").strip()
|
||||
@@ -422,6 +586,9 @@ def main():
|
||||
print("🛫 Simulating departing drone (RSSI will weaken)...")
|
||||
# Implementation for departing drone
|
||||
|
||||
elif choice == "4":
|
||||
simulate_orlan_detection_test()
|
||||
|
||||
else:
|
||||
print("Invalid choice")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user