Az ebben a részben leírt módszerek és tulajdonságok az ESP8266-ra vonatkoznak. Az Arduino WiFi könyvtár dokumentációja nem foglalkozik velük. Mielőtt teljes körűen dokumentálnák, olvassa el az alábbi információkat.
void onEvent(WiFiEventCb cb, WiFiEvent_t event=WIFI_EVENT_ANY) __attribute__((deprecated))
WiFiEventHandler onStationModeConnected (std::function< void(const WiFiEventStationModeConnected &)>)
WiFiEventHandler onStationModeDisconnected (std::function< void(const WiFiEventStationModeDisconnected &)>)
WiFiEventHandler onStationModeAuthModeChanged
(std::function< void(const WiFiEventStationModeAuthModeChanged &)>)
WiFiEventHandler onStationModeGotIP (std::function< void(const WiFiEventStationModeGotIP &)>)
WiFiEventHandler onStationModeDHCPTimeout (std::function< void(void)>)
WiFiEventHandler onSoftAPModeStationConnected
(std::function< void(const WiFiEventSoftAPModeStationConnected &)>)
WiFiEventHandler onSoftAPModeStationDisconnected
(std::function< void(const WiFiEventSoftAPModeStationDisconnected &)>)
Meg kell jegyezni, hogy amikor egy WiFi interfész leáll, az összes WiFiClients leáll, és az összes WiFiServer leáll. Amikor megjelenik az interfész, a felhasználó feladata, hogy újra csatlakoztassa a megfelelő WiFi-klienseket, és visszaállítsa a WiFi-kiszolgálókat. A WiFi állomás interfészéhez javasoljuk, hogy állítson be egy visszahívást az onStationModeDisconnected() számára, amely leállítja a felhasználói alkalmazás WiFi-klienseit és WiFi-kiszolgálóit (erőforrás-tisztítás), és egy másik visszahívást az onStationModeGotIP()-hez, amely visszaállítja őket. A SoftAP interfésznél, amikor az interfész megjelenik, minden szervert is elő kell hozni.
A WiFiEventHandler
részletes magyarázata a példákat tartalmazó részben található: arrow_right: kifejezetten az Általános osztálynak szentelve.
Alternatív megoldásként ellenőrizze az ESP8266WiFi könyvtár példamappájában elérhető WiFiEvents.ino példavázlatot.
WiFi.persistent(persistent)
A mag 3-as verziójától kezdődően a perzisztencia alapértelmezés szerint le van tiltva, és a WiFi nem indul el automatikusan rendszerindításkor (lásd: PR #7902).
Korábban az SDK automatikusan elindította a WiFi-t rendszerindításkor. Ezt valószínűleg az Espressif AT FW-hez szánták, amely interaktív és megőrzi a WiFi állapotát az újraindítások során. Ez a viselkedés általában irreleváns az Arduino API esetében, mivel a vázlatok a WiFi.begin()
vagy WiFi.softAP()
utasításokkal kezdődnek.
Ez a változás a szabványos vázlatokkal ártalmatlan: a WiFi.mode()
hívásai a szokásos módon engedélyezik a rádiót. Ezenkívül kisimítja az áramcsúcsokat a rendszerindításkor, és csökkenti a DHCP-feszültséget.
Az örökölt viselkedés visszaállítható az enableWiFiAtBootTime()
meghívásával a kódban bárhonnan (ez egy gyenge void függvény, amely a linkerrel való lejátszásra szolgál).
#include <ESP8266WiFi.h>
void setup () {
#ifdef WIFI_IS_OFF_AT_BOOT
enableWiFiAtBootTime(); // can be called from anywhere with the same effect
#endif
....
}
Amikor ennek a hívásnak köszönhetően helyreáll a régi viselkedés, az ESP8266 képes újra csatlakozni az utoljára használt WiFi hálózathoz, vagy ugyanazt a hozzáférési pontot hozza létre bekapcsoláskor vagy alaphelyzetbe állításkor. Alapértelmezés szerint ezek a beállítások a flash memória meghatározott szektoraiba íródnak minden alkalommal, amikor módosítják őket a WiFi.begin(ssid, passphrase)
vagy a WiFi.softAP(ssid, passphrase, channel)
, illetve amikor a WiFi.disconnect
vagy a WiFi.softAPdisconnect
meghívásra kerül. E függvények gyakori meghívása a flash memória elhasználódását okozhatja (lásd az #1054-es problémát).
A WiFi.persistent(false)
meghívása után a WiFi.begin
, WiFi.disconnect
, WiFi.softAP
vagy WiFi.softAPdisconnect
csak a memóriában lévő aktuális WiFi-beállításokat módosítja, és nincs hatással a flash memóriában tárolt WiFi-beállításokra.
bool mode(WiFiMode_t m)
Átvált a normál WiFi módok egyikére, ahol m
az egyik:
WIFI_OFF
: kapcsolja ki a WiFi-t.
WIFI_STA
: váltás Állomás (STA) módba.
WIFI_AP
: váltson Hozzáférési pont (AP) módba.
WIFI_AP_STA
: az állomás (STA) és a hozzáférési pont (AP) mód engedélyezése.
WiFiMode_t getMode()
Lekéri az aktuális WiFi módot (a fenti négy szabványos mód közül egyet).
bool setSleepMode (WiFiSleepType_t type, int listenInterval=0)
Az alvó mód típusa: WIFI_NONE_SLEEP
, WIFI_LIGHT_SLEEP
vagy WIFI_MODEM_SLEEP
.
(A listenInterval
az esp8266-arduino core v2.5.0-ban jelent meg a nonos-sdk V3 előtti utolsó V2-es verziójával).
Idézve a nonos-sdk adatlapot:
NONE
: kapcsolja ki az energiatakarékosságot.
LIGHT
vagy MODEM
: A TCP időzítő sebessége 250 ms-tól 3 másodpercig emelkedhet
Ha a listenInterval
értéke 1...10, LIGHT
vagy MODEM
módban az állomás minden (DTIM-intervallum * listenInterval
) felébred. Ez energiát takarít meg, de előfordulhat, hogy az állomás interfésze kihagyja a sugárzott adatokat.
Ellenkező esetben (alapértelmezett érték 0) az állomás minden DTIM-intervallumban felébred (a hozzáférési pontban konfigurálva).
A Wikipédiát idézve:
A Delivery Traffic Indication Map (DTIM) egyfajta forgalmi jelzési térkép (TIM), amely tájékoztatja az ügyfeleket a pufferelt multicast/broadcast adatok jelenlétéről a hozzáférési ponton. A periodikus jeladón belül generálódik a DTIM intervallum által meghatározott frekvencián. A jeladók olyan csomagok, amelyeket egy hozzáférési pont küld a vezeték nélküli hálózat szinkronizálására.
void WiFi.setOutputPower(float dBm)
Beállítja a maximális adási teljesítményt dBm-ben. Az értékek 0 és 20,5 [dBm] között mozognak, és 0,25 többszöröseinek kell lenniük. Ez lényegében egy vékony burkolat az SDK system_phy_set_max_tpw() API-hívása körül.
Ha a jelzaj miatt wifi kapcsolati problémák merülnek fel, próbálja meg csökkenteni a Tx teljesítményét. Ez hatékonynak bizonyult azokban az esetekben, amikor STA mód van használatban a 802.11n phy (alapértelmezett) szabvánnyal. Ha például 17,5 dBm-re vagy valamivel alacsonyabbra csökkenti, az csökkentheti a zajt és javíthatja a kapcsolatot, bár a maximális hatótávolság is csökken.
bool setPhyMode (WiFiPhyMode_t mode)
Beállítja a WiFi rádió phy módot. Az argumentum egy WiFiPhyMode_t típusú enum, az érvényes értékek: - WIFI_PHY_MODE_11B
: 802.11b mód - WIFI_PHY_MODE_11G
: 802.11g mód - WIFI_PHY_MODE_11N
: 802.11n mód.
A NONOS SDK API-referencia dokumentuma szerint az AP mód csak a b/g-t támogatja, lásd a wifi_set_phy_mode() API-val kapcsolatos megjegyzéseket. True sikert ad vissza, egyébként false-t.
Egyes kísérletek kimutatták, hogy a 802.11b mód rendelkezik a leghosszabb LOS hatótávolsággal, míg a 802.11n mód a leghosszabb beltéri hatótávolsággal.
Megfigyelték, hogy egyes wifi-routerek 802.11n-ről g/b-re romolhatnak, ha egy ESP8266 g/b phy módban csatlakozik hozzájuk. Ez azt jelenti, hogy az összes eszköz teljes wifi-kapcsolatát érinti.
WiFiPhyMode_t getPhyMode (WiFiPhyMode_t mode)
Lekéri a jelenleg beállított WiFi rádió phy módját.
bool forceSleepBegin (uint32 sleepUs=0)
Menti az aktuálisan beállított WiFi módot, és a modem kényszeralvó állapotát elindítja a megadott időre (us).
bool forceSleepWake ()
A forceSleepBegin() után meghívva. Visszaállítja az előző WiFi módot, és megkísérli az újracsatlakozást, amikor az STA aktív volt.
bool shutdown (WiFiState& state)
bool shutdown (WiFiState& state, uint32 sleepUs)
bool resumeFromShutdown (WiFiState& state)
bool shutdownValidCRC (const WiFiState& state)
Tárolja az STA interfész IP-konfigurációját a megadott state
struktúrában, és meghívja a forceSleepBegin(sleepUs)
parancsot. Visszaállítja az STA interfész konfigurációját az state
-ből, és meghívja a forceSleepWake()
függvényt.
Ezeket a metódusokat kis fogyasztású forgatókönyvekben kívánják használni, pl. ahol az ESP.deepSleep az akkumulátor töltöttségi szintjének megőrzése érdekében a műveletek között használatos. A felhasználó felelőssége a WiFiState megőrzése a shutdown()
és a resumeFromShutdown()
között, az RTC felhasználói adatokban és/vagy a flash memóriában való tárolásával.
Használati példát a WiFiShutdown.ino oldalon talál.
int32_t channel (void)
WiFiSleepType_t getSleepMode ()
bool enableSTA (bool enable)
bool enableAP (bool enable)
int hostByName (const char *aHostname, IPAddress &aResult)
a V3 előtti SDK-val jelent meg:
uint8_t getListenInterval ();
bool isSleepLevelMax ();
A fenti funkciók dokumentációja még nem készült el.
A kódmintákért kérjük, olvassa el a külön szakaszt, amely kifejezetten az általános osztálynak szentelt példákat tartalmaz.
© Copyright 2017, Ivan Grokhotkov Revision b080c507. Fordította: Maczák András