Files
cute-handshake-capture/handshake-capture-c6/WiFi_Scanner.cpp
drjones 50338a6d5c Implement 4-phase capture architecture: observe, target, capture
- Phase 2 (Observation): passive client mapping from data frame headers,
  ClientInfo array per slot (up to 8 clients), 5s observation window
- Phase 3 (Targeting): unicast deauth burst to each discovered client
  instead of broadcast, reason code 7, 5 frames per client
- Phase 4 (Capture): timeout + retry loop cycles back to observation
  to refresh stale client list (2 cycles within 30s channel timeout)
- Fix EAPOL detection: compute LLC/SNAP offset from QoS vs non-QoS
  header length, verify AA-AA-03 SNAP prefix, skip protected frames
- Concurrency: portMUX spinlock for callback/main-loop shared state,
  no dynamic alloc in callback, pre-allocated 4KB PCAP buffer per slot
- Phase-aware LCD status display (mapping → capturing → EAPOL count)

Made-with: Cursor
2026-03-17 22:11:41 -07:00

50 lines
1.1 KiB
C++

#include "WiFi_Scanner.h"
#include <WiFi.h>
#include "LVGL_Driver.h"
#include "HandshakeCapture.h"
void WiFiScanner_Init(void) {
WiFi.mode(WIFI_STA);
WiFi.disconnect(false, true);
WiFi.setSleep(false);
}
void WiFiScanner_Refresh(void) {
Ui_SetWifiStatus("Scanning...");
Ui_ClearNetworkList();
scanNetworksSortedByRSSI();
int count = 0;
for (int i = 0; i < MAX_NETWORKS; i++) {
if (networks[i].ssid.isEmpty()) break;
count++;
}
if (count <= 0) {
Ui_SetWifiStatus("No networks");
WiFi.scanDelete();
return;
}
static char status_text[64];
snprintf(status_text, sizeof(status_text), "%d networks", count);
Ui_SetWifiStatus(status_text);
for (int i = 0; i < count; i++) {
char line[48];
snprintf(line, sizeof(line), "%02d. %s ch%d",
i + 1,
networks[i].ssid.c_str(),
networks[i].ch);
Ui_AddNetwork(line, i);
if (networks[i].handshake_captured) {
Ui_SetNetworkColor(i, lv_palette_main(LV_PALETTE_RED));
} else {
Ui_SetNetworkColor(i, lv_palette_main(LV_PALETTE_GREEN));
}
}
WiFi.scanDelete();
}