Merge pull request #995 from justcallmekoko/NimBLE-2.0

Add Bluetooth to C5 hardware
This commit is contained in:
Just Call Me Koko
2025-12-01 01:37:32 -05:00
committed by GitHub
15 changed files with 3008 additions and 2448 deletions

View File

@@ -308,11 +308,11 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
if(old_scan_mode == WIFI_SCAN_GPS_NMEA)
Serial.println("END OF NMEA STREAM");
Serial.println(F("END OF NMEA STREAM"));
else if(old_scan_mode == WIFI_SCAN_GPS_DATA)
Serial.println("Stopping GPS data updates");
Serial.println(F("Stopping GPS data updates"));
else
Serial.println("Stopping WiFi tran/recv");
Serial.println(F("Stopping WiFi tran/recv"));
// If we don't do this, the text and button coordinates will be off
#ifdef HAS_SCREEN
@@ -375,7 +375,7 @@ void CommandLine::runCommand(String input) {
Serial.println(gps_obj.getNmeaNotparsed());
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if(nmea_arg != -1){
String nmea_type = cmd_args.get(nmea_arg + 1);
@@ -391,7 +391,7 @@ void CommandLine::runCommand(String input) {
Serial.println("GPS Output Type Set To: " + nmea_type);
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if (track_arg != -1) {
wifi_scan_obj.currentScanMode = GPS_TRACKER;
@@ -401,9 +401,9 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(GPS_TRACKER, TFT_CYAN);
}
else if(cmd_args.size()>1)
Serial.println("You did not provide a valid flag");
Serial.println(F("You did not provide a valid flag"));
else
Serial.println("You did not provide an argument");
Serial.println(F("You did not provide an argument"));
}
#endif
}
@@ -413,7 +413,7 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
#endif
Serial.println("NMEA STREAM FOLLOWS");
Serial.println(F("NMEA STREAM FOLLOWS"));
wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_NMEA;
wifi_scan_obj.StartScan(WIFI_SCAN_GPS_NMEA, TFT_CYAN);
}
@@ -444,7 +444,7 @@ void CommandLine::runCommand(String input) {
}
}
#else
Serial.println("This hardware does not support neopixel");
Serial.println(F("This hardware does not support neopixel"));
#endif
}
// ls command
@@ -453,9 +453,9 @@ void CommandLine::runCommand(String input) {
if (cmd_args.size() > 1)
sd_obj.listDir(cmd_args.get(1));
else
Serial.println("You did not provide a dir to list");
Serial.println(F("You did not provide a dir to list"));
#else
Serial.println("SD support disabled, cannot use command");
Serial.println(F("SD support disabled, cannot use command"));
return;
#endif
}
@@ -524,7 +524,7 @@ void CommandLine::runCommand(String input) {
else if (da_sw != -1)
result = settings_obj.saveSetting<bool>(setting_name, false);
else {
Serial.println("You did not properly enable/disable this setting.");
Serial.println(F("You did not properly enable/disable this setting."));
return;
}
@@ -536,7 +536,7 @@ void CommandLine::runCommand(String input) {
}
else if (cmd_args.get(0) == REBOOT_CMD) {
Serial.println("Rebooting...");
Serial.println(F("Rebooting..."));
ESP.restart();
}
@@ -569,8 +569,25 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int sta_sw = this->argSearch(&cmd_args, "-s");
int flk_sw = this->argSearch(&cmd_args, "-f");
if (sta_sw == -1) {
if (flk_sw == -1) {
Serial.println("Starting Flock Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLOCK_WARDRIVE, TFT_GREEN);
}
else if (sta_sw != -1) {
Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_STATION_WAR_DRIVE, TFT_GREEN);
}
else {
Serial.println("Starting Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
@@ -578,18 +595,11 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_WAR_DRIVE, TFT_GREEN);
}
else {Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_STATION_WAR_DRIVE, TFT_GREEN);
}
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
}
// Karma
@@ -597,14 +607,14 @@ void CommandLine::runCommand(String input) {
int pr_sw = this->argSearch(&cmd_args, "-p");
if (pr_sw == -1) {
Serial.println("You did not provide a target index");
Serial.println(F("You did not provide a target index"));
return;
}
int pr_index = cmd_args.get(pr_sw + 1).toInt();
if ((pr_index < 0) || (pr_index > probe_req_ssids->size() - 1)) {
Serial.println("The provided index was not in range");
Serial.println(F("The provided index was not in range"));
return;
}
@@ -618,7 +628,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.setMac();
}
else {
Serial.println("Unable to set AP ESSID");
Serial.println(F("Unable to set AP ESSID"));
return;
}
@@ -839,14 +849,14 @@ void CommandLine::runCommand(String input) {
int ap_sw = this->argSearch(&cmd_args, "-a"); // APs
if (ap_sw == -1) {
Serial.println("You did not provide a target index");
Serial.println(F("You did not provide a target index"));
return;
}
int ap_index = cmd_args.get(ap_sw + 1).toInt();
if ((ap_index < 0) || (ap_index > access_points->size() - 1)) {
Serial.println("The provided index was not in range");
Serial.println(F("The provided index was not in range"));
return;
}
@@ -865,14 +875,14 @@ void CommandLine::runCommand(String input) {
int cl_sw = this->argSearch(&cmd_args, "-s"); // Stations
if (cl_sw == -1) {
Serial.println("You did not provide a target index");
Serial.println(F("You did not provide a target index"));
return;
}
int sta_index = cmd_args.get(cl_sw + 1).toInt();
if ((sta_index < 0) || (sta_index > stations->size() - 1)) {
Serial.println("The provided index was not in range");
Serial.println(F("The provided index was not in range"));
return;
}
@@ -900,7 +910,7 @@ void CommandLine::runCommand(String input) {
int targ_sw = this->argSearch(&cmd_args, "-c");
if (attack_type_switch == -1) {
Serial.println("You must specify an attack type");
Serial.println(F("You must specify an attack type"));
return;
}
else {
@@ -911,7 +921,7 @@ void CommandLine::runCommand(String input) {
if (attack_type == ATTACK_TYPE_DEAUTH) {
// Default to broadcast
if ((dst_addr_sw == -1) && (targ_sw == -1)) {
Serial.println("Sending to broadcast...");
Serial.println(F("Sending to broadcast..."));
wifi_scan_obj.dst_mac = "ff:ff:ff:ff:ff:ff";
}
// Dest addr specified
@@ -921,7 +931,7 @@ void CommandLine::runCommand(String input) {
}
// Station list specified
else if (targ_sw != -1)
Serial.println("Sending to Station list");
Serial.println(F("Sending to Station list"));
// Source addr not specified
if (src_addr_sw == -1) {
@@ -1066,7 +1076,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_ATTACK_FUNNY_BEACON, TFT_CYAN);
}
else {
Serial.println("Attack type not properly defined");
Serial.println(F("Attack type not properly defined"));
return;
}
}
@@ -1120,7 +1130,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SCAN_ALL, TFT_GREEN);
}
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (cmd_args.get(0) == BT_SPOOFAT_CMD) {
@@ -1165,7 +1175,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SOUR_APPLE, TFT_GREEN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "windows") {
@@ -1177,7 +1187,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SWIFTPAIR_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "samsung") {
@@ -1189,7 +1199,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SAMSUNG_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "google") {
@@ -1201,7 +1211,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_GOOGLE_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "flipper") {
@@ -1213,7 +1223,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_FLIPPER_SPAM, TFT_ORANGE);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "all") {
@@ -1225,11 +1235,11 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SPAM_ALL, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else {
Serial.println("You did not specify a correct spam type");
Serial.println(F("You did not specify a correct spam type"));
}
}
}
@@ -1257,12 +1267,12 @@ void CommandLine::runCommand(String input) {
}
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
@@ -1276,7 +1286,7 @@ void CommandLine::runCommand(String input) {
#endif
wifi_scan_obj.StartScan(BT_SCAN_SKIMMERS, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
@@ -1298,13 +1308,13 @@ void CommandLine::runCommand(String input) {
if (sd_sw != -1) {
#ifdef HAS_SD
if (!sd_obj.supported) {
Serial.println("SD card is not connected. Cannot perform SD Update");
Serial.println(F("SD card is not connected. Cannot perform SD Update"));
return;
}
wifi_scan_obj.currentScanMode = OTA_UPDATE;
sd_obj.runUpdate();
#else
Serial.println("SD card support disabled. Cannot perform SD Update");
Serial.println(F("SD card support disabled. Cannot perform SD Update"));
return;
#endif
}
@@ -1323,12 +1333,14 @@ void CommandLine::runCommand(String input) {
}
if (cmd_args.get(0) == ARP_SCAN_CMD) {
Serial.println("Starting ARP Scan. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#ifndef HAS_DUAL_BAND
Serial.println("Starting ARP Scan. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ARP_SCAN, TFT_CYAN);
#endif
wifi_scan_obj.StartScan(WIFI_ARP_SCAN, TFT_CYAN);
}
// GPS POI
@@ -1376,7 +1388,7 @@ void CommandLine::runCommand(String input) {
#endif
}
#else
Serial.println("Your hardware doesn't have GPS, silly");
Serial.println(F("Your hardware doesn't have GPS, silly"));
return;
#endif
}
@@ -1406,7 +1418,7 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("The IP index specified is out of range");
Serial.println(F("The IP index specified is out of range"));
return;
}
}
@@ -1438,12 +1450,12 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(target_mode, TFT_CYAN);
}
else {
Serial.println("You did not specify a supported service");
Serial.println(F("You did not specify a supported service"));
return;
}
}
else {
Serial.println("You did not specify an IP index");
Serial.println(F("You did not specify an IP index"));
return;
}
}
@@ -1525,7 +1537,7 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("You did not specify which list to show");
Serial.println(F("You did not specify which list to show"));
return;
}
}
@@ -1573,11 +1585,11 @@ void CommandLine::runCommand(String input) {
#endif
}
else {
Serial.println("There are no saved WiFi credentials");
Serial.println(F("There are no saved WiFi credentials"));
}
}
else {
Serial.println("You did not provide the proper args");
Serial.println(F("You did not provide the proper args"));
return;
}
}
@@ -1747,7 +1759,7 @@ void CommandLine::runCommand(String input) {
this->showCounts(count_selected, count_unselected);
}
else {
Serial.println("You did not specify which list to select from");
Serial.println(F("You did not specify which list to select from"));
return;
}
}
@@ -1806,7 +1818,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.addSSID(essid);
}
else {
Serial.println("You did not specify how to add SSIDs");
Serial.println(F("You did not specify how to add SSIDs"));
}
}
// Remove SSID
@@ -1819,7 +1831,7 @@ void CommandLine::runCommand(String input) {
ssids->remove(index);
}
else {
Serial.println("You did not specify whether to add or remove SSIDs");
Serial.println(F("You did not specify whether to add or remove SSIDs"));
return;
}
}

