From c61f3a2df1dcb477c49413100e009cf7a582b9ac Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Mon, 27 Apr 2026 00:15:01 -0400 Subject: [PATCH 1/3] Hosted AP info shows connection events --- esp32_marauder/WiFiScan.cpp | 100 ++++++++++++++++++++++++++++++++---- esp32_marauder/WiFiScan.h | 6 +++ 2 files changed, 97 insertions(+), 9 deletions(-) diff --git a/esp32_marauder/WiFiScan.cpp b/esp32_marauder/WiFiScan.cpp index 0ece094..0d7935a 100644 --- a/esp32_marauder/WiFiScan.cpp +++ b/esp32_marauder/WiFiScan.cpp @@ -11,6 +11,9 @@ uint8_t *current_act = nullptr; MacEntry WiFiScan::mac_entries[mac_history_len_half]; uint8_t WiFiScan::mac_entry_state[mac_history_len_half]; +WiFiEventId_t WiFiScan::eventId; +String WiFiScan::lastClientMAC = "N/A"; +String WiFiScan::lastClientIP = "N/A"; int num_beacon = 0; int num_deauth = 0; @@ -1882,6 +1885,8 @@ bool WiFiScan::startWiFi(String ssid, String password, bool gui) { this->setMac(); + + eventId = WiFi.onEvent(WiFiScan::onWiFiEvent); if (password != "") WiFi.softAP(ssid.c_str(), password.c_str()); @@ -2371,6 +2376,9 @@ void WiFiScan::StopScan(uint8_t scan_mode) { this->max_rssi = -128; this->send_deauth = false; this->complete_eapol = 0; + this->connected_devices = 0; + + WiFi.removeEvent(eventId); evil_portal_obj.cleanup(); #endif @@ -4905,12 +4913,82 @@ void WiFiScan::tagPOI(const char* label) { #endif } +void WiFiScan::onWiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { + extern WiFiScan wifi_scan_obj; + + switch (event) { + case ARDUINO_EVENT_WIFI_AP_STACONNECTED: { + char macStr[18]; + + snprintf(macStr, + sizeof(macStr), + "%02X:%02X:%02X:%02X:%02X:%02X", + info.wifi_ap_staconnected.mac[0], + info.wifi_ap_staconnected.mac[1], + info.wifi_ap_staconnected.mac[2], + info.wifi_ap_staconnected.mac[3], + info.wifi_ap_staconnected.mac[4], + info.wifi_ap_staconnected.mac[5]); + + lastClientMAC = String(macStr); + break; + } + + case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: { + IPAddress ip(info.wifi_ap_staipassigned.ip.addr); + lastClientIP = ip.toString(); + + Serial.println("Client IP assigned"); + Serial.println("IP: " + lastClientIP); + + display_obj.tft.setTextSize(1); + if (wifi_scan_obj.currentScanMode == WIFI_SCAN_DISPLAY_AP_INFO) { + display_obj.tft.fillRect(0, + ((SCREEN_HEIGHT / 3) * 2), + TFT_WIDTH, + SCREEN_HEIGHT, + TFT_BLACK); + display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); + display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); + display_obj.tft.println(lastClientMAC + "\n" + lastClientIP + "\nconnected"); + } + break; + } + case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: { + char macStr[18]; + + snprintf(macStr, + sizeof(macStr), + "%02X:%02X:%02X:%02X:%02X:%02X", + info.wifi_ap_staconnected.mac[0], + info.wifi_ap_staconnected.mac[1], + info.wifi_ap_staconnected.mac[2], + info.wifi_ap_staconnected.mac[3], + info.wifi_ap_staconnected.mac[4], + info.wifi_ap_staconnected.mac[5]); + + display_obj.tft.fillRect(0, + ((SCREEN_HEIGHT / 3) * 2), + TFT_WIDTH, + SCREEN_HEIGHT, + TFT_BLACK); + display_obj.tft.setTextColor(TFT_RED, TFT_BLACK); + display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); + display_obj.tft.println(String(macStr) + "\nClient disconnected"); + break; + } + + default: + break; + } +} + void WiFiScan::displayAPStats() { #ifdef HAS_SCREEN display_obj.tft.fillRect(0, - (STATUS_BAR_WIDTH * 2) + 1 + EXT_BUTTON_WIDTH, + (STATUS_BAR_WIDTH * 2), TFT_WIDTH, - TFT_HEIGHT - STATUS_BAR_WIDTH + 1, + ((SCREEN_HEIGHT / 3) * 2) - 1 - (STATUS_BAR_WIDTH * 2), TFT_BLACK); #ifndef HAS_MINI_SCREEN @@ -4921,12 +4999,6 @@ void WiFiScan::displayAPStats() { display_obj.tft.setTextSize(1); #endif - display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); - display_obj.tft.println("Access Point"); - - display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK); - display_obj.tft.println(""); - display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK); display_obj.tft.println("SSID:"); display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK); @@ -4941,10 +5013,20 @@ void WiFiScan::displayAPStats() { display_obj.tft.println(""); + uint8_t num_clients = WiFi.softAPgetStationNum(); + + if (num_clients != this->connected_devices) { + // New device connected + if (num_clients > this->connected_devices) { + + } + this->connected_devices = num_clients; + } + display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK); display_obj.tft.print("Clients: "); display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK); - display_obj.tft.println((String)WiFi.softAPgetStationNum()); + display_obj.tft.println((String)num_clients); uint8_t primaryChannel; wifi_second_chan_t secondChannel; diff --git a/esp32_marauder/WiFiScan.h b/esp32_marauder/WiFiScan.h index d88862e..c13a5b5 100644 --- a/esp32_marauder/WiFiScan.h +++ b/esp32_marauder/WiFiScan.h @@ -683,6 +683,7 @@ class WiFiScan bool send_deauth = false; bool channel_hop = false; + uint8_t connected_devices = 0; static MacEntry mac_entries[mac_history_len_half]; @@ -904,6 +905,11 @@ class WiFiScan void startGPX(String file_name); //String macToString(const Station& station); + static WiFiEventId_t eventId; + static String lastClientMAC; + static String lastClientIP; + + static void onWiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); static bool initMbedtls(); static int mbedtls_entropy_source(void *data, unsigned char *output, size_t len); static bool getSAEACT(const uint8_t *frame, size_t frame_len, uint16_t &group_out, size_t &act_len_out); From ec4670d73d7ed2ed567a5fb41eb3ed2d1214e3d4 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Mon, 27 Apr 2026 00:16:00 -0400 Subject: [PATCH 2/3] Rename AP stats --- esp32_marauder/MenuFunctions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp32_marauder/MenuFunctions.cpp b/esp32_marauder/MenuFunctions.cpp index 765eaeb..2d165c0 100644 --- a/esp32_marauder/MenuFunctions.cpp +++ b/esp32_marauder/MenuFunctions.cpp @@ -2435,7 +2435,7 @@ void MenuFunctions::RunSetup() this->changeMenu(&ssidsMenu, true); }); - this->addNodes(&wifiGeneralMenu, "View AP Stats", TFTGREEN, NULL, BEACON_SNIFF, [this]() { + this->addNodes(&wifiGeneralMenu, "Host AP Info", TFTGREEN, NULL, BEACON_SNIFF, [this]() { display_obj.clearScreen(); this->drawStatusBar(); wifi_scan_obj.StartScan(WIFI_SCAN_DISPLAY_AP_INFO, TFT_GREEN); From 47de07867dabe2420689423c6831ebebddea6cd9 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Mon, 27 Apr 2026 00:22:40 -0400 Subject: [PATCH 3/3] Fix non-display hardware --- esp32_marauder/WiFiScan.cpp | 126 ++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/esp32_marauder/WiFiScan.cpp b/esp32_marauder/WiFiScan.cpp index 0d7935a..5e43929 100644 --- a/esp32_marauder/WiFiScan.cpp +++ b/esp32_marauder/WiFiScan.cpp @@ -4914,73 +4914,75 @@ void WiFiScan::tagPOI(const char* label) { } void WiFiScan::onWiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) { - extern WiFiScan wifi_scan_obj; + #ifdef HAS_SCREEN + extern WiFiScan wifi_scan_obj; - switch (event) { - case ARDUINO_EVENT_WIFI_AP_STACONNECTED: { - char macStr[18]; + switch (event) { + case ARDUINO_EVENT_WIFI_AP_STACONNECTED: { + char macStr[18]; - snprintf(macStr, - sizeof(macStr), - "%02X:%02X:%02X:%02X:%02X:%02X", - info.wifi_ap_staconnected.mac[0], - info.wifi_ap_staconnected.mac[1], - info.wifi_ap_staconnected.mac[2], - info.wifi_ap_staconnected.mac[3], - info.wifi_ap_staconnected.mac[4], - info.wifi_ap_staconnected.mac[5]); + snprintf(macStr, + sizeof(macStr), + "%02X:%02X:%02X:%02X:%02X:%02X", + info.wifi_ap_staconnected.mac[0], + info.wifi_ap_staconnected.mac[1], + info.wifi_ap_staconnected.mac[2], + info.wifi_ap_staconnected.mac[3], + info.wifi_ap_staconnected.mac[4], + info.wifi_ap_staconnected.mac[5]); - lastClientMAC = String(macStr); - break; - } - - case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: { - IPAddress ip(info.wifi_ap_staipassigned.ip.addr); - lastClientIP = ip.toString(); - - Serial.println("Client IP assigned"); - Serial.println("IP: " + lastClientIP); - - display_obj.tft.setTextSize(1); - if (wifi_scan_obj.currentScanMode == WIFI_SCAN_DISPLAY_AP_INFO) { - display_obj.tft.fillRect(0, - ((SCREEN_HEIGHT / 3) * 2), - TFT_WIDTH, - SCREEN_HEIGHT, - TFT_BLACK); - display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); - display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); - display_obj.tft.println(lastClientMAC + "\n" + lastClientIP + "\nconnected"); + lastClientMAC = String(macStr); + break; } - break; + + case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: { + IPAddress ip(info.wifi_ap_staipassigned.ip.addr); + lastClientIP = ip.toString(); + + Serial.println("Client IP assigned"); + Serial.println("IP: " + lastClientIP); + + display_obj.tft.setTextSize(1); + if (wifi_scan_obj.currentScanMode == WIFI_SCAN_DISPLAY_AP_INFO) { + display_obj.tft.fillRect(0, + ((SCREEN_HEIGHT / 3) * 2), + TFT_WIDTH, + SCREEN_HEIGHT, + TFT_BLACK); + display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); + display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); + display_obj.tft.println(lastClientMAC + "\n" + lastClientIP + "\nconnected"); + } + break; + } + case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: { + char macStr[18]; + + snprintf(macStr, + sizeof(macStr), + "%02X:%02X:%02X:%02X:%02X:%02X", + info.wifi_ap_staconnected.mac[0], + info.wifi_ap_staconnected.mac[1], + info.wifi_ap_staconnected.mac[2], + info.wifi_ap_staconnected.mac[3], + info.wifi_ap_staconnected.mac[4], + info.wifi_ap_staconnected.mac[5]); + + display_obj.tft.fillRect(0, + ((SCREEN_HEIGHT / 3) * 2), + TFT_WIDTH, + SCREEN_HEIGHT, + TFT_BLACK); + display_obj.tft.setTextColor(TFT_RED, TFT_BLACK); + display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); + display_obj.tft.println(String(macStr) + "\nClient disconnected"); + break; + } + + default: + break; } - case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: { - char macStr[18]; - - snprintf(macStr, - sizeof(macStr), - "%02X:%02X:%02X:%02X:%02X:%02X", - info.wifi_ap_staconnected.mac[0], - info.wifi_ap_staconnected.mac[1], - info.wifi_ap_staconnected.mac[2], - info.wifi_ap_staconnected.mac[3], - info.wifi_ap_staconnected.mac[4], - info.wifi_ap_staconnected.mac[5]); - - display_obj.tft.fillRect(0, - ((SCREEN_HEIGHT / 3) * 2), - TFT_WIDTH, - SCREEN_HEIGHT, - TFT_BLACK); - display_obj.tft.setTextColor(TFT_RED, TFT_BLACK); - display_obj.tft.setCursor(0, ((SCREEN_HEIGHT / 3) * 2)); - display_obj.tft.println(String(macStr) + "\nClient disconnected"); - break; - } - - default: - break; - } + #endif } void WiFiScan::displayAPStats() {