ESP8266 WiFi skener

Zápisník experimentátora

Hierarchy: ESP8266

V tomto článku budeme skenovať WiFi siete pomocou ESP8266. Budeme vychádzať zo vzorového príkladu, ktorý upravíme tak, aby výsledky zobrazoval na OLED displeji 0.96. V minulosti som napísal podobný článok o skenovaní WiFi, v ktorom som využíval dosku Arduino MKR1000. Správanie tohto programu bude identické, iba sa zobrazenie prispôsobí možnostiam displeja.

Použité diely

V článku sú použité nasledovné diely:

  • NodeMCU 0.9 (link) - Ale radšej si kupujte verziu 1.0.
  • 7pin 0.96 in SPI OLED 128x64 White (link) - Podstatné je, aby bol displej označený ako SPI. Tieto sú výrazne rýchlejšie než I2C verzie. Predávajú sa v troch farebných modifikáciách. Bielej, modrej a dvojfarebnej. Displej znesie napätie 5 V.
  • Breadboard (link) - Používam tri miniatúrne, pretože NodeMCU 0.9 sa na normálny breadboard nezmestí. Tri minibreadboardy majú výhodu v tom, že máte na všetko dosť miesta a môžete jednotlivé piny jednoducho prepojiť pomocou drôtov.

OLED displej

Prepojenie medzi pinmi je nasledovné.

NodeMCU OLED
D0 D0
D1 D1
D2 RES
D3 DC
D4 CS
GND GND
3V3 VCC

Pretože toto zapojenie používa softvérové ovládanie SPI, použil som nasledovný konštruktor z knižnice U8g2. Knižnicu si nainštalujete prostredníctvom správcu knižníc.

#include <U8g2lib.h>

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D0, /* data=*/ D1, /* cs=*/ D4, /* dc=*/ D3, /* reset=*/ D2);

IDE

Celé zapojenie som testoval v IDE 1.8.2. ESP8266 je nainštalované vo verzii 2.3.0.

Program

Program som mierne upravil z originálnho programu WifiScan.ino. Ten vypisoval nájdené siete na sériový port. To všetko som zachoval, iba som doplnil OLED displej a doplnil som lepšie rozlíšenie šifrovania. Kód na rozoznanie šifrovania je identický s verziou programu pre MKR1000. Kompletnú verziu kódu nájdete na GitHub.

Vo funkcii setup sa inicializuje grafika pre OLED displej, na displej sa vypíše informácia o programe a nastaví sa vhodný režim práce s WiFi.

void setup() {
  u8g2.begin();
  u8g2.setFont(u8g2_font_ncenB10_tr);

  u8g2.clearBuffer();
  u8g2.drawStr(0, 12, "Arduino Slovakia");
  u8g2.drawStr(0, 26, "WiFi Scanner");
  u8g2.sendBuffer();

  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was previously connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(1000);

  Serial.println("Setup done");
}

Funkcia messageBox slúži na pohodlnejšie zobrazenie informačných textov na sériový port a displej.

void messageBox(const char *message)
{
  Serial.println(message);
  u8g2.clearBuffer();
  u8g2.drawStr(0, 12, message);
  u8g2.sendBuffer();
}

Vo funkcii loop sa periodický skenuje zoznam prístupových bodov WiFi a postupne sa zobrazujú na displeji. Displej má rozlíšenie 128x64, preto môžeme používať font s väčším rozlíšením. Môžete si porovnať tento displej s displejom Nokia 5110, ktorý som použil v programe pre Arduino MKR1000.

void loop() {
  messageBox("scan start");

  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks(false,true); // false - async, true - hidden networks
  messageBox("scan done");
  if (n == 0)
    messageBox("no networks found");
  else
  {
    sprintf(draw, "%d netw. found", n);
    messageBox(draw);
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(") ");
      Serial.println(getEncryptionType(WiFi.encryptionType(i)));

      // oled
      strcpy(ssid,WiFi.SSID(i).c_str());
      int dl=strlen(ssid);
      if(dl>2) { // hide some details
        ssid[dl-2]='?';
        ssid[dl-1]='?';
      }
      u8g2.clearBuffer();
      sprintf(draw,"Net: %d/%d",i+1,n);
      u8g2.drawStr(0, 12, draw);
      u8g2.drawStr(0, 26, ssid);
      sprintf(draw,"Sig: %d dBm",WiFi.RSSI(i));
      u8g2.drawStr(0, 40, draw);
      sprintf(draw,"Enc: %s",getEncryptionType(WiFi.encryptionType(i)));
      u8g2.drawStr(0, 54, draw);
      u8g2.sendBuffer();
     
      delay(2000);
    }
  }
  Serial.println("");
}

Zdrojový kód

Zdrojový kód sa nachádza na GitHub.

Video

Video sa nachádza na YouTube.


08.07.2017


Menu