View File

@@ -148,7 +148,7 @@ const char PROGMEM HELP_SNIFF_ESP_CMD[] = "sniffesp";
const char PROGMEM HELP_SNIFF_DEAUTH_CMD[] = "sniffdeauth";
const char PROGMEM HELP_SNIFF_PMKID_CMD[] = "sniffpmkid [-c <channel>][-d][-l]";
const char PROGMEM HELP_STOPSCAN_CMD[] = "stopscan [-f]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s/-f]";
const char PROGMEM HELP_PING_CMD[] = "pingscan";
const char PROGMEM HELP_PORT_SCAN_CMD[] = "portscan [-a -t <ip index>]/[-s <ssh/telnet/dns/http/smtp/https/rdp>]";
const char PROGMEM HELP_ARP_SCAN_CMD[] = "arpscan [-f]";

View File

@@ -1045,9 +1045,9 @@ void Display::buildBanner(String msg, int xpos)
void Display::main(uint8_t scan_mode)
{
if ((scan_mode == LV_JOIN_WIFI) ||
/*if ((scan_mode == LV_JOIN_WIFI) ||
(scan_mode == LV_ADD_SSID))
lv_task_handler();
lv_task_handler();*/
return;
}
// End SPIFFS_functions

View File

@@ -12,7 +12,7 @@
//#include <JPEGDecoder.h>
#include <LinkedList.h>
#include <SPI.h>
#include <lvgl.h>
//#include <lvgl.h>
#include <Ticker.h>
#include "SPIFFS.h"
#include "Assets.h"

View File

@@ -61,9 +61,9 @@ void EvilPortal::setupServer() {
#ifndef HAS_PSRAM
server.on("/", HTTP_GET, [this](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", index_html);
Serial.println("client connected");
Serial.println(F("client connected"));
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#else
@@ -71,7 +71,7 @@ void EvilPortal::setupServer() {
request->send(200, "text/html", index_html);
Serial.println("client connected");
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#endif
@@ -144,10 +144,10 @@ void EvilPortal::setHtmlFromSerial() {
bool EvilPortal::setHtml() {
if (this->using_serial_html) {
Serial.println("html previously set");
Serial.println(F("html previously set"));
return true;
}
Serial.println("Setting HTML...");
Serial.println(F("Setting HTML..."));
#ifdef HAS_SD
File html_file = sd_obj.getFile("/" + this->target_html_name);
#else
@@ -156,7 +156,7 @@ bool EvilPortal::setHtml() {
if (!html_file) {
#ifdef HAS_SCREEN
this->sendToDisplay("Could not find /" + this->target_html_name);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("Could not find /" + this->target_html_name + ". Use stopscan...");
return false;
@@ -164,9 +164,9 @@ bool EvilPortal::setHtml() {
else {
if (html_file.size() > MAX_HTML_SIZE) {
#ifdef HAS_SCREEN
this->sendToDisplay("The given HTML is too large.");
this->sendToDisplay(F("The given HTML is too large."));
this->sendToDisplay("The Byte limit is " + (String)MAX_HTML_SIZE);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("The provided HTML is too large. Byte limit is " + (String)MAX_HTML_SIZE + "\nUse stopscan...");
return false;
@@ -316,14 +316,14 @@ bool EvilPortal::setAP(String essid) {
strncpy(apName, essid.c_str(), MAX_AP_NAME_SIZE);
this->has_ap = true;
Serial.println("ap config set");
Serial.println(F("ap config set"));
return true;
}
void EvilPortal::startAP() {
const IPAddress AP_IP(172, 0, 0, 1);
Serial.print("starting ap ");
Serial.print(F("starting ap "));
Serial.println(apName);
WiFi.mode(WIFI_AP);
@@ -334,19 +334,19 @@ void EvilPortal::startAP() {
this->sendToDisplay("AP started");
#endif
Serial.print("ap ip address: ");
Serial.print(F("ap ip address: "));
Serial.println(WiFi.softAPIP());
this->setupServer();
Serial.println("Server endpoints configured");
Serial.println(F("Server endpoints configured"));
this->dnsServer.start(53, "*", WiFi.softAPIP());
Serial.println("DNS Server started");
Serial.println(F("DNS Server started"));
server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);
Serial.println("Captive Portal handler started");
Serial.println(F("Captive Portal handler started"));
server.begin();
Serial.println("Server started");
Serial.println(F("Server started"));
#ifdef HAS_SCREEN
this->sendToDisplay("Evil Portal READY");
#endif
@@ -375,20 +375,29 @@ void EvilPortal::sendToDisplay(String msg) {
}
void EvilPortal::main(uint8_t scan_mode) {
if ((scan_mode == WIFI_SCAN_EVIL_PORTAL) && (this->has_ap) && (this->has_html)){
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
String logValue1 =
"u: " + this->user_name;
String logValue2 = "p: " + this->password;
String full_string = logValue1 + " " + logValue2 + "\n";
Serial.print(full_string);
buffer_obj.append(full_string);
#ifdef HAS_SCREEN
this->sendToDisplay(full_string);
#endif
}
if (scan_mode != WIFI_SCAN_EVIL_PORTAL || !this->has_ap || !this->has_html) {
return;
}
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
// Adjust size depending on your max username/password length
char line[96];
// If user_name / password are still Arduino String:
snprintf(line, sizeof(line),
"u: %s p: %s\n",
this->user_name.c_str(),
this->password.c_str());
Serial.print(line);
buffer_obj.append(line);
#ifdef HAS_SCREEN
this->sendToDisplay(line);
#endif
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,10 @@
#include "Keyboard.h"
#endif
#ifdef HAS_TOUCH
#include "TouchKeyboard.h"
#endif
#ifdef HAS_SCREEN
#define BATTERY_ANALOG_ON 0
@@ -95,41 +99,10 @@ extern Settings settings_obj;
#define FUNNY_BEACON 40
#define FLOCK 41
PROGMEM void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
PROGMEM bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data);
PROGMEM static lv_disp_buf_t disp_buf;
PROGMEM static lv_color_t buf[LV_HOR_RES_MAX * 10];
PROGMEM static void ta_event_cb(lv_obj_t * ta, lv_event_t event);
PROGMEM static void join_wifi_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void start_ap_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void add_ssid_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void html_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_info_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void at_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void station_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void setting_dropdown_cb(lv_obj_t * btn, lv_event_t event);
// lvgl stuff
PROGMEM static lv_obj_t *kb;
PROGMEM static lv_obj_t * save_as_kb;
struct Menu;
// Individual Nodes of a menu
/*struct MenuNode {
String name;
bool command;
uint16_t color;
uint8_t icon;
TFT_eSPI_Button* button;
bool selected;
std::function<void()> callable;
};*/
struct MenuNode {
String name;
bool command;
@@ -175,13 +148,13 @@ class MenuFunctions
Menu deviceMenu;
// Device menu stuff
Menu whichUpdateMenu;
//Menu whichUpdateMenu;
Menu failedUpdateMenu;
Menu confirmMenu;
Menu updateMenu;
Menu settingsMenu;
Menu specSettingMenu;
Menu languageMenu;
//Menu languageMenu;
Menu sdDeleteMenu;
// WiFi menu stuff
@@ -195,9 +168,9 @@ class MenuFunctions
Menu wifiAPMenu;
Menu wifiIPMenu;
Menu ssidsMenu;
#ifdef HAS_BT
Menu airtagMenu;
#endif
//#ifdef HAS_BT
// Menu airtagMenu;
//#endif
//#ifndef HAS_ILI9341
Menu wifiStationMenu;
//#endif
@@ -253,7 +226,9 @@ class MenuFunctions
void buttonSelected(int b, int x = -1);
void buttonNotSelected(int b, int x = -1);
//#if (!defined(HAS_ILI9341) && defined(HAS_BUTTONS))
#ifdef HAS_MINI_KB
String miniKeyboard(Menu * targetMenu, bool do_pass = false);
#endif
//#endif
#ifdef MARAUDER_CARDPUTER
@@ -296,13 +271,8 @@ class MenuFunctions
void joinWiFiGFX(String essid, bool start_ap = false);
void setGraphScale(float scale);
void initLVGL();
void deinitLVGL();
void selectEPHTMLGFX();
void updateStatusBar();
void addSSIDGFX();
void addAPGFX(String type = "AP");
void addStationGFX();
void buildButtons(Menu* menu, int starting_index = 0, String button_name = "");
void changeMenu(Menu* menu, bool simple_change = false);
void drawStatusBar();

View File

@@ -82,10 +82,10 @@ bool SDInterface::initSD() {
}
if (!SD.exists("/SCRIPTS")) {
Serial.println("/SCRIPTS does not exist. Creating...");
Serial.println(F("/SCRIPTS does not exist. Creating..."));
SD.mkdir("/SCRIPTS");
Serial.println("/SCRIPTS created");
Serial.println(F("/SCRIPTS created"));
}
this->sd_files = new LinkedList<String>();
@@ -96,7 +96,7 @@ bool SDInterface::initSD() {
}
#else
Serial.println("SD support disabled, skipping init");
Serial.println(F("SD support disabled, skipping init"));
return false;
#endif
}
@@ -280,7 +280,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
display_obj.tft.setTextColor(TFT_RED);
display_obj.tft.println(text_table2[12]);
#endif
Serial.println("Update not finished? Something went wrong!");
Serial.println(F("Update not finished? Something went wrong!"));
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_WHITE);
#endif
@@ -299,7 +299,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
#ifdef HAS_SCREEN
display_obj.tft.println(text_table2[14]);
#endif
Serial.println("Not enough space to begin OTA");
Serial.println(F("Not enough space to begin OTA"));
}
}

View File

@@ -0,0 +1,402 @@
#include "TouchKeyboard.h"
#include <string.h>
#include <Arduino.h>
#ifdef HAS_TOUCH
extern Display display_obj;
// Keyboard will occupy the bottom half of the screen.
static inline int16_t kbHeight() { return TFT_HEIGHT / 2; }
static inline int16_t kbYStart() { return TFT_HEIGHT - kbHeight(); }
static inline int16_t kbWidth() { return TFT_WIDTH; }
static inline int16_t kbXStart() { return 0; }
static const int KEY_ROWS = 5;
static const char ROW0_ALPHA[] = "1234567890";
static const char ROW1_ALPHA[] = "qwertyuiop";
static const char ROW2_ALPHA[] = "asdfghjkl";
static const char ROW3_ALPHA[] = "zxcvbnm.";
static const char ROW0_SYM[] = "!@#$%^&*()";
static const char ROW1_SYM[] = "`~-_=+[]{}";
static const char ROW2_SYM[] = "\\|;:'\"";
static const char ROW3_SYM[] = ",.<>/?";
static const uint16_t TOUCH_THRESHOLD = 600;
enum KeyboardLayout {
LAYOUT_ALPHA = 0,
LAYOUT_SYMBOLS
};
static void drawTextArea(const char *title, const char *buffer) {
int16_t areaHeight = TFT_HEIGHT - kbHeight();
// Clear text area
display_obj.tft.fillRect(0, 0, TFT_WIDTH, areaHeight, TFT_BLACK);
int16_t cursorY = 2;
// Optional title
if (title && title[0] != '\0') {
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
display_obj.tft.print(title);
cursorY += 16;
}
// Draw current text
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
display_obj.tft.print(buffer ? buffer : "");
}
static void drawKeyboard(KeyboardLayout layout, bool caps) {
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
display_obj.tft.fillRect(kX, kY, kW, kH, TFT_DARKGREY);
display_obj.tft.setTextColor(TFT_BLACK, TFT_DARKGREY);
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Draw normal character rows (03)
for (int r = 0; r < 4; ++r) {
const char *row = rowsPtr[r];
// For alpha layout row 3, we will also draw CAPS on the rightmost 2 columns.
// The textual row only covers the first part.
int rowLen = strlen(row);
int16_t rowY = kY + r * cellH;
// For alpha row 3, we want row chars towards the left, leaving space for CAPS.
int16_t xOffset;
if (layout == LAYOUT_ALPHA && r == 3) {
// Use columns 0..7 for characters, 8..9 for CAPS
xOffset = 0;
} else {
int maxColsRow = maxCols;
xOffset = (maxColsRow - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2; // center row
}
for (int i = 0; i < rowLen; ++i) {
int16_t keyX = kX + xOffset + i * cellW;
int16_t keyY = rowY;
// Key border
display_obj.tft.drawRect(keyX, keyY, cellW, cellH, TFT_BLACK);
// Label
display_obj.tft.setCursor(keyX + cellW / 2 - 3, keyY + cellH / 2 - 4);
char c = row[i];
// Apply CAPS on alpha letters
if (layout == LAYOUT_ALPHA && r > 0) {
if (c >= 'a' && c <= 'z') {
if (caps) {
c = (char)(c - 'a' + 'A');
}
}
}
char s[2] = { c, '\0' };
display_obj.tft.print(s);
}
// Draw CAPS key for alpha layout on row 3 (rightmost two columns)
if (layout == LAYOUT_ALPHA && r == 3) {
int16_t capsX = kX + 8 * cellW;
int16_t capsW = 2 * cellW;
display_obj.tft.drawRect(capsX, rowY, capsW, cellH, TFT_BLACK);
display_obj.tft.setCursor(capsX + 4, rowY + cellH / 2 - 4);
// Show different label based on state
if (caps) {
display_obj.tft.print("caps");
} else {
display_obj.tft.print("CAPS");
}
}
}
// Special row (row index 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
int r = 4;
int16_t rowY = kY + r * cellH;
// Divide width into 6 segments:
// [CANCEL][SYMB][SPACE (2 segments)][BKSP][OK]
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
display_obj.tft.drawRect(x0, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x0 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("CANCEL");
// SYMB / ABC
display_obj.tft.drawRect(x1, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x1 + 4, rowY + cellH / 2 - 4);
if (layout == LAYOUT_ALPHA) {
display_obj.tft.print("SYMB");
} else {
display_obj.tft.print("ABC");
}
display_obj.tft.drawRect(x2, rowY, (x3 - x2), cellH, TFT_BLACK);
display_obj.tft.setCursor(x2 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("SPACE");
display_obj.tft.drawRect(x3, rowY, (x4 - x3), cellH, TFT_BLACK);
display_obj.tft.setCursor(x3 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("BKSP");
display_obj.tft.drawRect(x4, rowY, (x5 - x4), cellH, TFT_BLACK);
display_obj.tft.setCursor(x4 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("OK");
}
static bool appendChar(char *buffer, size_t bufLen, char c) {
size_t len = strlen(buffer);
if (len + 1 < bufLen) {
buffer[len] = c;
buffer[len + 1] = '\0';
return true;
}
return false;
}
static KeyboardResult handleKeyboardTouch(uint16_t tx, uint16_t ty,
char *buffer, size_t bufLen,
KeyboardLayout layout,
bool caps) {
if (!buffer || bufLen < 2) return KB_NONE;
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
if (ty < kY || ty >= (kY + kH)) {
// Touch is outside keyboard area
return KB_NONE;
}
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
int rowIndex = (ty - kY) / cellH;
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Normal rows (0..3)
if (rowIndex >= 0 && rowIndex <= 3) {
const char *row = rowsPtr[rowIndex];
int rowLen = strlen(row);
int16_t rowY = kY + rowIndex * cellH;
// Alpha row 3: characters on columns 0..7, CAPS on columns 8..9
if (layout == LAYOUT_ALPHA && rowIndex == 3) {
int16_t capsXStart = kX + 8 * cellW;
int16_t capsXEnd = capsXStart + 2 * cellW;
// Check CAPS region
if (tx >= capsXStart && tx < capsXEnd) {
return KB_TOGGLE_CAPS;
}
// Characters only in the columns before CAPS
int16_t xOffset = 0;
if (tx < kX || tx >= (kX + 8 * cellW)) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps mapping
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// All other rows
int16_t xOffset = (maxCols - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2;
if (tx < kX + xOffset || tx >= kX + xOffset + rowLen * cellW) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps on alpha letters (rows 1 and 2)
if (layout == LAYOUT_ALPHA && rowIndex > 0) {
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// Special row (rowIndex == 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
if (rowIndex == 4) {
int16_t rowY = kY + rowIndex * cellH;
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
if (tx >= x0 && tx < x1) {
return KB_CANCEL;
}
// SYMB / ABC toggle
if (tx >= x1 && tx < x2) {
return KB_TOGGLE_LAYOUT;
}
// SPACE (x2..x3)
if (tx >= x2 && tx < x3) {
if (appendChar(buffer, bufLen, ' ')) {
return KB_CHANGED;
}
return KB_NONE;
}
// BKSP (x3..x4)
if (tx >= x3 && tx < x4) {
size_t len = strlen(buffer);
if (len > 0) {
buffer[len - 1] = '\0';
return KB_CHANGED;
}
return KB_NONE;
}
// OK (x4..x5)
if (tx >= x4 && tx < x5) {
return KB_DONE;
}
}
return KB_NONE;
}
bool keyboardInput(char *buffer, size_t bufLen, const char *title) {
if (!buffer || bufLen < 2) {
return false;
}
// To force clear, uncomment this:
// buffer[0] = '\0';
KeyboardLayout layout = LAYOUT_ALPHA;
bool caps = false;
drawTextArea(title, buffer);
drawKeyboard(layout, caps);
uint32_t lastTouchTime = 0;
const uint32_t debounceMs = 120;
while (true) {
uint16_t x = 0, y = 0;
uint8_t touched = display_obj.updateTouch(&x, &y, TOUCH_THRESHOLD);
if (touched) {
uint32_t now = millis();
if (now - lastTouchTime < debounceMs) {
// "debounce"
continue;
}
lastTouchTime = now;
KeyboardResult r = handleKeyboardTouch(x, y, buffer, bufLen, layout, caps);
if (r == KB_CHANGED) {
drawTextArea(title, buffer);
} else if (r == KB_DONE) {
drawTextArea(title, buffer);
return true;
} else if (r == KB_CANCEL) {
// Optional: buffer[0] = '\0';
drawTextArea(title, buffer);
return false;
} else if (r == KB_TOGGLE_LAYOUT) {
layout = (layout == LAYOUT_ALPHA) ? LAYOUT_SYMBOLS : LAYOUT_ALPHA;
drawKeyboard(layout, caps);
} else if (r == KB_TOGGLE_CAPS) {
caps = !caps;
drawKeyboard(layout, caps);
}
}
delay(5);
yield();
}
return false;
}
#endif

View File

@@ -0,0 +1,31 @@
#pragma once
#include "configs.h"
#ifdef HAS_TOUCH
#include "Display.h"
#include <stddef.h>
#include <stdint.h>
enum KeyboardResult {
KB_NONE = 0,
KB_CHANGED,
KB_DONE,
KB_CANCEL,
KB_TOGGLE_LAYOUT,
KB_TOGGLE_CAPS
};
/**
* Blocking keyboard input.
*
* @param buffer Caller-provided char buffer to hold the text. Will be null-terminated.
* @param bufLen Total size of the buffer (including space for '\0').
* @param title Optional title displayed above the text box (can be nullptr).
*
* @return true if user pressed OK, false if user pressed CANCEL (or if buffer invalid).
*/
bool keyboardInput(char *buffer, size_t bufLen, const char *title = nullptr);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -28,12 +28,14 @@
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include <esp_timer.h>
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#ifndef HAS_DUAL_BAND
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#endif
#ifdef HAS_DUAL_BAND
#include "esp_system.h"
#endif
#ifdef HAS_BT
#if defined(HAS_BT) && !defined(HAS_DUAL_BAND)
#include "esp_bt.h"
#endif
#ifdef HAS_SCREEN
@@ -523,6 +525,8 @@ class WiFiScan
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
#endif
void showNetworkInfo();
void setNetworkInfo();
void fullARP();
bool readARP(IPAddress targ_ip);
bool singleARP(IPAddress ip_addr);
@@ -590,7 +594,6 @@ class WiFiScan
void RunBluetoothScan(uint8_t scan_mode, uint16_t color);
void RunSourApple(uint8_t scan_mode, uint16_t color);
void RunSwiftpairSpam(uint8_t scan_mode, uint16_t color);
void RunLvJoinWiFi(uint8_t scan_mode, uint16_t color);
void RunEvilPortal(uint8_t scan_mode, uint16_t color);
void RunPingScan(uint8_t scan_mode, uint16_t color);
void RunPortScanAll(uint8_t scan_mode, uint16_t color);
@@ -624,6 +627,14 @@ class WiFiScan
bool force_probe = false;
bool save_pcap = false;
bool ep_deauth = false;
bool ble_scanning = false;
char* flock_ssid[4] = {
"flock",
"penguin",
"pigvision",
"fs ext battery"
};
#ifdef HAS_DUAL_BAND
uint8_t channel_activity[DUAL_BAND_CHANNELS] = {};
@@ -787,12 +798,12 @@ class WiFiScan
static void getMAC(char *addr, uint8_t* data, uint16_t offset);
static void pwnSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void stationSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallbackFull(void* buf, wifi_promiscuous_pkt_type_t type);
static void deauthSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconListSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void activeEapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void eapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);

View File

@@ -32,7 +32,7 @@
//#define MARAUDER_V8
//// END BOARD TARGETS
#define MARAUDER_VERSION "v1.8.11"
#define MARAUDER_VERSION "v1.9.0"
#define GRAPH_REFRESH 100
@@ -407,7 +407,7 @@
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
//#define HAS_BATTERY
//#define HAS_BT
#define HAS_BT
//#define HAS_BUTTONS
#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
@@ -426,9 +426,9 @@
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
//#define HAS_BT
#define HAS_BT
//#define HAS_BUTTONS
#define HAS_NEOPIXEL_LED
//#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
#define HAS_SCREEN
#define HAS_FULL_SCREEN

View File

@@ -298,6 +298,16 @@ void setup()
menu_function_obj.RunSetup();
#endif
/*char ssidBuf[64] = {0}; // or prefill with existing SSID
if (keyboardInput(ssidBuf, sizeof(ssidBuf), "Enter SSID")) {
// user pressed OK
Serial.println(ssidBuf);
} else {
Serial.println(F("User exited keyboard"));
}
menu_function_obj.changeMenu(menu_function_obj.current_menu);*/
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
Serial.println(F("CLI Ready"));

View File

@@ -8,7 +8,7 @@
#include "configs.h"
#include "esp_heap_caps.h"
//#include "esp_heap_caps.h"
struct mac_addr {
unsigned char bytes[6];
@@ -27,7 +27,7 @@ struct ProbeReqSsid {
uint8_t requests;
};
const char apple_ouis[][9] PROGMEM = {
/*const char apple_ouis[][9] PROGMEM = {
"00:17:F2", "00:1E:C2", "00:26:08", "F8:1E:DF", "BC:92:6B",
"28:E0:2C", "3C:07:54", "7C:D1:C3", "DC:A9:04", "F0:D1:A9",
"C0:2C:5C", "00:03:93", "00:03:94", "00:03:95", "00:03:96",
@@ -114,14 +114,7 @@ const char linksys_ouis[][9] PROGMEM = {
};
const char netgear_ouis[][9] PROGMEM = {
"00:09:5B", "00:0F:B5", "00:14:6C", "00:1B:2F", "00:1E:2A", "00:1F:33", "00:22:3F", "00:22:4B", "00:26:F2",
"00:8E:F2", "08:02:8E", "08:36:C9", "08:BD:43", "10:0C:6B", "10:0D:7F", "10:DA:43", "14:59:C0", "20:4E:7F",
"20:E5:2A", "28:80:88", "28:94:01", "28:C6:8E", "2C:30:33", "2C:B0:5D", "30:46:9A", "34:98:B5", "38:94:ED",
"3C:37:86", "40:5D:82", "44:A5:6E", "4C:60:DE", "50:4A:6E", "50:6A:03", "54:07:7D", "58:EF:68", "60:38:E0",
"6C:B0:CE", "6C:CD:D6", "74:44:01", "80:37:73", "84:1B:5E", "8C:3B:AD", "94:18:65", "9C:3D:CF", "9C:C9:EB",
"9C:D3:6D", "A0:04:60", "A0:21:B7", "A0:40:A0", "A4:2B:8C", "B0:39:56", "B0:7F:B9", "B0:B9:8A", "BC:A5:11",
"C0:3F:0E", "C0:FF:D4", "C4:04:15", "C4:3D:C7", "C8:9E:43", "CC:40:D0", "DC:EF:09", "E0:46:9A", "E0:46:EE",
"E0:91:F5", "E4:F4:C6", "E8:FC:AF", "F8:73:94"
"00:09:5B", "00:0F:B5", "00:14:6C"
};
const char oneplus_ouis[][9] PROGMEM = {
@@ -154,7 +147,7 @@ const char tplink_ouis[][9] PROGMEM = {
const char xiaomi_ouis[][9] PROGMEM = {
"04:CF:8C", "18:59:36", "38:1A:2D", "64:B4:73", "78:02:F8",
"90:4E:91", "C4:0B:CB", "D0:DB:32"
};
};*/
uint8_t getDRAMUsagePercent() {
//size_t total = heap_caps_get_total_size(MALLOC_CAP_8BIT);
@@ -171,7 +164,7 @@ uint8_t getDRAMUsagePercent() {
#ifdef HAS_PSRAM
uint8_t getPSRAMUsagePercent() {
//size_t total = heap_caps_get_total_size(MALLOC_CAP_SPIRAM);
/*//size_t total = heap_caps_get_total_size(MALLOC_CAP_SPIRAM);
//size_t free = heap_caps_get_free_size(MALLOC_CAP_SPIRAM);
size_t total = ESP.getPsramSize();
@@ -181,7 +174,8 @@ uint8_t getDRAMUsagePercent() {
size_t used = total - free;
uint8_t percent = (used * 100) / total;
return percent;
return percent;*/
return getDRAMUsagePercent();
}
#endif
@@ -299,7 +293,7 @@ void convertMacStringToUint8(const String& macStr, uint8_t macAddr[6]) {
}
// Function to check if the given MAC address matches any known OUI
const char* getManufacturer(const char *addr) {
/*const char* getManufacturer(const char *addr) {
static char oui[9]; // Temporary buffer for extracted OUI
// Extract the first three bytes (OUI) from addr
@@ -316,7 +310,7 @@ const char* getManufacturer(const char *addr) {
for (uint8_t i = 0; i < sizeof(list) / sizeof(list[0]); i++) { \
char storedOUI[9]; \
strcpy_P(storedOUI, list[i]); \
/* Convert the stored OUI to lowercase */ \
\
for (int j = 0; j < 8; j++) { \
storedOUI[j] = tolower(storedOUI[j]); \
} \
@@ -355,7 +349,7 @@ String replaceOUIWithManufacturer(const char *sta_addr) {
// Construct the new address: manufacturer + the remaining MAC address (after the first 3 bytes)
return String(manufacturer) + mac_suffix;
}
}*/
IPAddress getNextIP(IPAddress currentIP, IPAddress subnetMask) {
// Convert IPAddress to uint32_t