esp8266_deauther/esp8266_deauther/APScan.cpp

315 lines
8.4 KiB
C++

#include "APScan.h"
APScan::APScan() {
}
bool APScan::start() {
if (debug) {
Serial.println("starting AP scan...");
Serial.println("MAC - Ch - RSSI - Encrypt. - SSID - Hidden");// - Vendor");
}
aps._clear();
results = 0;
for (int i = 0; i < maxAPScanResults; i++){
selected[i] = false;
String("").toCharArray(names[i], 33);
}
results = WiFi.scanNetworks(false, settings.apScanHidden); // lets scanNetworks return hidden APs. (async = false & show_hidden = true)
if(results > maxAPScanResults) results = maxAPScanResults;
if (debug) Serial.println("Scan results: "+(String)results);
for (int i = 0; i < results && i < maxAPScanResults; i++) {
Mac _ap;
_ap.set(WiFi.BSSID(i)[0], WiFi.BSSID(i)[1], WiFi.BSSID(i)[2], WiFi.BSSID(i)[3], WiFi.BSSID(i)[4], WiFi.BSSID(i)[5]);
aps.add(_ap);
channels[i] = WiFi.channel(i);
rssi[i] = WiFi.RSSI(i);
encryption[i] = WiFi.encryptionType(i);
hidden[i] = WiFi.isHidden(i);
String _ssid = WiFi.SSID(i);
_ssid.toCharArray(names[i], 33);
//data_getVendor(WiFi.BSSID(i)[0],WiFi.BSSID(i)[1],WiFi.BSSID(i)[2]).toCharArray(vendors[i],9);
if (debug) {
Serial.print((String)i);
Serial.print(" - ");
_ap._print();
Serial.print(" - ");
Serial.print(channels[i]);
Serial.print(" - ");
Serial.print(rssi[i]);
Serial.print(" - ");
Serial.print(getEncryption(encryption[i]));
Serial.print(" - ");
Serial.print(names[i]);
Serial.print(" - ");
Serial.print(hidden[i]);
//Serial.print(" - ");
//Serial.print(vendors[i]);
Serial.println();
}
}
//for debugging the APScan crash bug
/*
if(debug){
for(int i=results;i<maxAPScanResults;i++){
Mac _ap;
_ap.set(random(255),random(255),random(255),random(255),random(255),random(255));
aps.add(_ap);
channels[i] = random(1,12);
rssi[i] = random(-30,-90);
encryption[i] = ENC_TYPE_NONE;
String _ssid = "test_dbeJwq3tPtJsuWtgULgShD9dxXV";
_ssid.toCharArray(names[i],33);
Serial.print((String)i);
Serial.print(" - ");
_ap._print();
Serial.print(" - ");
Serial.print(channels[i]);
Serial.print(" - ");
Serial.print(rssi[i]);
Serial.print(" - ");
Serial.print(getEncryption(encryption[i]));
Serial.print(" - ");
Serial.print(names[i]);
Serial.println();
results++;
}
}
*/
if (debug) Serial.println("scan done");
return true;
}
String APScan::getEncryption(int code) {
switch (code) {
case ENC_TYPE_NONE:
return "none";
break;
case ENC_TYPE_WEP:
return "WEP";
break;
case ENC_TYPE_TKIP:
return "WPA";
break;
case ENC_TYPE_CCMP:
return "WPA2";
break;
case ENC_TYPE_AUTO:
return "WPA*";
break;
}
return "?";
}
String APScan::getAPName(int num) {
//if (isHidden(num)) return "* Hidden SSID *";
return names[num];
}
String APScan::getAPEncryption(int num) {
return getEncryption(encryption[num]);
}
//String APScan::getAPVendor(int num){ return vendors[num]; }
String APScan::getAPMac(int num) {
return aps._get(num).toString();
}
bool APScan::isHidden(int num) {
return hidden[num];
}
int APScan::getAPRSSI(int num) {
return rssi[num];
}
int APScan::getAPChannel(int num) {
return channels[num];
}
int APScan::getFirstTarget() {
for (int i = 0; i < maxAPScanResults; i++) {
if (isSelected(i)) return i;
}
return -1;
}
String APScan::sanitizeJson(String input){
input.replace("\\","\\\\");
input.replace("\"","\\\"");
input.replace("/","\\/");
input.replace("\b","\\b");
input.replace("\f","\\f");
input.replace("\n","\\n");
input.replace("\r","\\r");
input.replace("\t","\\t");
return input;
}
void APScan::sendResults() {
if (debug) Serial.print("sending AP scan result JSON ");
size_t _size = 25; // {"aps":[ ... ],"multiAPs":"1"}
for (int i = 0; i < results && i < maxAPScanResults; i++) {
/*
_size++; // {
_size += 5; // "i": ,
_size += String(i).length();
_size += 5; // "c": ,
_size += String(getAPChannel(i)).length();
_size += 24; // "m":"d4:21:22:da:85:f3",
_size += 8; // "ss":" ",
_size += getAPName(i).length();
_size += 5; // "r": ,
_size += String(getAPRSSI(i)).length();
_size += 6; // "e": ,
_size += 6; // "se":0
_size++; // }*/
_size += 67;
_size += String(i).length();
_size += String(getAPChannel(i)).length();
_size += sanitizeJson(getAPName(i)).length();
_size += String(getAPRSSI(i)).length();
if ((i != results - 1) && (i != maxAPScanResults - 1)) _size++; // ,
}
sendHeader(200, "text/json", _size);
String json;
int bufc = 0; //bufferCounter
json = "{\"aps\":[";
sendToBuffer(json);
for (int i = 0; i < results && i < maxAPScanResults; i++) {
if (debug) Serial.print(".");
json = "{";
json += "\"i\":" + (String)i + ",";
json += "\"c\":" + (String)getAPChannel(i) + ",";
json += "\"m\":\"" + getAPMac(i) + "\",";
json += "\"ss\":\"" + sanitizeJson(getAPName(i)) + "\",";
json += "\"r\":" + (String)getAPRSSI(i) + ",";
json += "\"e\":" + (String)encryption[i] + ",";
//json += "\"v\":\""+getAPVendor(i)+"\",";
json += "\"h\":" + (String)hidden[i] + ",";
json += "\"se\":" + (String)isSelected(i);
json += "}";
if ((i != results - 1) && (i != maxAPScanResults - 1)) json += ",";
sendToBuffer(json);
}
json = "],\"multiAPs\":\"";
if(settings.multiAPs) json += "1";
else json += "0";
json += "\"}";
sendToBuffer(json);
sendBuffer();
if (debug) Serial.println("done");
}
String APScan::getResultsJSON() {
if (debug) Serial.print("getting AP scan result JSON ");
String json = "{ \"aps\":[ ";
for (int i = 0; i < results && i < maxAPScanResults; i++) {
if (debug) Serial.print(".");
json += "{";
json += "\"i\":" + (String)i + ",";
json += "\"c\":" + (String)getAPChannel(i) + ",";
json += "\"m\":\"" + getAPMac(i) + "\",";
json += "\"ss\":\"" + sanitizeJson(getAPName(i)) + "\",";
json += "\"r\":" + (String)getAPRSSI(i) + ",";
json += "\"e\":" + (String)encryption[i] + ",";
//json += "\"v\":\""+getAPVendor(i)+"\",";
json += "\"h\":" + (String)hidden[i] + ",";
json += "\"se\":" + (String)isSelected(i);
json += "}";
if ((i != results - 1) && (i != maxAPScanResults - 1)) json += ",";
}
json += "] }";
if (debug) {
Serial.println(json);
Serial.println("done");
}
return json;
}
void APScan::sort() {
if (debug) Serial.println("sorting APs ");
/* I know, it's bubble sort... but it works and that's the main thing! ;) (feel free to improve it tho) */
for (int i = 0; i < results - 1; i++) {
Serial.println("--------------");
for (int h = 0; h < results - i - 1; h++) {
if (rssi[h] < rssi[h + 1]) {
Serial.println("switched: " + (String)rssi[h] + " > " + (String)rssi[h + 1]);
int tmpA = channels[h];
channels[h] = channels[h + 1];
channels[h + 1] = tmpA;
tmpA = rssi[h];
rssi[h] = rssi[h + 1];
rssi[h + 1] = tmpA;
tmpA = encryption[h];
encryption[h] = encryption[h + 1];
encryption[h + 1] = tmpA;
String tmpB = names[h];
strncpy(names[h], names[h + 1], 32);
tmpB.toCharArray(names[h + 1], 32);
bool tmpC = hidden[h];
hidden[h] = hidden[h + 1];
hidden[h + 1] = tmpC;
tmpC = selected[h];
selected[h] = selected[h + 1];
selected[h + 1] = tmpC;
Mac tmpMac = aps._get(h);
aps.set(h,aps._get(h+1));
aps.set(h+1,tmpMac);
} else Serial.println((String)rssi[h] + " < " + (String)rssi[h + 1]);
}
}
}
void APScan::select(int num) {
if (debug) Serial.println("select " + (String)num + " - " + !selected[num]);
if(num < 0) {
if(num == -1){
if(settings.multiAPs) {
selectedSum = results;
for (int i = 0; i < results; i++) selected[i] = true;
}
} else {
selectedSum = 0;
for (int i = 0; i < maxAPScanResults; i++) selected[i] = false;
}
} else if(!settings.multiAPs) {
for (int i = 0; i < maxAPScanResults; i++){
if(i != num) selected[i] = false;
else selected[num] = !selected[num];
}
selectedSum = 1;
} else {
if(selected[num]) selectedSum--;
else selectedSum++;
selected[num] = !selected[num];
}
}
bool APScan::isSelected(int num) {
return selected[num];
}