Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 77 additions & 4 deletions src/modules/gps/wardriving.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ void Wardriving::setup() {
#ifdef USE_BOOST /// ENABLE 5V OUTPUT
PPM.enableOTG();
#endif

// Configuration menu
show_config_menu();

display_banner();
padprintln("Initializing...");

Expand All @@ -40,6 +44,47 @@ void Wardriving::setup() {
return loop();
}

void Wardriving::show_config_menu() {
bool configDone = false;

while (!configDone) {
std::vector<Option> options;

String triangulationLabel = enableTriangulation ? "Triangulation: ON" : "Triangulation: OFF";
String distanceLabel = "Distance: " + String((int)triangulationMinDistance) + "m";

options.push_back({triangulationLabel, [this]() { enableTriangulation = !enableTriangulation; }});
options.push_back({distanceLabel, [this]() {
if (triangulationMinDistance == 10.0) triangulationMinDistance = 25.0;
else if (triangulationMinDistance == 25.0) triangulationMinDistance = 50.0;
else if (triangulationMinDistance == 50.0) triangulationMinDistance = 100.0;
else triangulationMinDistance = 10.0;
}});
options.push_back({"Start Wardriving", [&configDone]() { configDone = true; }});

drawMainBorderWithTitle("Wardriving Config");
padprintln("");
padprintln("Triangulation Mode:");
padprintln("Records same AP from");
padprintln("multiple locations");
padprintln("");
padprintln("Distance: minimum");
padprintln("movement to re-record");
padprintln("");

delay(100);
int selected = loopOptions(options, MENU_TYPE_REGULAR, "");

if (selected == -1 || check(EscPress)) {
returnToMenu = true;
return;
}

// Execute the selected option
if (selected >= 0 && selected < options.size()) { options[selected].operation(); }
}
}

void Wardriving::begin_wifi() {
WiFi.mode(WIFI_STA);
WiFi.disconnect();
Expand Down Expand Up @@ -132,8 +177,17 @@ void Wardriving::display_banner() {

if (wifiNetworkCount > 0) {
padprintln("File: " + filename.substring(0, filename.length() - 4), 2);
padprintln("Unique Networks Found: " + String(wifiNetworkCount), 2);
if (enableTriangulation) {
padprintln("Networks Recorded: " + String(wifiNetworkCount), 2);
} else {
padprintln("Unique Networks Found: " + String(wifiNetworkCount), 2);
}
padprintf(2, "Distance: %.2fkm\n", distance / 1000);
if (enableTriangulation) {
padprintf(2, "Mode: Multi-pos (%.0fm)\n", triangulationMinDistance);
} else {
padprintln("Mode: Single-pos", 2);
}
}

padprintln("");
Expand Down Expand Up @@ -233,9 +287,28 @@ void Wardriving::append_to_file(int network_amount) {
for (int i = 0; i < network_amount; i++) {
String macAddress = WiFi.BSSIDstr(i);

// Check if MAC was already found in this session
if (registeredMACs.find(macAddress) == registeredMACs.end()) {
registeredMACs.insert(macAddress); // Adds MAC to file
bool shouldRecord = false;
if (enableTriangulation) {
// Check if MAC was already found and if we've moved far enough
auto it = registeredMACs.find(macAddress);
if (it == registeredMACs.end()) {
// First time seeing this MAC
shouldRecord = true;
} else {
// Calculate distance from last recorded position for this MAC
double distanceFromLast = gps.distanceBetween(
it->second.lat, it->second.lng, gps.location.lat(), gps.location.lng()
);
if (distanceFromLast >= triangulationMinDistance) { shouldRecord = true; }
}
} else {
// Original behavior: only record each MAC once per session
shouldRecord = (registeredMACs.find(macAddress) == registeredMACs.end());
}

if (shouldRecord) {
// Update last recorded location for this MAC
registeredMACs[macAddress] = {gps.location.lat(), gps.location.lng()};
int32_t channel = WiFi.channel(i);

char buffer[512];
Expand Down
16 changes: 13 additions & 3 deletions src/modules/gps/wardriving.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,14 @@
#include <TinyGPS++.h>
#include <esp_wifi_types.h>
#include <globals.h>
#include <map>
#include <set>

struct MACLocationData {
double lat;
double lng;
};

class Wardriving {
public:
/////////////////////////////////////////////////////////////////////////////////////
Expand All @@ -36,14 +42,18 @@ class Wardriving {
double distance = 0;
String filename = "";
TinyGPSPlus gps;
HardwareSerial GPSserial = HardwareSerial(2); // Uses UART2 for GPS
std::set<String> registeredMACs; // Store and track registered MAC
int wifiNetworkCount = 0; // Counter fo wifi networks

HardwareSerial GPSserial = HardwareSerial(2); // Uses UART2 for GPS
std::map<String, MACLocationData> registeredMACs; // Store MAC with last recorded location
int wifiNetworkCount = 0; // Counter for wifi networks
bool rxPinReleased = false;
bool enableTriangulation = true; // Enable multiple records per MAC for triangulation
double triangulationMinDistance = 10.0; // Minimum distance (meters) to record same MAC again

/////////////////////////////////////////////////////////////////////////////////////
// Setup
/////////////////////////////////////////////////////////////////////////////////////
void show_config_menu(void);
void begin_wifi(void);
bool begin_gps(void);
void end(void);
Expand Down
Loading