ESP8266 WiFi skener

Zápisník experimentátora

Hierarchy: ESP8266

V tomto článku budeme skenovat WiFi sítě pomocí ESP8266. Budeme vycházet ze vzorového příkladu, který upravíme tak, aby výsledky zobrazoval na OLED displeji 0.96. V minulosti jsem napsal podobný článek o skenování WiFi, ve kterém jsem využíval desku Arduino MKR1000. Chování tohoto programu bude identické, pouze se zobrazení přizpůsobí možnostem displeje.

Použité díly

V článku jsou použity následující díly:

  • NodeMCU 0.9 (link) - Ale raději si kupujte verzi 1.0.
  • 7pin 0.96 in SPI OLED 128x64 White (link) - Podstatné je, aby byl displej označený jako SPI. Tyto jsou výrazně rychleji než I2C verze. Prodávají se ve třech barevných modifikacích. Bílé, modré a dvoubarevné. Displej snese napětí 5 V.
  • Breadboard (link) - Používám tři miniaturní, protože NodeMCU 0.9 se na normální breadboard nevejde. Tři minibreadboardy mají výhodu v tom, že máte na všechno dost místa a můžete jednotlivé piny jednoduše propojit pomocí drátů.

OLED displej

Propojení mezi piny je následující.

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

Protože toto zapojení používá softwarové ovládání SPI, použil jsem následující konstruktor z knihovny U8g2. Knihovnu si nainstalujete prostřednictvím správce knihoven.

#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é zapojení jsem testoval v IDE 1.8.2. ESP8266 je nainstalované ve verzi 2.3.0.

Program

Program jsem mírně upravil z originálního programu WifiScan.ino. Ten vypisoval nalezené sítě na sériový port. To vše jsem zachoval, pouze jsem doplnil OLED displej a doplnil jsem lepší rozlišení šifrování. Kód na rozeznání šifrování je identický s verzí programu pro MKR1000. Kompletní verzi kódu naleznete na GitHub.

Ve funkci setup se inicializuje grafika pro OLED displej, na displej se vypíše informace o programu a nastaví se 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");
}

Funkce messageBox slouží k pohodlnější zobrazení informačních textů na sériový port a displej.

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

Ve funkci loop se periodický skenuje seznam přístupových bodů WiFi a postupně se zobrazují na displeji. Displej má rozlišení 128x64, proto můžeme používat font s větším rozlišením. Můžete si porovnat tento displej s displejem Nokia 5110, který jsem použil v programu pro 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 se nachází na GitHub.

Video

Video sa nachází na YouTube.


11.07.2017


Menu