mirror of
https://github.com/smittix/intercept.git
synced 2026-07-15 13:08:10 -07:00
feat(drone): merge Drone Intelligence module
Multi-vector UAV detection mode: Remote ID (WiFi/BLE ASTM F3411), RTL-SDR 433/868MHz control-link detection, HackRF 2.4/5.8GHz wideband. Workers feed a shared observation queue; DroneCorrelator merges into DroneContact objects with TTL store, risk scoring, and SSE streaming. Frontend: two-panel sidebar + Leaflet map with contact cards and trails. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+11
-2
@@ -102,7 +102,8 @@
|
||||
radiosonde: "{{ url_for('static', filename='css/modes/radiosonde.css') }}",
|
||||
meteor: "{{ url_for('static', filename='css/modes/meteor.css') }}",
|
||||
system: "{{ url_for('static', filename='css/modes/system.css') }}",
|
||||
ook: "{{ url_for('static', filename='css/modes/ook.css') }}"
|
||||
ook: "{{ url_for('static', filename='css/modes/ook.css') }}",
|
||||
drone: "{{ url_for('static', filename='css/modes/drone.css') }}"
|
||||
};
|
||||
window.INTERCEPT_MODE_STYLE_LOADED = {};
|
||||
window.INTERCEPT_MODE_STYLE_PROMISES = {};
|
||||
@@ -186,7 +187,8 @@
|
||||
spaceweather: "{{ url_for('static', filename='js/modes/space-weather.js') }}",
|
||||
system: "{{ url_for('static', filename='js/modes/system.js') }}",
|
||||
meteor: "{{ url_for('static', filename='js/modes/meteor.js') }}",
|
||||
waterfall: "{{ url_for('static', filename='js/modes/waterfall.js') }}?v={{ version }}&r=wfdeck21"
|
||||
waterfall: "{{ url_for('static', filename='js/modes/waterfall.js') }}?v={{ version }}&r=wfdeck21",
|
||||
drone: "{{ url_for('static', filename='js/modes/drone.js') }}"
|
||||
};
|
||||
window.INTERCEPT_MODE_SCRIPT_LOADED = {};
|
||||
window.INTERCEPT_MODE_SCRIPT_PROMISES = {};
|
||||
@@ -764,6 +766,8 @@
|
||||
|
||||
{% include 'partials/modes/ais.html' %}
|
||||
|
||||
{% include 'partials/modes/drone.html' %}
|
||||
|
||||
{% include 'partials/modes/radiosonde.html' %}
|
||||
|
||||
{% include 'partials/modes/spy-stations.html' %}
|
||||
@@ -3767,6 +3771,7 @@
|
||||
wifi_locate: { label: 'WiFi Locate', indicator: 'WF LOCATE', outputTitle: 'WiFi Locate', group: 'wireless' },
|
||||
meshtastic: { label: 'Meshtastic', indicator: 'MESHTASTIC', outputTitle: 'Meshtastic Mesh Monitor', group: 'wireless' },
|
||||
tscm: { label: 'TSCM', indicator: 'TSCM', outputTitle: 'TSCM Counter-Surveillance', group: 'intel' },
|
||||
drone: { label: 'Drone Intel', indicator: 'DRONE', outputTitle: 'Drone Intelligence', group: 'intel' },
|
||||
spystations: { label: 'Spy Stations', indicator: 'SPY STATIONS', outputTitle: 'Spy Stations', group: 'intel' },
|
||||
websdr: { label: 'WebSDR', indicator: 'WEBSDR', outputTitle: 'HF/Shortwave WebSDR', group: 'intel' },
|
||||
waterfall: { label: 'Waterfall', indicator: 'WATERFALL', outputTitle: 'Spectrum Waterfall', group: 'signals' },
|
||||
@@ -4403,6 +4408,7 @@
|
||||
tscm: () => { if (tscmEventSource) { tscmEventSource.close(); tscmEventSource = null; } },
|
||||
meteor: () => typeof MeteorScatter !== 'undefined' && MeteorScatter.destroy?.(),
|
||||
ook: () => typeof OokMode !== 'undefined' && OokMode.destroy?.(),
|
||||
drone: () => typeof DroneMode !== 'undefined' && DroneMode.destroy?.(),
|
||||
};
|
||||
return moduleDestroyMap[mode] || null;
|
||||
}
|
||||
@@ -4713,6 +4719,7 @@
|
||||
document.getElementById('aprsMode')?.classList.toggle('active', mode === 'aprs');
|
||||
document.getElementById('tscmMode')?.classList.toggle('active', mode === 'tscm');
|
||||
document.getElementById('aisMode')?.classList.toggle('active', mode === 'ais');
|
||||
document.getElementById('droneMode')?.classList.toggle('active', mode === 'drone');
|
||||
document.getElementById('radiosondeMode')?.classList.toggle('active', mode === 'radiosonde');
|
||||
document.getElementById('spystationsMode')?.classList.toggle('active', mode === 'spystations');
|
||||
document.getElementById('meshtasticMode')?.classList.toggle('active', mode === 'meshtastic');
|
||||
@@ -5011,6 +5018,8 @@
|
||||
SystemHealth.init();
|
||||
} else if (mode === 'ook') {
|
||||
OokMode.init();
|
||||
} else if (mode === 'drone') {
|
||||
if (typeof DroneMode !== 'undefined') DroneMode.init();
|
||||
}
|
||||
if (requestId !== modeSwitchRequestId) return;
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<!-- DRONE INTELLIGENCE MODE -->
|
||||
<div id="droneMode" class="mode-content" style="display: none;">
|
||||
<div class="section">
|
||||
<h3>Drone Intelligence</h3>
|
||||
<p class="info-text" style="margin-bottom: 12px;">
|
||||
Multi-vector UAV detection: Remote ID (WiFi/BLE), 433/868 MHz control links, 2.4/5.8 GHz wideband.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>Detection Vectors</h3>
|
||||
<div id="droneVectorStatus" class="drone-vector-pills">
|
||||
<span class="drone-vector-pill" id="dronePillRemoteId">Remote ID</span>
|
||||
<span class="drone-vector-pill" id="dronePill433">433 MHz</span>
|
||||
<span class="drone-vector-pill" id="dronePillHackrf">2.4 / 5.8 GHz</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>WiFi Interface <span style="font-weight:400; font-size:11px; color:var(--text-dim)">(monitor mode)</span></h3>
|
||||
<input type="text" id="droneWifiIface" placeholder="e.g. wlan0mon" style="width:100%;">
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<div style="display:flex; gap:8px;">
|
||||
<button id="droneStartBtn" class="run-btn" style="flex:1;">Start</button>
|
||||
<button id="droneStopBtn" class="stop-btn" style="flex:1;" disabled>Stop</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>Status</h3>
|
||||
<p class="info-text">
|
||||
Status: <span id="droneStatusText" style="color:var(--accent-yellow);">Standby</span>
|
||||
</p>
|
||||
<p class="info-text">
|
||||
Contacts: <span id="droneContactCount">0</span>
|
||||
|
|
||||
Non-compliant: <span id="droneNonCompliantCount" style="color:var(--accent-red);">0</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="section">
|
||||
<h3>Detected Contacts</h3>
|
||||
<div id="droneContactList"></div>
|
||||
</div>
|
||||
|
||||
<div id="droneMap" class="drone-map"></div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user