ESP8266 local WiFi scanner

[IoT] ESP8266 local WiFi scanner

The Challenge

Build a small WiFi scanner, which can run of a battery and display the found networks. Overtime it accumulates the max number of seen networks and displays a percentage of secure and insecure networks.

The Solution

We used an Adafruit Huzzad ESP8266 board and an Adafruit NeoPixel Ring with 16 RGB-LEDs. And some code and two AA-batteries and we are good to go.

Update: There are two more examples using the ESP8266 for WiFi scanning:

  1. RSSI mapper for muenchen.freifunk.net
  2. WiFiScanner

Adafruit NeoPixel 16 RGB-LED ring

Adafruit Huzzah ESP8266 board

More information via a serial console

Mobile

Scan for networks, where ever you go.

Built with Arduino IDE

Easy coding via the Arduino IDE. We used a Linux based laptop to upload the compiled code.

Ratio of secure and insecure networks

Discover the more about your area.

The code:

#include <ESP8266WiFi.h>
#include <Adafruit_NeoPixel.h>

#define stripSize 16
#define stripPin 14
Adafruit_NeoPixel strip = Adafruit_NeoPixel( stripSize, stripPin, NEO_GRB + NEO_KHZ800 );

uint32_t red;
uint32_t blue;
uint32_t black;
uint32_t white;
uint32_t green;
int lumocity = 1;
uint32_t maxAPs = 0;

void allColor(uint32_t c) {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
}
strip.show();
}

void printEncryptionType(int thisType) {
// read the encryption type and print out the name:
switch (thisType) {
case ENC_TYPE_WEP:
Serial.println(“WEP”);
break;
case ENC_TYPE_TKIP:
Serial.println(“WPA”);
break;
case ENC_TYPE_CCMP:
Serial.println(“WPA2”);
break;
case ENC_TYPE_NONE:
Serial.println(“None”);
break;
case ENC_TYPE_AUTO:
Serial.println(“Auto”);
break;
}
}

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);

strip.begin();
strip.show();
black = strip.Color(0, 0, 0);
red = strip.Color(pow(2, lumocity), 0, 0);
green = strip.Color(0, pow(2, lumocity), 0);
blue = strip.Color(0, 0, pow(2, lumocity));
white = strip.Color(pow(2, lumocity), pow(2, lumocity), pow(2, lumocity));
WiFi.mode(WIFI_STA);
WiFi.disconnect();
allColor(red);
delay(100);
Serial.println(“Setup done”);
allColor(black);
}

void loop() {
// put your main code here, to run repeatedly:
int n = WiFi.scanNetworks();
if ( n == 0 ) {
// Serial.println(“No networks found”);
allColor(black);
} else {
int secure = 0;
int unsecure = 0;
maxAPs = (maxAPs < n ) ? n : maxAPs;
for (int i = 0; i < n; i++) {

String ssid_scan;
int32_t rssi_scan;
uint8_t sec_scan;
uint8_t* BSSID_scan;
int32_t chan_scan;
bool hidden_scan;

WiFi.getNetworkInfo(i, ssid_scan, sec_scan, rssi_scan, BSSID_scan, chan_scan, hidden_scan);

// Print SSID and RSSI for each network found
Serial.print(“[“);
Serial.print(BSSID_scan[0], HEX);
Serial.print(“:”);
Serial.print(BSSID_scan[1], HEX);
Serial.print(“:”);
Serial.print(BSSID_scan[2], HEX);
Serial.print(“:”);
Serial.print(BSSID_scan[3], HEX);
Serial.print(“:”);
Serial.print(BSSID_scan[4], HEX);
Serial.print(“:”);
Serial.print(BSSID_scan[5], HEX);
Serial.print(“] “);
Serial.print(ssid_scan);
Serial.print(” (“);
Serial.print(rssi_scan);
Serial.print(” dBm) ch:”);
Serial.print(chan_scan);
Serial.print(” hid:”);
Serial.print(hidden_scan);
Serial.print(” crypt:”);
printEncryptionType(sec_scan);
(sec_scan == ENC_TYPE_NONE) ? unsecure++ : secure++;
}
int midpointAPs = ( stripSize * n / maxAPs );
int midpoint = ( stripSize * secure / maxAPs );
Serial.print(“# “);
Serial.print(n);
Serial.print(“/”);
Serial.print(maxAPs);
Serial.println(” networks found”);
allColor(black);
for (int i = 0; i < midpoint; i++) {
strip.setPixelColor(i, green);
}
for (int i = midpoint; i < midpointAPs; i++) {
strip.setPixelColor(i, red);
}
strip.show();
Serial.println(“#”);
}
delay(2000);
}

And more is on the console

Build with the Arduino IDE