Állomás (Station)

Példa a hozzáférési ponthoz való csatlakozásra a Gyorsindítás fejezetben látható. Ha a kapcsolat megszakad, az ESP8266 automatikusan újracsatlakozik az utoljára használt hozzáférési ponthoz, amint az ismét elérhető.

Tudunk-e ennél robusztusabb kapcsolatot biztosítani a Wi-Fi-vel?


Tartalomjegyzék


Bevezetés

A Gyors indítás példáját követve szeretnénk egy lépéssel tovább menni, és az ESP-t a következő elérhető hozzáférési ponthoz kapcsolódni, ha az aktuális kapcsolat megszakad. Ezt a funkciót az "ESP8266WiFiMulti" osztály biztosítja, és az alábbi vázlaton látható.


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;
boolean connectioWasAlive = true;

void setup()
{
  Serial.begin(115200);
  Serial.println();

  wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
  wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
  wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
}

void monitorWiFi()
{
  if (wifiMulti.run() != WL_CONNECTED)
  {
    if (connectioWasAlive == true)
    {
      connectioWasAlive = false;
      Serial.print("Looking for WiFi ");
    }
    Serial.print(".");
    delay(500);
  }
  else if (connectioWasAlive == false)
  {
    connectioWasAlive = true;
    Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
  }
}

void loop()
{
  monitorWiFi();
}


Hozzáférési pontok előkészítése

Ennek a vázlatnak a gyakorlatban történő kipróbálásához két (vagy több) hozzáférési pontra van szüksége. Az alábbi sorokban cserélje le a primary-network-name és a pass-to-primary-network elemeket az elsődleges hálózat nevével és jelszavával. Tegye ugyanezt a másodlagos hálózatnál is.


wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");

Ha több hozzáférési pontja van, további hálózatokat is felvehet.


wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
...


Próbálja ki

Most töltse fel a frissített vázlatot az ESP modulba, és nyisson meg egy soros monitort. A modul először megkeresi az elérhető hálózatokat. Ezután kiválasztja és csatlakozik az erősebb jelű hálózathoz. A kapcsolat megszakadása esetén a modul a következő elérhetőhöz csatlakozik.

Ez a folyamat valahogy így nézhet ki:


Looking for WiFi ..... connected to sensor-net-1
Looking for WiFi ....... connected to sensor-net-2
Looking for WiFi .... connected to sensor-net-1

A fenti példában az ESP először a sensor-net-1-hez csatlakozik. Majd ezután kikapcsoltam a sensor-net-1-et. Az ESP észleli, hogy a kapcsolat megszakadt, és elkezd keresni egy másik konfigurált hálózatot. Ez történetesen sensor-net-2 volt, így az ESP csatlakozott hozzá. Majd ezután visszakapcsoltam a sensor-net-1-et és lekapcsoltam a sensor-net-2-t. Az ESP automatikusan újracsatlakozott a sensor-net-1-hez.

A monitorWiFi() függvény jelzi, ha a kapcsolat megszakadt, a Looking for WiFi megjelenítésével. Egy másik konfigurált hozzáférési pont keresése közben a .... pontok jelennek meg. Ezután a kapcsolat létrejöttekor egy üzenet jelenik meg, mint például a connected to sensor-net-2.


Tehetjük egyszerűbbé?

Kérjük, vegye figyelembe, hogy leegyszerűsítheti ezt a vázlatot, ha eltávolítja a monitorWiFi() függvényt, és a loop()-on belülre csak a wifiMulti.run()-t helyezi. Az ESP továbbra is újracsatlakozik a konfigurált hozzáférési pontok között, ha szükséges. Most már nem fogja látni a soros monitoron, hacsak nem adja hozzá a Serial.setDebugOutput(true) paramétert a Wi-Fi diagnosztika engedélyezése pontban leírtak szerint.

Az ilyen forgatókönyv frissített vázlata a következőképpen fog kinézni:


#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti wifiMulti;

void setup()
{
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  Serial.println();

  wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
  wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
  wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
}

void loop()
{
  wifiMulti.run();
}

Ez az! Valójában ez az összes kód, amire szüksége van ahhoz, hogy az ESP automatikusan újracsatlakozzon az elérhető hálózatok között.

A vázlat feltöltése és a soros monitor megnyitása után az üzenetek az alábbiak szerint fognak kinézni.

Kezdeti csatlakozás a sensor-net-1-hez bekapcsoláskor:


f r0, scandone
f r0, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)

add 0
aid 1
cnt
chg_B1:-40

connected with sensor-net-1, channel 1
dhcp client start...
ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9

Megszakadt a kapcsolat a sensor-net-1-hez, és kapcsolat jön létre a sensor-net-2-vel:


bcn_timout,ap_probe_send_start
ap_probe_send over, rest wifi status to disassoc
state: 5 -> 0 (1)
rm 0
f r-40, scandone
f r-40, scandone
f r-40, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0

aid 1
cnt

connected with sensor-net-2, channel 11
dhcp client start...
ip:192.168.1.102,mask:255.255.255.0,gw:192.168.1.234

Megszakadt a kapcsolat a sensor-net-2-vel, és visszajön a kapcsolat a sensor-net-1-hez:


bcn_timout,ap_probe_send_start
ap_probe_send over, rest wifi status to disassoc
state: 5 -> 0 (1)
rm 0
f r-40, scandone
f r-40, scandone
f r-40, scandone
state: 0 -> 2 (b0)
state: 2 -> 3 (0)
state: 3 -> 5 (10)
add 0
aid 1
cnt

connected with sensor-net-1, channel 6
dhcp client start...
ip:192.168.1.10,mask:255.255.255.0,gw:192.168.1.9


Következtetés

Úgy gondolom, hogy az ESP8266WiFiMulti osztályú minimalista vázlat remek példa arra, hogy az ESP8266 mire képes a színfalak mögött, mindössze néhány sornyi kóddal.

Ahogy a fenti példában is látható, a hozzáférési pontok közötti újracsatlakozás időt vesz igénybe, és nem zökkenőmentes. Ezért a gyakorlati alkalmazásokban valószínűleg figyelnie kell a kapcsolat állapotát, hogy eldöntse, pl. ha el tudja küldeni az adatokat egy külső rendszerre, vagy meg kell várnia, amíg a kapcsolat helyreáll.

Az állomás üzemmód kezeléséhez biztosított funkciók részletes áttekintését az Állomás osztály dokumentációjában találja.


© Copyright 2017, Ivan Grokhotkov Revision 02c1a502. Fordította: Maczák András