#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <WiFi.h>
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
// --- PINS ---
const int B_HAUT = 13, B_DROITE = 26, B_BAS = 4, B_GAUCHE = 5, B_OK = 27;
enum Etat {VERROU, VERIF, MENU, SUB_MENU_BT, SUB_MENU_SYS, SUB_MENU_WIFI, ECRIRE_INFO};
Etat etatActuel = VERROU;
String saisie = "";
String messageVerif = "";
bool accesOk = false;
bool inverse = false;
int curseur = 0, curseurSub = 0, curseurSys = 0;
String menuOptions[4] = {"> WIFI", "> BLUETOOTH", "> SYSTEME", "> QUITTER"};
String fakeNames[5] = {"FBI_Van_4", "Hacker_Device", "Virus.exe", "Unknown_Link", "ESP32_Pro"};
void setup() {
u8g2.begin();
WiFi.mode(WIFI_STA); // Mode station pour le scan
WiFi.disconnect();
pinMode(B_HAUT, INPUT_PULLUP); pinMode(B_DROITE, INPUT_PULLUP);
pinMode(B_BAS, INPUT_PULLUP); pinMode(B_GAUCHE, INPUT_PULLUP);
pinMode(B_OK, INPUT_PULLUP);
}
// --- FONCTION WIFI SCANNER ---
void scannerWiFi() {
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "SCANNING WIFI...");
u8g2.sendBuffer();
int n = WiFi.scanNetworks();
u8g2.clearBuffer();
if (n == 0) {
u8g2.drawStr(10, 30, "NO NETWORK FOUND");
} else {
u8g2.drawStr(5, 10, "[ NETWORKS FOUND ]");
// On affiche les 4 premiers réseaux trouvés
for (int i = 0; i < (n > 4 ? 4 : n); i++) {
String network = String(WiFi.SSID(i)).substring(0, 12); // Coupe si trop long
u8g2.setCursor(5, 25 + (i * 12));
u8g2.print(i+1); u8g2.print(": "); u8g2.print(network);
u8g2.print(" ("); u8g2.print(WiFi.RSSI(i)); u8g2.print(")");
}
}
u8g2.sendBuffer();
while(digitalRead(B_OK) == HIGH); // Attendre appui sur OK pour quitter
delay(300);
}
// --- FONCTION SPAM BT (Identique) ---
void executerSpamBT() {
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "BOOTING SPAM...");
u8g2.sendBuffer();
for (int i = 0; i < 5; i++) {
BLEDevice::init(fakeNames[i].c_str());
BLEServer *pServer = BLEDevice::createServer();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->start();
u8g2.clearBuffer();
u8g2.drawStr(10, 25, "[ATTACKING...]");
u8g2.drawStr(10, 45, fakeNames[i].c_str());
u8g2.sendBuffer();
delay(1000);
pAdvertising->stop();
BLEDevice::deinit(false);
}
}
void loop() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x12_tf);
if (inverse) { u8g2.setDrawColor(1); u8g2.drawBox(0, 0, 128, 64); u8g2.setDrawColor(0); }
else { u8g2.setDrawColor(1); }
if (etatActuel == VERROU) {
u8g2.drawStr(10, 20, "DEVERROUILLER :");
u8g2.drawFrame(10, 30, 100, 20);
u8g2.drawStr(45, 45, saisie.c_str());
if (digitalRead(B_HAUT) == LOW) { saisie += "1"; delay(250); }
if (digitalRead(B_DROITE) == LOW) { saisie += "2"; delay(250); }
if (digitalRead(B_BAS) == LOW) { saisie += "3"; delay(250); }
if (digitalRead(B_GAUCHE) == LOW) { saisie += "4"; delay(250); }
if (digitalRead(B_OK) == LOW) {
if (saisie == "1234") { messageVerif = "ACCES AUTORISE"; accesOk = true; }
else { messageVerif = "ACCES REFUSE"; accesOk = false; }
saisie = ""; etatActuel = VERIF; delay(250);
}
}
else if (etatActuel == VERIF) {
u8g2.drawStr(20, 35, messageVerif.c_str());
u8g2.sendBuffer();
delay(1000);
etatActuel = accesOk ? MENU : VERROU;
}
else if (etatActuel == MENU) {
u8g2.drawStr(35, 10, "--- MENU ---");
for (int i = 0; i < 4; i++) {
if (i == curseur) u8g2.drawButtonUTF8(5, 25 + (i * 12), U8G2_BTN_INV, 110, 1, 1, menuOptions[i].c_str());
else u8g2.drawStr(10, 25 + (i * 12), menuOptions[i].c_str());
}
if (digitalRead(B_HAUT) == LOW) { curseur--; if(curseur < 0) curseur = 3; delay(200); }
if (digitalRead(B_BAS) == LOW) { curseur++; if(curseur >= 4) curseur = 0; delay(200); }
if (digitalRead(B_OK) == LOW) {
if (curseur == 0) { etatActuel = SUB_MENU_WIFI; }
else if (curseur == 1) { etatActuel = SUB_MENU_BT; }
else if (curseur == 2) { etatActuel = SUB_MENU_SYS; }
else if (curseur == 3) { etatActuel = VERROU; accesOk = false; }
delay(300);
}
}
// --- GESTION SUB-MENUS ---
else if (etatActuel == SUB_MENU_WIFI) {
u8g2.drawStr(30, 10, "[ WIFI ]");
u8g2.drawStr(10, 30, "> SCAN NETWORKS");
u8g2.drawStr(10, 45, "> RETOUR");
if (digitalRead(B_OK) == LOW) { scannerWiFi(); etatActuel = MENU; delay(300); }
}
else if (etatActuel == SUB_MENU_BT) {
u8g2.drawStr(30, 10, "[ BLUETOOTH ]");
u8g2.drawStr(10, 30, "> SPAM NAMES");
if (digitalRead(B_OK) == LOW) { executerSpamBT(); etatActuel = MENU; delay(300); }
}
else if (etatActuel == SUB_MENU_SYS) {
u8g2.drawStr(30, 10, "[ SYSTEME ]");
// (Le reste du menu système est identique à la V4.1)
u8g2.drawStr(10, 30, "VOIR HARDWARE...");
if (digitalRead(B_OK) == LOW) { etatActuel = ECRIRE_INFO; curseurSys = 0; delay(300); }
}
else if (etatActuel == ECRIRE_INFO) {
u8g2.drawStr(10, 20, "MODEL: ESP32-WROOM");
u8g2.drawStr(10, 35, "CPU: 240 MHz");
u8g2.drawStr(10, 50, "UPTIME:"); u8g2.setCursor(60, 50); u8g2.print(millis()/1000); u8g2.print("s");
if (digitalRead(B_OK) == LOW) { etatActuel = MENU; delay(300); }
}
u8g2.sendBuffer();
}