CommandLine.ino 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267
  1. #include "CommandLine.h"
  2. bool configESPCamera_initialized = false;
  3. void configESPCamera() {
  4. if(configESPCamera_initialized)
  5. esp_camera_deinit();
  6. // Object to store the camera configuration parameters
  7. camera_config_t config;
  8. config.ledc_channel = LEDC_CHANNEL_0;
  9. config.ledc_timer = LEDC_TIMER_0;
  10. config.pin_d0 = Y2_GPIO_NUM;
  11. config.pin_d1 = Y3_GPIO_NUM;
  12. config.pin_d2 = Y4_GPIO_NUM;
  13. config.pin_d3 = Y5_GPIO_NUM;
  14. config.pin_d4 = Y6_GPIO_NUM;
  15. config.pin_d5 = Y7_GPIO_NUM;
  16. config.pin_d6 = Y8_GPIO_NUM;
  17. config.pin_d7 = Y9_GPIO_NUM;
  18. config.pin_xclk = XCLK_GPIO_NUM;
  19. config.pin_pclk = PCLK_GPIO_NUM;
  20. config.pin_vsync = VSYNC_GPIO_NUM;
  21. config.pin_href = HREF_GPIO_NUM;
  22. config.pin_sscb_sda = SIOD_GPIO_NUM;
  23. config.pin_sscb_scl = SIOC_GPIO_NUM;
  24. config.pin_pwdn = PWDN_GPIO_NUM;
  25. config.pin_reset = RESET_GPIO_NUM;
  26. config.xclk_freq_hz = 20000000;
  27. config.pixel_format = PIXFORMAT_JPEG; // Choices are YUV422, GRAYSCALE, RGB565, JPEG
  28. // Select lower framesize if the camera doesn't support PSRAM
  29. if (psramFound()) {
  30. config.frame_size = FRAMESIZE_UXGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
  31. config.jpeg_quality = 10; //10-63 lower number means higher quality
  32. config.fb_count = 2;
  33. } else {
  34. config.frame_size = FRAMESIZE_SVGA;
  35. config.jpeg_quality = 12;
  36. config.fb_count = 1;
  37. }
  38. // Initialize the Camera
  39. esp_err_t err = esp_camera_init(&config);
  40. if (err != ESP_OK) {
  41. Serial.printf("Camera init failed with error 0x%x", err);
  42. return;
  43. }
  44. configESPCamera_initialized = true;
  45. // Camera quality adjustments
  46. sensor_t * s = esp_camera_sensor_get();
  47. // BRIGHTNESS (-2 to 2)
  48. s->set_brightness(s, 0);
  49. // CONTRAST (-2 to 2)
  50. s->set_contrast(s, 0);
  51. // SATURATION (-2 to 2)
  52. s->set_saturation(s, 0);
  53. // SPECIAL EFFECTS (0 - No Effect, 1 - Negative, 2 - Grayscale, 3 - Red Tint, 4 - Green Tint, 5 - Blue Tint, 6 - Sepia)
  54. s->set_special_effect(s, 0);
  55. // WHITE BALANCE (0 = Disable , 1 = Enable)
  56. s->set_whitebal(s, 1);
  57. // AWB GAIN (0 = Disable , 1 = Enable)
  58. s->set_awb_gain(s, 1);
  59. // WB MODES (0 - Auto, 1 - Sunny, 2 - Cloudy, 3 - Office, 4 - Home)
  60. s->set_wb_mode(s, 0);
  61. // EXPOSURE CONTROLS (0 = Disable , 1 = Enable)
  62. s->set_exposure_ctrl(s, 1);
  63. // AEC2 (0 = Disable , 1 = Enable)
  64. s->set_aec2(s, 0);
  65. // AE LEVELS (-2 to 2)
  66. s->set_ae_level(s, 0);
  67. // AEC VALUES (0 to 1200)
  68. s->set_aec_value(s, 300);
  69. // GAIN CONTROLS (0 = Disable , 1 = Enable)
  70. s->set_gain_ctrl(s, 1);
  71. // AGC GAIN (0 to 30)
  72. s->set_agc_gain(s, 0);
  73. // GAIN CEILING (0 to 6)
  74. s->set_gainceiling(s, (gainceiling_t)0);
  75. // BPC (0 = Disable , 1 = Enable)
  76. s->set_bpc(s, 0);
  77. // WPC (0 = Disable , 1 = Enable)
  78. s->set_wpc(s, 1);
  79. // RAW GMA (0 = Disable , 1 = Enable)
  80. s->set_raw_gma(s, 1);
  81. // LENC (0 = Disable , 1 = Enable)
  82. s->set_lenc(s, 1);
  83. // HORIZ MIRROR (0 = Disable , 1 = Enable)
  84. s->set_hmirror(s, 0);
  85. // VERT FLIP (0 = Disable , 1 = Enable)
  86. s->set_vflip(s, 0);
  87. // DCW (0 = Disable , 1 = Enable)
  88. s->set_dcw(s, 1);
  89. // COLOR BAR PATTERN (0 = Disable , 1 = Enable)
  90. s->set_colorbar(s, 0);
  91. }
  92. void initMicroSDCard() {
  93. Serial.println("Mounting MicroSD Card");
  94. if (!SD_MMC.begin("/sdcard", true, false, SDMMC_FREQ_DEFAULT)) {
  95. Serial.println("MicroSD Card Mount Failed");
  96. return;
  97. }
  98. uint8_t cardType = SD_MMC.cardType();
  99. if (cardType == CARD_NONE) {
  100. Serial.println("No MicroSD Card found");
  101. return;
  102. }
  103. }
  104. void takeNewPhoto(String path, bool flash) {
  105. // Take Picture with Camera
  106. // Setup frame buffer
  107. if (flash)
  108. {
  109. pinMode(4, OUTPUT);
  110. digitalWrite(4, HIGH);
  111. delay(100);
  112. }
  113. esp_camera_fb_get();
  114. delay(300);
  115. camera_fb_t * fb = esp_camera_fb_get();
  116. if (flash)
  117. {
  118. digitalWrite(4, LOW);
  119. }
  120. if (!fb) {
  121. Serial.println("Camera capture failed");
  122. return;
  123. }
  124. // Save picture to microSD card
  125. fs::FS &fs = SD_MMC;
  126. File file = fs.open(path.c_str(), FILE_WRITE);
  127. if (!file) {
  128. Serial.println("Failed to open file in write mode");
  129. }
  130. else {
  131. file.write(fb->buf, fb->len); // payload (image), payload length
  132. Serial.printf("Saved file to path: %s\n", path.c_str());
  133. }
  134. // Close the file
  135. file.close();
  136. // Return the frame buffer back to the driver for reuse
  137. esp_camera_fb_return(fb);
  138. fb = NULL;
  139. }
  140. CommandLine::CommandLine() {
  141. }
  142. void CommandLine::RunSetup() {
  143. //Serial.println(this->ascii_art);
  144. Serial.println(F("\n\n--------------------------------\n"));
  145. Serial.println(F(" ESP32 Marauder \n"));
  146. Serial.println(" " + version_number + "\n");
  147. #ifdef WRITE_PACKETS_SERIAL
  148. Serial.println(F(" >> Serial \n"));
  149. #endif
  150. Serial.println(F(" By: justcallmekoko\n"));
  151. Serial.println(F("--------------------------------\n\n"));
  152. Serial.print("> ");
  153. }
  154. String CommandLine::getSerialInput() {
  155. String input = "";
  156. if (Serial.available() > 0)
  157. input = Serial.readStringUntil('\n');
  158. input.trim();
  159. return input;
  160. }
  161. void CommandLine::main(uint32_t currentTime) {
  162. String input = this->getSerialInput();
  163. this->runCommand(input);
  164. if (input != "")
  165. Serial.print("> ");
  166. }
  167. LinkedList<String> CommandLine::parseCommand(String input, char* delim) {
  168. LinkedList<String> cmd_args;
  169. bool inQuote = false;
  170. bool inApostrophe = false;
  171. String buffer = "";
  172. for (int i = 0; i < input.length(); i++) {
  173. char c = input.charAt(i);
  174. if (c == '"') {
  175. // Check if the quote is within an apostrophe
  176. if (inApostrophe) {
  177. buffer += c;
  178. } else {
  179. inQuote = !inQuote;
  180. }
  181. } else if (c == '\'') {
  182. // Check if the apostrophe is within a quote
  183. if (inQuote) {
  184. buffer += c;
  185. } else {
  186. inApostrophe = !inApostrophe;
  187. }
  188. } else if (!inQuote && !inApostrophe && strchr(delim, c) != NULL) {
  189. cmd_args.add(buffer);
  190. buffer = "";
  191. } else {
  192. buffer += c;
  193. }
  194. }
  195. // Add the last argument
  196. if (!buffer.isEmpty()) {
  197. cmd_args.add(buffer);
  198. }
  199. return cmd_args;
  200. }
  201. int CommandLine::argSearch(LinkedList<String>* cmd_args_list, String key) {
  202. for (int i = 0; i < cmd_args_list->size(); i++) {
  203. if (cmd_args_list->get(i) == key)
  204. return i;
  205. }
  206. return -1;
  207. }
  208. bool CommandLine::checkValueExists(LinkedList<String>* cmd_args_list, int index) {
  209. if (index < cmd_args_list->size() - 1)
  210. return true;
  211. return false;
  212. }
  213. bool CommandLine::inRange(int max, int index) {
  214. if ((index >= 0) && (index < max))
  215. return true;
  216. return false;
  217. }
  218. bool CommandLine::apSelected() {
  219. for (int i = 0; i < access_points->size(); i++) {
  220. if (access_points->get(i).selected)
  221. return true;
  222. }
  223. return false;
  224. }
  225. bool CommandLine::hasSSIDs() {
  226. if (ssids->size() == 0)
  227. return false;
  228. return true;
  229. }
  230. void CommandLine::showCounts(int selected, int unselected) {
  231. Serial.print((String) selected + " selected");
  232. if (unselected != -1)
  233. Serial.print(", " + (String) unselected + " unselected");
  234. Serial.println("");
  235. }
  236. String CommandLine::toLowerCase(String str) {
  237. String result = str;
  238. for (int i = 0; i < str.length(); i++) {
  239. int charValue = str.charAt(i);
  240. if (charValue >= 65 && charValue <= 90) { // ASCII codes for uppercase letters
  241. charValue += 32;
  242. result.setCharAt(i, char(charValue));
  243. }
  244. }
  245. return result;
  246. }
  247. void CommandLine::filterAccessPoints(String filter) {
  248. int count_selected = 0;
  249. int count_unselected = 0;
  250. // Split the filter string into individual filters
  251. LinkedList<String> filters;
  252. int start = 0;
  253. int end = filter.indexOf(" or ");
  254. while (end != -1) {
  255. filters.add(filter.substring(start, end));
  256. start = end + 4;
  257. end = filter.indexOf(" or ", start);
  258. }
  259. filters.add(filter.substring(start));
  260. // Loop over each access point and check if it matches any of the filters
  261. for (int i = 0; i < access_points->size(); i++) {
  262. bool matchesFilter = false;
  263. for (int j = 0; j < filters.size(); j++) {
  264. String f = toLowerCase(filters.get(j));
  265. if (f.substring(0, 7) == "equals ") {
  266. String ssidEquals = f.substring(7);
  267. if ((ssidEquals.charAt(0) == '\"' && ssidEquals.charAt(ssidEquals.length() - 1) == '\"' && ssidEquals.length() > 1) ||
  268. (ssidEquals.charAt(0) == '\'' && ssidEquals.charAt(ssidEquals.length() - 1) == '\'' && ssidEquals.length() > 1)) {
  269. ssidEquals = ssidEquals.substring(1, ssidEquals.length() - 1);
  270. }
  271. if (access_points->get(i).essid.equalsIgnoreCase(ssidEquals)) {
  272. matchesFilter = true;
  273. break;
  274. }
  275. } else if (f.substring(0, 9) == "contains ") {
  276. String ssidContains = f.substring(9);
  277. if ((ssidContains.charAt(0) == '\"' && ssidContains.charAt(ssidContains.length() - 1) == '\"' && ssidContains.length() > 1) ||
  278. (ssidContains.charAt(0) == '\'' && ssidContains.charAt(ssidContains.length() - 1) == '\'' && ssidContains.length() > 1)) {
  279. ssidContains = ssidContains.substring(1, ssidContains.length() - 1);
  280. }
  281. String essid = toLowerCase(access_points->get(i).essid);
  282. if (essid.indexOf(ssidContains) != -1) {
  283. matchesFilter = true;
  284. break;
  285. }
  286. }
  287. }
  288. // Toggles the selected state of the AP
  289. AccessPoint new_ap = access_points->get(i);
  290. new_ap.selected = matchesFilter;
  291. access_points->set(i, new_ap);
  292. if (matchesFilter) {
  293. count_selected++;
  294. } else {
  295. count_unselected++;
  296. }
  297. }
  298. this->showCounts(count_selected, count_unselected);
  299. }
  300. void CommandLine::runCommand(String input) {
  301. if (input != "")
  302. Serial.println("#" + input);
  303. else
  304. return;
  305. LinkedList<String> cmd_args = this->parseCommand(input, " ");
  306. //// Admin commands
  307. // Help
  308. if (cmd_args.get(0) == HELP_CMD) {
  309. Serial.println(HELP_HEAD);
  310. Serial.println(HELP_CH_CMD);
  311. Serial.println(HELP_SETTINGS_CMD);
  312. Serial.println(HELP_CLEARAP_CMD_A);
  313. Serial.println(HELP_REBOOT_CMD);
  314. Serial.println(HELP_UPDATE_CMD_A);
  315. Serial.println(HELP_LS_CMD);
  316. Serial.println(HELP_LED_CMD);
  317. Serial.println(HELP_GPS_DATA_CMD);
  318. Serial.println(HELP_GPS_CMD);
  319. // WiFi sniff/scan
  320. Serial.println(HELP_EVIL_PORTAL_CMD);
  321. Serial.println(HELP_SIGSTREN_CMD);
  322. Serial.println(HELP_SCANAP_CMD);
  323. Serial.println(HELP_SCANSTA_CMD);
  324. Serial.println(HELP_SNIFF_RAW_CMD);
  325. Serial.println(HELP_SNIFF_BEACON_CMD);
  326. Serial.println(HELP_SNIFF_PROBE_CMD);
  327. Serial.println(HELP_SNIFF_PWN_CMD);
  328. Serial.println(HELP_SNIFF_ESP_CMD);
  329. Serial.println(HELP_SNIFF_DEAUTH_CMD);
  330. Serial.println(HELP_SNIFF_PMKID_CMD);
  331. Serial.println(HELP_STOPSCAN_CMD);
  332. Serial.println(HELP_WARDRIVE_CMD);
  333. // WiFi attack
  334. Serial.println(HELP_ATTACK_CMD);
  335. // WiFi Aux
  336. Serial.println(HELP_LIST_AP_CMD_A);
  337. Serial.println(HELP_LIST_AP_CMD_B);
  338. Serial.println(HELP_LIST_AP_CMD_C);
  339. Serial.println(HELP_SEL_CMD_A);
  340. Serial.println(HELP_SSID_CMD_A);
  341. Serial.println(HELP_SSID_CMD_B);
  342. // Bluetooth sniff/scan
  343. Serial.println(HELP_BT_SNIFF_CMD);
  344. Serial.println(HELP_BT_SKIM_CMD);
  345. Serial.println(HELP_FOOT);
  346. return;
  347. }
  348. // Stop Scan
  349. if (cmd_args.get(0) == STOPSCAN_CMD) {
  350. //if (wifi_scan_obj.currentScanMode == OTA_UPDATE) {
  351. // wifi_scan_obj.currentScanMode = WIFI_SCAN_OFF;
  352. //#ifdef HAS_SCREEN
  353. // menu_function_obj.changeMenu(menu_function_obj.updateMenu.parentMenu);
  354. //#endif
  355. // WiFi.softAPdisconnect(true);
  356. // web_obj.shutdownServer();
  357. // return;
  358. //}
  359. wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
  360. Serial.println("Stopping WiFi tran/recv");
  361. // If we don't do this, the text and button coordinates will be off
  362. #ifdef HAS_SCREEN
  363. display_obj.tft.init();
  364. menu_function_obj.changeMenu(menu_function_obj.current_menu);
  365. #endif
  366. }
  367. else if (cmd_args.get(0) == GPS_DATA_CMD) {
  368. #ifdef HAS_GPS
  369. if (gps_obj.getGpsModuleStatus()) {
  370. Serial.println("Getting GPS Data. Stop with " + (String)STOPSCAN_CMD);
  371. wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_DATA;
  372. #ifdef HAS_SCREEN
  373. menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
  374. #endif
  375. wifi_scan_obj.StartScan(WIFI_SCAN_GPS_DATA, TFT_CYAN);
  376. }
  377. #endif
  378. }
  379. else if (cmd_args.get(0) == GPS_CMD) {
  380. #ifdef HAS_GPS
  381. if (gps_obj.getGpsModuleStatus()) {
  382. int get_arg = this->argSearch(&cmd_args, "-g");
  383. if (get_arg != -1) {
  384. String gps_info = cmd_args.get(get_arg + 1);
  385. if (gps_info == "fix")
  386. Serial.println("Fix: " + gps_obj.getFixStatusAsString());
  387. else if (gps_info == "sat")
  388. Serial.println("Sats: " + gps_obj.getNumSatsString());
  389. else if (gps_info == "lat")
  390. Serial.println("Lat: " + gps_obj.getLat());
  391. else if (gps_info == "lon")
  392. Serial.println("Lon: " + gps_obj.getLon());
  393. else if (gps_info == "alt")
  394. Serial.println("Alt: " + (String)gps_obj.getAlt());
  395. else if (gps_info == "date")
  396. Serial.println("Date/Time: " + gps_obj.getDatetime());
  397. else
  398. Serial.println("You did not provide a valid argument");
  399. }
  400. }
  401. #endif
  402. }
  403. // LED command
  404. else if (cmd_args.get(0) == LED_CMD) {
  405. int hex_arg = this->argSearch(&cmd_args, "-s");
  406. int pat_arg = this->argSearch(&cmd_args, "-p");
  407. #ifdef PIN
  408. if (hex_arg != -1) {
  409. String hexstring = cmd_args.get(hex_arg + 1);
  410. int number = (int)strtol(&hexstring[1], NULL, 16);
  411. int r = number >> 16;
  412. int g = number >> 8 & 0xFF;
  413. int b = number & 0xFF;
  414. //Serial.println(r);
  415. //Serial.println(g);
  416. //Serial.println(b);
  417. led_obj.setColor(r, g, b);
  418. led_obj.setMode(MODE_CUSTOM);
  419. }
  420. else if (pat_arg != -1) {
  421. String pat_name = cmd_args.get(pat_arg + 1);
  422. pat_name.toLowerCase();
  423. if (pat_name == "rainbow") {
  424. led_obj.setMode(MODE_RAINBOW);
  425. }
  426. }
  427. #else
  428. Serial.println("This hardware does not support neopixel");
  429. #endif
  430. }
  431. // ls command
  432. else if (cmd_args.get(0) == LS_CMD) {
  433. #ifdef HAS_SD
  434. if (cmd_args.size() > 1)
  435. sd_obj.listDir(cmd_args.get(1));
  436. else
  437. Serial.println("You did not provide a dir to list");
  438. #else
  439. Serial.println("SD support disabled, cannot use command");
  440. return;
  441. #endif
  442. }
  443. // Channel command
  444. else if (cmd_args.get(0) == CH_CMD) {
  445. // Search for channel set arg
  446. int ch_set = this->argSearch(&cmd_args, "-s");
  447. if (cmd_args.size() == 1) {
  448. Serial.println("Current channel: " + (String)wifi_scan_obj.set_channel);
  449. }
  450. else if (ch_set != -1) {
  451. wifi_scan_obj.set_channel = cmd_args.get(ch_set + 1).toInt();
  452. wifi_scan_obj.changeChannel();
  453. Serial.println("Set channel: " + (String)wifi_scan_obj.set_channel);
  454. }
  455. }
  456. else if (cmd_args.get(0) == CAM_FLASHLIGHT) {
  457. pinMode(4, OUTPUT);
  458. digitalWrite(4, !digitalRead(4));
  459. }
  460. else if (cmd_args.get(0) == CAM_PHOTO) {
  461. Serial.println("Camera capture start");
  462. // Initialize the camera
  463. configESPCamera(); Serial.println("Camera OK!");
  464. // Initialize the MicroSD
  465. Serial.print("Initializing the MicroSD card module... ");
  466. //initMicroSDCard();
  467. int i = 0;
  468. while (true)
  469. {
  470. String path = "/photo_" + String(i++) + ".jpg";
  471. if (!SD_MMC.exists(path.c_str()))
  472. {
  473. takeNewPhoto(path, true);
  474. break;
  475. }
  476. }
  477. Serial.println("Camera capture finish");
  478. }
  479. // Clear APs
  480. else if (cmd_args.get(0) == CLEARAP_CMD) {
  481. int ap_sw = this->argSearch(&cmd_args, "-a"); // APs
  482. int ss_sw = this->argSearch(&cmd_args, "-s"); // SSIDs
  483. int cl_sw = this->argSearch(&cmd_args, "-c"); // Stations
  484. if (ap_sw != -1) {
  485. #ifdef HAS_SCREEN
  486. menu_function_obj.changeMenu(&menu_function_obj.clearAPsMenu);
  487. #endif
  488. wifi_scan_obj.RunClearAPs();
  489. }
  490. if (ss_sw != -1) {
  491. #ifdef HAS_SCREEN
  492. menu_function_obj.changeMenu(&menu_function_obj.clearSSIDsMenu);
  493. #endif
  494. wifi_scan_obj.RunClearSSIDs();
  495. }
  496. if (cl_sw != -1) {
  497. #ifdef HAS_SCREEN
  498. menu_function_obj.changeMenu(&menu_function_obj.clearAPsMenu);
  499. #endif
  500. wifi_scan_obj.RunClearStations();
  501. }
  502. }
  503. else if (cmd_args.get(0) == SETTINGS_CMD) {
  504. int ss_sw = this->argSearch(&cmd_args, "-s"); // Set setting
  505. int re_sw = this->argSearch(&cmd_args, "-r"); // Reset setting
  506. int en_sw = this->argSearch(&cmd_args, "enable"); // enable setting
  507. int da_sw = this->argSearch(&cmd_args, "disable"); // disable setting
  508. if (re_sw != -1) {
  509. settings_obj.createDefaultSettings(SPIFFS);
  510. return;
  511. }
  512. if (ss_sw == -1) {
  513. settings_obj.printJsonSettings(settings_obj.getSettingsString());
  514. }
  515. else {
  516. bool result = false;
  517. String setting_name = cmd_args.get(ss_sw + 1);
  518. if (en_sw != -1)
  519. result = settings_obj.saveSetting<bool>(setting_name, true);
  520. else if (da_sw != -1)
  521. result = settings_obj.saveSetting<bool>(setting_name, false);
  522. else {
  523. Serial.println("You did not properly enable/disable this setting.");
  524. return;
  525. }
  526. if (!result) {
  527. Serial.println("Could not successfully update setting \"" + setting_name + "\"");
  528. return;
  529. }
  530. }
  531. }
  532. else if (cmd_args.get(0) == REBOOT_CMD) {
  533. Serial.println("Rebooting...");
  534. ESP.restart();
  535. }
  536. //// WiFi/Bluetooth Scan/Attack commands
  537. if (!wifi_scan_obj.scanning()) {
  538. // Signal strength scan
  539. if (cmd_args.get(0) == SIGSTREN_CMD) {
  540. Serial.println("Starting Signal Strength Scan. Stop with " + (String)STOPSCAN_CMD);
  541. #ifdef HAS_SCREEN
  542. display_obj.clearScreen();
  543. menu_function_obj.drawStatusBar();
  544. #endif
  545. wifi_scan_obj.StartScan(WIFI_SCAN_SIG_STREN, TFT_MAGENTA);
  546. }
  547. // Wardrive
  548. else if (cmd_args.get(0) == WARDRIVE_CMD) {
  549. #ifdef HAS_GPS
  550. if (gps_obj.getGpsModuleStatus()) {
  551. Serial.println("Starting Wardrive. Stop with " + (String)STOPSCAN_CMD);
  552. #ifdef HAS_SCREEN
  553. display_obj.clearScreen();
  554. menu_function_obj.drawStatusBar();
  555. #endif
  556. wifi_scan_obj.StartScan(WIFI_SCAN_WAR_DRIVE, TFT_GREEN);
  557. }
  558. #endif
  559. }
  560. // AP Scan
  561. else if (cmd_args.get(0) == EVIL_PORTAL_CMD) {
  562. int cmd_sw = this->argSearch(&cmd_args, "-c");
  563. if (cmd_sw != -1) {
  564. String et_command = cmd_args.get(cmd_sw + 1);
  565. if (et_command == "start") {
  566. Serial.println("Starting Evil Portal. Stop with " + (String)STOPSCAN_CMD);
  567. #ifdef HAS_SCREEN
  568. display_obj.clearScreen();
  569. menu_function_obj.drawStatusBar();
  570. #endif
  571. wifi_scan_obj.StartScan(WIFI_SCAN_EVIL_PORTAL, TFT_MAGENTA);
  572. }
  573. else if (et_command == "reset") {
  574. }
  575. else if (et_command == "ack") {
  576. }
  577. else if (et_command == "sethtml") {
  578. }
  579. else if (et_command == "setap") {
  580. }
  581. }
  582. }
  583. else if (cmd_args.get(0) == SCANAP_CMD) {
  584. int full_sw = -1;
  585. #ifdef HAS_SCREEN
  586. display_obj.clearScreen();
  587. menu_function_obj.drawStatusBar();
  588. #endif
  589. if (full_sw == -1) {
  590. Serial.println("Starting AP scan. Stop with " + (String)STOPSCAN_CMD);
  591. wifi_scan_obj.StartScan(WIFI_SCAN_TARGET_AP, TFT_MAGENTA);
  592. }
  593. else {
  594. Serial.println("Starting Full AP scan. Stop with " + (String)STOPSCAN_CMD);
  595. wifi_scan_obj.StartScan(WIFI_SCAN_TARGET_AP_FULL, TFT_MAGENTA);
  596. }
  597. }
  598. // Raw sniff
  599. else if (cmd_args.get(0) == SNIFF_RAW_CMD) {
  600. Serial.println("Starting Raw sniff. Stop with " + (String)STOPSCAN_CMD);
  601. #ifdef HAS_SCREEN
  602. display_obj.clearScreen();
  603. menu_function_obj.drawStatusBar();
  604. #endif
  605. wifi_scan_obj.StartScan(WIFI_SCAN_RAW_CAPTURE, TFT_WHITE);
  606. }
  607. // Scan stations
  608. else if (cmd_args.get(0) == SCANSTA_CMD) {
  609. if(access_points->size() < 1)
  610. Serial.println("The AP list is empty. Scan APs first with " + (String)SCANAP_CMD);
  611. Serial.println("Starting Station scan. Stop with " + (String)STOPSCAN_CMD);
  612. #ifdef HAS_SCREEN
  613. display_obj.clearScreen();
  614. menu_function_obj.drawStatusBar();
  615. #endif
  616. wifi_scan_obj.StartScan(WIFI_SCAN_STATION, TFT_ORANGE);
  617. }
  618. // Beacon sniff
  619. else if (cmd_args.get(0) == SNIFF_BEACON_CMD) {
  620. Serial.println("Starting Beacon sniff. Stop with " + (String)STOPSCAN_CMD);
  621. #ifdef HAS_SCREEN
  622. display_obj.clearScreen();
  623. menu_function_obj.drawStatusBar();
  624. #endif
  625. wifi_scan_obj.StartScan(WIFI_SCAN_AP, TFT_MAGENTA);
  626. }
  627. // Probe sniff
  628. else if (cmd_args.get(0) == SNIFF_PROBE_CMD) {
  629. Serial.println("Starting Probe sniff. Stop with " + (String)STOPSCAN_CMD);
  630. #ifdef HAS_SCREEN
  631. display_obj.clearScreen();
  632. menu_function_obj.drawStatusBar();
  633. #endif
  634. wifi_scan_obj.StartScan(WIFI_SCAN_PROBE, TFT_MAGENTA);
  635. }
  636. // Deauth sniff
  637. else if (cmd_args.get(0) == SNIFF_DEAUTH_CMD) {
  638. Serial.println("Starting Deauth sniff. Stop with " + (String)STOPSCAN_CMD);
  639. #ifdef HAS_SCREEN
  640. display_obj.clearScreen();
  641. menu_function_obj.drawStatusBar();
  642. #endif
  643. wifi_scan_obj.StartScan(WIFI_SCAN_DEAUTH, TFT_RED);
  644. }
  645. // Pwn sniff
  646. else if (cmd_args.get(0) == SNIFF_PWN_CMD) {
  647. Serial.println("Starting Pwnagotchi sniff. Stop with " + (String)STOPSCAN_CMD);
  648. #ifdef HAS_SCREEN
  649. display_obj.clearScreen();
  650. menu_function_obj.drawStatusBar();
  651. #endif
  652. wifi_scan_obj.StartScan(WIFI_SCAN_PWN, TFT_MAGENTA);
  653. }
  654. // Espressif sniff
  655. else if (cmd_args.get(0) == SNIFF_ESP_CMD) {
  656. Serial.println("Starting Espressif device sniff. Stop with " + (String)STOPSCAN_CMD);
  657. #ifdef HAS_SCREEN
  658. display_obj.clearScreen();
  659. menu_function_obj.drawStatusBar();
  660. #endif
  661. wifi_scan_obj.StartScan(WIFI_SCAN_ESPRESSIF, TFT_MAGENTA);
  662. }
  663. // PMKID sniff
  664. else if (cmd_args.get(0) == SNIFF_PMKID_CMD) {
  665. int ch_sw = this->argSearch(&cmd_args, "-c");
  666. int d_sw = this->argSearch(&cmd_args, "-d"); // Deauth for pmkid
  667. int l_sw = this->argSearch(&cmd_args, "-l"); // Only run on list
  668. if (l_sw != -1) {
  669. if (!this->apSelected()) {
  670. Serial.println("You don't have any targets selected. Use " + (String)SEL_CMD);
  671. return;
  672. }
  673. }
  674. if (ch_sw != -1) {
  675. wifi_scan_obj.set_channel = cmd_args.get(ch_sw + 1).toInt();
  676. wifi_scan_obj.changeChannel();
  677. Serial.println("Set channel: " + (String)wifi_scan_obj.set_channel);
  678. }
  679. if (d_sw == -1) {
  680. Serial.println("Starting PMKID sniff on channel " + (String)wifi_scan_obj.set_channel + ". Stop with " + (String)STOPSCAN_CMD);
  681. wifi_scan_obj.StartScan(WIFI_SCAN_EAPOL, TFT_VIOLET);
  682. }
  683. else if ((d_sw != -1) && (l_sw != -1)) {
  684. Serial.println("Starting TARGETED PMKID sniff with deauthentication on channel " + (String)wifi_scan_obj.set_channel + ". Stop with " + (String)STOPSCAN_CMD);
  685. wifi_scan_obj.StartScan(WIFI_SCAN_ACTIVE_LIST_EAPOL, TFT_VIOLET);
  686. }
  687. else {
  688. Serial.println("Starting PMKID sniff with deauthentication on channel " + (String)wifi_scan_obj.set_channel + ". Stop with " + (String)STOPSCAN_CMD);
  689. wifi_scan_obj.StartScan(WIFI_SCAN_ACTIVE_EAPOL, TFT_VIOLET);
  690. }
  691. }
  692. //// WiFi attack commands
  693. // attack
  694. if (cmd_args.get(0) == ATTACK_CMD) {
  695. int attack_type_switch = this->argSearch(&cmd_args, "-t"); // Required
  696. int list_beacon_sw = this->argSearch(&cmd_args, "-l");
  697. int rand_beacon_sw = this->argSearch(&cmd_args, "-r");
  698. int ap_beacon_sw = this->argSearch(&cmd_args, "-a");
  699. int src_addr_sw = this->argSearch(&cmd_args, "-s");
  700. int dst_addr_sw = this->argSearch(&cmd_args, "-d");
  701. int targ_sw = this->argSearch(&cmd_args, "-c");
  702. if (attack_type_switch == -1) {
  703. Serial.println("You must specify an attack type");
  704. return;
  705. }
  706. else {
  707. String attack_type = cmd_args.get(attack_type_switch + 1);
  708. // Branch on attack type
  709. // Deauth
  710. if (attack_type == ATTACK_TYPE_DEAUTH) {
  711. // Default to broadcast
  712. if ((dst_addr_sw == -1) && (targ_sw == -1)) {
  713. Serial.println("Sending to broadcast...");
  714. wifi_scan_obj.dst_mac = "ff:ff:ff:ff:ff:ff";
  715. }
  716. // Dest addr specified
  717. else if (dst_addr_sw != -1) {
  718. wifi_scan_obj.dst_mac = cmd_args.get(dst_addr_sw + 1);
  719. Serial.println("Sending to " + wifi_scan_obj.dst_mac + "...");
  720. }
  721. // Station list specified
  722. else if (targ_sw != -1)
  723. Serial.println("Sending to Station list");
  724. // Source addr not specified
  725. if (src_addr_sw == -1) {
  726. if (!this->apSelected()) {
  727. Serial.println("You don't have any targets selected. Use " + (String)SEL_CMD);
  728. return;
  729. }
  730. #ifdef HAS_SCREEN
  731. display_obj.clearScreen();
  732. menu_function_obj.drawStatusBar();
  733. #endif
  734. Serial.println("Starting Deauthentication attack. Stop with " + (String)STOPSCAN_CMD);
  735. // Station list not specified
  736. if (targ_sw == -1)
  737. wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH, TFT_RED);
  738. // Station list specified
  739. else
  740. wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH_TARGETED, TFT_ORANGE);
  741. }
  742. // Source addr specified
  743. else {
  744. String src_mac_str = cmd_args.get(src_addr_sw + 1);
  745. sscanf(src_mac_str.c_str(), "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx",
  746. &wifi_scan_obj.src_mac[0], &wifi_scan_obj.src_mac[1], &wifi_scan_obj.src_mac[2], &wifi_scan_obj.src_mac[3], &wifi_scan_obj.src_mac[4], &wifi_scan_obj.src_mac[5]);
  747. #ifdef HAS_SCREEN
  748. display_obj.clearScreen();
  749. menu_function_obj.drawStatusBar();
  750. #endif
  751. Serial.println("Starting Manual Deauthentication attack. Stop with " + (String)STOPSCAN_CMD);
  752. wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH_MANUAL, TFT_RED);
  753. }
  754. }
  755. // Beacon
  756. else if (attack_type == ATTACK_TYPE_BEACON) {
  757. // spam by list
  758. if (list_beacon_sw != -1) {
  759. if (!this->hasSSIDs()) {
  760. Serial.println("You don't have any SSIDs in your list. Use " + (String)SSID_CMD);
  761. return;
  762. }
  763. #ifdef HAS_SCREEN
  764. display_obj.clearScreen();
  765. menu_function_obj.drawStatusBar();
  766. #endif
  767. Serial.println("Starting Beacon list spam. Stop with " + (String)STOPSCAN_CMD);
  768. wifi_scan_obj.StartScan(WIFI_ATTACK_BEACON_LIST, TFT_RED);
  769. }
  770. // spam with random
  771. else if (rand_beacon_sw != -1) {
  772. #ifdef HAS_SCREEN
  773. display_obj.clearScreen();
  774. menu_function_obj.drawStatusBar();
  775. #endif
  776. Serial.println("Starting random Beacon spam. Stop with " + (String)STOPSCAN_CMD);
  777. wifi_scan_obj.StartScan(WIFI_ATTACK_BEACON_SPAM, TFT_ORANGE);
  778. }
  779. // Spam from AP list
  780. else if (ap_beacon_sw != -1) {
  781. if (!this->apSelected()) {
  782. Serial.println("You don't have any targets selected. Use " + (String)SEL_CMD);
  783. return;
  784. }
  785. #ifdef HAS_SCREEN
  786. display_obj.clearScreen();
  787. menu_function_obj.drawStatusBar();
  788. #endif
  789. Serial.println("Starting Targeted AP Beacon spam. Stop with " + (String)STOPSCAN_CMD);
  790. wifi_scan_obj.StartScan(WIFI_ATTACK_AP_SPAM, TFT_MAGENTA);
  791. }
  792. else {
  793. Serial.println("You did not specify a beacon attack type");
  794. }
  795. }
  796. else if (attack_type == ATTACK_TYPE_PROBE) {
  797. if (!this->apSelected()) {
  798. Serial.println("You don't have any targets selected. Use " + (String)SEL_CMD);
  799. return;
  800. }
  801. Serial.println("Starting Probe spam. Stop with " + (String)STOPSCAN_CMD);
  802. #ifdef HAS_SCREEN
  803. display_obj.clearScreen();
  804. menu_function_obj.drawStatusBar();
  805. #endif
  806. wifi_scan_obj.StartScan(WIFI_ATTACK_AUTH, TFT_RED);
  807. }
  808. else if (attack_type == ATTACK_TYPE_RR) {
  809. Serial.println("Starting Rick Roll Beacon spam. Stop with " + (String)STOPSCAN_CMD);
  810. #ifdef HAS_SCREEN
  811. display_obj.clearScreen();
  812. menu_function_obj.drawStatusBar();
  813. #endif
  814. wifi_scan_obj.StartScan(WIFI_ATTACK_RICK_ROLL, TFT_YELLOW);
  815. }
  816. else {
  817. Serial.println("Attack type not properly defined");
  818. return;
  819. }
  820. }
  821. }
  822. //// Bluetooth scan/attack commands
  823. // Bluetooth scan
  824. if (cmd_args.get(0) == BT_SNIFF_CMD) {
  825. #ifdef HAS_BT
  826. Serial.println("Starting Bluetooth scan. Stop with " + (String)STOPSCAN_CMD);
  827. #ifdef HAS_SCREEN
  828. display_obj.clearScreen();
  829. menu_function_obj.drawStatusBar();
  830. #endif
  831. wifi_scan_obj.StartScan(BT_SCAN_ALL, TFT_GREEN);
  832. #else
  833. Serial.println("Bluetooth not supported");
  834. #endif
  835. }
  836. // Bluetooth CC Skimmer scan
  837. else if (cmd_args.get(0) == BT_SKIM_CMD) {
  838. #ifdef HAS_BT
  839. Serial.println("Starting Bluetooth CC Skimmer scan. Stop with " + (String)STOPSCAN_CMD);
  840. #ifdef HAS_SCREEN
  841. display_obj.clearScreen();
  842. menu_function_obj.drawStatusBar();
  843. #endif
  844. wifi_scan_obj.StartScan(BT_SCAN_SKIMMERS, TFT_MAGENTA);
  845. #else
  846. Serial.println("Bluetooth not supported");
  847. #endif
  848. }
  849. // Update command
  850. if (cmd_args.get(0) == UPDATE_CMD) {
  851. //int w_sw = this->argSearch(&cmd_args, "-w"); // Web update
  852. int sd_sw = this->argSearch(&cmd_args, "-s"); // SD Update
  853. // Update via OTA
  854. //if (w_sw != -1) {
  855. // Serial.println("Starting Marauder OTA Update. Stop with " + (String)STOPSCAN_CMD);
  856. // wifi_scan_obj.currentScanMode = OTA_UPDATE;
  857. //#ifdef HAS_SCREEN
  858. // menu_function_obj.changeMenu(menu_function_obj.updateMenu);
  859. //#endif
  860. // web_obj.setupOTAupdate();
  861. //}
  862. // Update via SD
  863. if (sd_sw != -1) {
  864. #ifdef HAS_SD
  865. #ifndef WRITE_PACKETS_SERIAL
  866. if (!sd_obj.supported) {
  867. Serial.println("SD card is not connected. Cannot perform SD Update");
  868. return;
  869. }
  870. wifi_scan_obj.currentScanMode = OTA_UPDATE;
  871. sd_obj.runUpdate();
  872. #else
  873. Serial.println("SD card not initialized. Cannot perform SD Update");
  874. #endif
  875. #else
  876. Serial.println("SD card support disabled. Cannot perform SD Update");
  877. return;
  878. #endif
  879. }
  880. }
  881. }
  882. int count_selected = 0;
  883. //// WiFi aux commands
  884. // List access points
  885. if (cmd_args.get(0) == LIST_AP_CMD) {
  886. int ap_sw = this->argSearch(&cmd_args, "-a");
  887. int ss_sw = this->argSearch(&cmd_args, "-s");
  888. int cl_sw = this->argSearch(&cmd_args, "-c");
  889. // List APs
  890. if (ap_sw != -1) {
  891. for (int i = 0; i < access_points->size(); i++) {
  892. if (access_points->get(i).selected) {
  893. Serial.println("[" + (String)i + "][CH:" + (String)access_points->get(i).channel + "] " + access_points->get(i).essid + " " + (String)access_points->get(i).rssi + " (selected)");
  894. count_selected += 1;
  895. }
  896. else
  897. Serial.println("[" + (String)i + "][CH:" + (String)access_points->get(i).channel + "] " + access_points->get(i).essid + " " + (String)access_points->get(i).rssi);
  898. }
  899. this->showCounts(count_selected);
  900. }
  901. // List SSIDs
  902. else if (ss_sw != -1) {
  903. for (int i = 0; i < ssids->size(); i++) {
  904. if (ssids->get(i).selected) {
  905. Serial.println("[" + (String)i + "] " + ssids->get(i).essid + " (selected)");
  906. count_selected += 1;
  907. }
  908. else
  909. Serial.println("[" + (String)i + "] " + ssids->get(i).essid);
  910. }
  911. this->showCounts(count_selected);
  912. }
  913. // List Stations
  914. else if (cl_sw != -1) {
  915. char sta_mac[] = "00:00:00:00:00:00";
  916. for (int x = 0; x < access_points->size(); x++) {
  917. Serial.println("[" + (String)x + "] " + access_points->get(x).essid + " " + (String)access_points->get(x).rssi + ":");
  918. for (int i = 0; i < access_points->get(x).stations->size(); i++) {
  919. wifi_scan_obj.getMAC(sta_mac, stations->get(access_points->get(x).stations->get(i)).mac, 0);
  920. if (stations->get(access_points->get(x).stations->get(i)).selected) {
  921. Serial.print(" [" + (String)access_points->get(x).stations->get(i) + "] ");
  922. Serial.print(sta_mac);
  923. Serial.println(" (selected)");
  924. count_selected += 1;
  925. }
  926. else {
  927. Serial.print(" [" + (String)access_points->get(x).stations->get(i) + "] ");
  928. Serial.println(sta_mac);
  929. }
  930. }
  931. }
  932. this->showCounts(count_selected);
  933. }
  934. else {
  935. Serial.println("You did not specify which list to show");
  936. return;
  937. }
  938. }
  939. // Select access points or stations
  940. else if (cmd_args.get(0) == SEL_CMD) {
  941. // Get switches
  942. int ap_sw = this->argSearch(&cmd_args, "-a");
  943. int ss_sw = this->argSearch(&cmd_args, "-s");
  944. int cl_sw = this->argSearch(&cmd_args, "-c");
  945. int filter_sw = this->argSearch(&cmd_args, "-f");
  946. count_selected = 0;
  947. int count_unselected = 0;
  948. // select Access points
  949. if (ap_sw != -1) {
  950. // If the filters parameter was specified
  951. if (filter_sw != -1) {
  952. String filter_ap = cmd_args.get(filter_sw + 1);
  953. this->filterAccessPoints(filter_ap);
  954. } else {
  955. // Get list of indices
  956. LinkedList<String> ap_index = this->parseCommand(cmd_args.get(ap_sw + 1), ",");
  957. // Select ALL APs
  958. if (cmd_args.get(ap_sw + 1) == "all") {
  959. for (int i = 0; i < access_points->size(); i++) {
  960. if (access_points->get(i).selected) {
  961. // Unselect "selected" ap
  962. AccessPoint new_ap = access_points->get(i);
  963. new_ap.selected = false;
  964. access_points->set(i, new_ap);
  965. count_unselected += 1;
  966. }
  967. else {
  968. // Select "unselected" ap
  969. AccessPoint new_ap = access_points->get(i);
  970. new_ap.selected = true;
  971. access_points->set(i, new_ap);
  972. count_selected += 1;
  973. }
  974. }
  975. this->showCounts(count_selected, count_unselected);
  976. }
  977. // Select specific APs
  978. else {
  979. // Mark APs as selected
  980. for (int i = 0; i < ap_index.size(); i++) {
  981. int index = ap_index.get(i).toInt();
  982. if (!this->inRange(access_points->size(), index)) {
  983. Serial.println("Index not in range: " + (String)index);
  984. continue;
  985. }
  986. if (access_points->get(index).selected) {
  987. // Unselect "selected" ap
  988. AccessPoint new_ap = access_points->get(index);
  989. new_ap.selected = false;
  990. access_points->set(index, new_ap);
  991. count_unselected += 1;
  992. }
  993. else {
  994. // Select "unselected" ap
  995. AccessPoint new_ap = access_points->get(index);
  996. new_ap.selected = true;
  997. access_points->set(index, new_ap);
  998. count_selected += 1;
  999. }
  1000. }
  1001. this->showCounts(count_selected, count_unselected);
  1002. }
  1003. }
  1004. }
  1005. else if (cl_sw != -1) {
  1006. LinkedList<String> sta_index = this->parseCommand(cmd_args.get(cl_sw + 1), ",");
  1007. // Select all Stations
  1008. if (cmd_args.get(cl_sw + 1) == "all") {
  1009. for (int i = 0; i < stations->size(); i++) {
  1010. if (stations->get(i).selected) {
  1011. // Unselect "selected" ap
  1012. Station new_sta = stations->get(i);
  1013. new_sta.selected = false;
  1014. stations->set(i, new_sta);
  1015. count_unselected += 1;
  1016. }
  1017. else {
  1018. // Select "unselected" ap
  1019. Station new_sta = stations->get(i);
  1020. new_sta.selected = true;
  1021. stations->set(i, new_sta);
  1022. count_selected += 1;
  1023. }
  1024. }
  1025. this->showCounts(count_selected, count_unselected);
  1026. }
  1027. // Select specific Stations
  1028. else {
  1029. // Mark Stations as selected
  1030. for (int i = 0; i < sta_index.size(); i++) {
  1031. int index = sta_index.get(i).toInt();
  1032. if (!this->inRange(stations->size(), index)) {
  1033. Serial.println("Index not in range: " + (String)index);
  1034. continue;
  1035. }
  1036. if (stations->get(index).selected) {
  1037. // Unselect "selected" ap
  1038. Station new_sta = stations->get(index);
  1039. new_sta.selected = false;
  1040. stations->set(index, new_sta);
  1041. count_unselected += 1;
  1042. }
  1043. else {
  1044. // Select "unselected" ap
  1045. Station new_sta = stations->get(index);
  1046. new_sta.selected = true;
  1047. stations->set(index, new_sta);
  1048. count_selected += 1;
  1049. }
  1050. }
  1051. this->showCounts(count_selected, count_unselected);
  1052. }
  1053. }
  1054. // select ssids
  1055. else if (ss_sw != -1) {
  1056. // Get list of indices
  1057. LinkedList<String> ss_index = this->parseCommand(cmd_args.get(ss_sw + 1), ",");
  1058. // Mark APs as selected
  1059. for (int i = 0; i < ss_index.size(); i++) {
  1060. int index = ss_index.get(i).toInt();
  1061. if (!this->inRange(ssids->size(), index)) {
  1062. Serial.println("Index not in range: " + (String)index);
  1063. continue;
  1064. }
  1065. if (ssids->get(index).selected) {
  1066. // Unselect "selected" ap
  1067. ssid new_ssid = ssids->get(index);
  1068. new_ssid.selected = false;
  1069. ssids->set(index, new_ssid);
  1070. count_unselected += 1;
  1071. }
  1072. else {
  1073. // Select "unselected" ap
  1074. ssid new_ssid = ssids->get(index);
  1075. new_ssid.selected = true;
  1076. ssids->set(index, new_ssid);
  1077. count_selected += 1;
  1078. }
  1079. }
  1080. this->showCounts(count_selected, count_unselected);
  1081. }
  1082. else {
  1083. Serial.println("You did not specify which list to select from");
  1084. return;
  1085. }
  1086. }
  1087. // SSID stuff
  1088. else if (cmd_args.get(0) == SSID_CMD) {
  1089. int add_sw = this->argSearch(&cmd_args, "-a");
  1090. int gen_sw = this->argSearch(&cmd_args, "-g");
  1091. int spc_sw = this->argSearch(&cmd_args, "-n");
  1092. int rem_sw = this->argSearch(&cmd_args, "-r");
  1093. // Add ssid
  1094. if (add_sw != -1) {
  1095. // Generate random
  1096. if (gen_sw != -1) {
  1097. int gen_count = cmd_args.get(gen_sw + 1).toInt();
  1098. wifi_scan_obj.generateSSIDs(gen_count);
  1099. }
  1100. // Add specific
  1101. else if (spc_sw != -1) {
  1102. String essid = cmd_args.get(spc_sw + 1);
  1103. wifi_scan_obj.addSSID(essid);
  1104. }
  1105. else {
  1106. Serial.println("You did not specify how to add SSIDs");
  1107. }
  1108. }
  1109. // Remove SSID
  1110. else if (rem_sw != -1) {
  1111. int index = cmd_args.get(rem_sw + 1).toInt();
  1112. if (!this->inRange(ssids->size(), index)) {
  1113. Serial.println("Index not in range: " + (String)index);
  1114. return;
  1115. }
  1116. ssids->remove(index);
  1117. }
  1118. else {
  1119. Serial.println("You did not specify whether to add or remove SSIDs");
  1120. return;
  1121. }
  1122. }
  1123. // Join WiFi
  1124. /*else if (cmd_args.get(0) == JOINWIFI_CMD) {
  1125. int n_sw = this->argSearch(&cmd_args, "-n"); // name
  1126. int a_sw = this->argSearch(&cmd_args, "-a"); // access point
  1127. int s_sw = this->argSearch(&cmd_args, "-s"); // ssid
  1128. int p_sw = this->argSearch(&cmd_args, "-p");
  1129. String essid = "";
  1130. String pwx = "";
  1131. if (s_sw != -1) {
  1132. int index = cmd_args.get(s_sw + 1).toInt();
  1133. if (!this->inRange(ssids->size(), index)) {
  1134. Serial.println("Index not in range: " + (String)index);
  1135. return;
  1136. }
  1137. essid = ssids->get(index).essid;
  1138. } else if (a_sw != -1) {
  1139. int index = cmd_args.get(a_sw + 1).toInt();
  1140. if (!this->inRange(access_points->size(), index)) {
  1141. Serial.println("Index not in range: " + (String)index);
  1142. return;
  1143. }
  1144. essid = access_points->get(index).essid;
  1145. } else if (n_sw != -1) {
  1146. essid = cmd_args.get(n_sw + 1);
  1147. } else {
  1148. Serial.println("You must specify an access point or ssid");
  1149. return;
  1150. }
  1151. if (p_sw != -1) {
  1152. pwx = cmd_args.get(p_sw + 1);
  1153. }
  1154. Serial.println("Attempting to join WiFi with ssid " + (String)essid);
  1155. wifi_scan_obj.joinWiFi(essid, pwx);
  1156. }*/
  1157. }