在前面的篇章中,博主給你們講解了ESP8266的軟硬件配置以及基本功能使用,目的就是想讓你們有個初步認識。而且,博主一直重點強調 ESP8266 WiFi模塊有三種工做模式:web
任何基於ESP8266的WiFi功能開發,都是基於上面其中一種工做模式來進行開發。因此,它們是咱們WiFi基礎學習的重點。
本篇章將講解Station模式。數組
Station模式又叫作站點工做模式,相似於無線終端,有圖有真相:
Station模式又叫作站點工做模式,相似於無線終端,有圖有真相:
處於Station模式下的ESP8266,能夠鏈接到AP。經過Station(簡稱爲「STA」)模式,ESP8266做爲客戶端鏈接到路由的wifi信號。 如下黑色字體內容摘錄於博主自建qq羣裏面在arduino 聯網.pdf文件,博主以爲講得挺生動,故分享給你們:服務器
經過這個鏈接過程分析,也證實了咱們常常聽到的一句話,不要輕易鏈接不明WiFi熱點,各類盜取信息層出不窮。
同時,學過網絡的同窗都知道,每臺設備都會有個一個IP地址,用來在整個網絡環境下的惟一標識。
而處於Station模式下的ESP8266,可使用DHCP Client的方式,由上級路由分配的ip,或者設置成靜態ip。
若是是採用DHCP分配的方式,獲取的ip是動態的,在一些須要知道設備ip才能通訊的場合下,就須要經過其餘手段來獲取ip(一種思路是經過訪問webserver去獲取模塊信息);
若是是採用設置靜態ip的方式,那麼就有一個要求前提,要求鏈接AP設置的網段和靜態的要一致,在不能固定AP網段的狀況下,這種方式不可取。
Station模式下的WiFi模塊,有幾個特色,以便用來管理WiFi鏈接:網絡
有了前面的理論基礎,那麼咱們開始詳解一下ESP8266 station模式的專用庫——ESP8266WiFiSTA庫,你們使用的時候不須要函數
#include <ESP8266WiFiSTA.h>
只須要引入oop
#include<ESP8266WiFi.h>
至於緣由,敬請回顧 ESP8266開發之旅 網絡篇② ESP8266 工做模式與ESP8266WiFi庫。
首先,對於STA類庫的描述,能夠拆分爲四個部分:學習
講解以前,先瀏覽一下博主整理的百度腦圖,以便有個總體認識:
字體
創建鏈接,ESP8266模塊切換工做模式爲Station模式。
會用到如下方法:ui
class ESP8266WiFiSTAClass { // ---------------------------------------------------------------------------------------------- // ---------------------------------------- STA function ---------------------------------------- // ---------------------------------------------------------------------------------------------- ....... public: wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true); wl_status_t begin(); ....... };
下面是函數詳解:google
/** * 切換工做模式到STA模式,並自動鏈接到最近接入的wifi熱點 * @param void * @return void * @note 調用這個方法就會切換到STA模式,而且鏈接到最近使用的接入點(會從flash中讀取以前存儲的配置信息) * 若是沒有配置信息,那麼這個方法基本上沒有什麼用。 */ wl_status_t begin() /** * 切換工做模式到STA模式,並根據connect屬性來判斷是否鏈接wifi * @param ssid wifi熱點名字 * @param password wifi熱點密碼 * @param channel wifi熱點的通道號,用特定通訊通訊,可選參數 * @param bssid wifi熱點的mac地址,可選參數 * @param connect boolean參數,默認等於true,當設置爲false,不會去鏈接wifi熱點,會創建module保存上面參數 * @return wl_status_t wifi狀態 * @note 調用這個方法就會切換到STA模式。 * 若是connect等於true,會鏈接到ssid的wifi熱點。 * 若是connect等於false,不會鏈接到ssid的wifi熱點,會創建module保存上面參數。 */ wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true
注意點:
/** * 禁止DHCP client,設置station 模式下的IP配置 * @param local_ip station固定的ip地址 * @param gateway 網關 * @param subnet 子網掩碼 * @param dns1,dns2 可選參數定義域名服務器(dns)的ip地址,這些域名服務器 * 維護一個域名目錄(如www.google.co.uk),並將它們翻譯成ip地址 * @return boolean值,若是配置成功,返回true; * 若是配置沒成功(模塊沒處於station或者station+soft AP模式),返回false; */ bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000)
注意點:
函數講解:
/** * 斷開鏈接而且從新鏈接station到同一個AP * @param void * @return false or true * 返回false,意味着ESP8266不處於STA模式或者說Station在此以前沒有鏈接到一個可接入點。 * 返回true,意味着已經成功從新啓動鏈接,可是用戶仍應該去檢測網絡鏈接狀態指導WL_CONNECTED。 */ bool reconnect()
案例使用:
/** * 使用案例 */ WiFi.reconnect(); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
函數講解:
/** * 斷開wifi鏈接,設置當前配置SSID和pwd爲null * @param wifioff 可選參數,設置爲true,那麼就會關閉Station模式 * @return false or true 返回wl_status_t狀態 */ bool disconnect(bool wifioff = false);
注意點:
/** * Disconnect from the network * @param wifioff * @return one value of wl_status_t enum */ bool ESP8266WiFiSTAClass::disconnect(bool wifioff) { bool ret; struct station_config conf; /**如下兩步爲清除最近鏈接點信息*/ *conf.ssid = 0; *conf.password = 0; ETS_UART_INTR_DISABLE(); if(WiFi._persistent) { wifi_station_set_config(&conf); } else { wifi_station_set_config_current(&conf); } ret = wifi_station_disconnect(); ETS_UART_INTR_ENABLE(); if(wifioff) { WiFi.enableSTA(false); } return ret; }
函數講解:
/** * 判斷STA模式下是否鏈接上AP * @return 若是STA鏈接上AP,那麼就返回true */ bool isConnected();
函數講解:
/** * 當電源啓動後,設置ESP8266在STA模式下是否自動鏈接flash中存儲的AP * @param autoConnect bool 默認是自動鏈接 * @return 返回保存狀態 true or false */ bool setAutoConnect(bool autoConnect);
函數講解:
/** * 檢測ESP8266 station模式下是否啓動自動鏈接 * @return 返回自動鏈接狀態 true or false */ bool getAutoConnect();
函數講解:
/** * 設置當斷開鏈接的時候是否自動重連 * @param autoConnect bool * @return 返回保存狀態 true or false */ bool setAutoReconnect(bool autoReconnect);
注意點:
函數講解:
/** * 等待直到ESP8266鏈接AP返回結果 * @return uint8_t 鏈接結果 * 1.WL_CONNECTED 成功鏈接 * 2.WL_NO_SSID_AVAIL 匹配SSID失敗(帳號錯誤) * 3.WL_CONNECT_FAILED psw錯誤 * 4.WL_IDLE_STATUS 當wi-fi正在不一樣的狀態中變化 * 5.WL_DISCONNECTED 這個模塊沒有配置STA模式 */ uint8_t waitForConnectResult();
提供一些關於這個鏈接的信息,包括MAC地址、IP地址等;
獲取mac地址有2個函數,請看函數講解:
/** * 獲取ESP station下的Mac地址 * @param mac uint8_t數組的指針,數組長度爲Mac地址的長度,這裏爲6 * @return 返回uint8_t數組的指針 */ uint8_t * macAddress(uint8_t* mac); /** * 獲取ESP station下的Mac地址 * @return 返回String的Mac地址 */ String macAddress();
應用實例:
//實例代碼1 這只是部分代碼 不能直接使用 if (WiFi.status() == WL_CONNECTED) { uint8_t macAddr[6]; WiFi.macAddress(macAddr); Serial.printf("Connected, mac address: %02x:%02x:%02x:%02x:%02x:%02x\n", macAddr[0], macAddr[1], macAddr[2], macAddr[3], macAddr[4], macAddr[5]); //Connected, mac address: 5C:CF:7F:08:11:17 } //實例代碼2 這只是部分代碼 不能直接使用 if (WiFi.status() == WL_CONNECTED) { Serial.printf("Connected, mac address: %s\n", WiFi.macAddress().c_str()); ////Connected, mac address: 5C:CF:7F:08:11:17 }
函數講解:
/** * 返回ESP8266 STA模式下的IP地址 * @return IP地址 */ IPAddress localIP();
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 if (WiFi.status() == WL_CONNECTED) { Serial.print("Connected, IP address: "); Serial.println(WiFi.localIP()); //Connected, IP address: 192.168.1.10 }
函數講解:
/** * 獲取子網掩碼的地址 * @return 返回子網掩碼的IP地址 */ IPAddress subnetMask();
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.print("Subnet mask: "); Serial.println(WiFi.subnetMask()); //Subnet mask: 255.255.255.0
函數講解:
/** * 獲取網關IP地址 * @return 返回網關IP地址 */ IPAddress gatewayIP();
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.printf("Gataway IP: %s\n", WiFi.gatewayIP().toString().c_str()); //Gataway IP: 192.168.1.9
函數講解:
/** * 獲取DNS ip地址 * @param dns_no dns序列號 * @return 返回DNS服務的IP地址 */ IPAddress dnsIP(uint8_t dns_no = 0);
應用實例:
/實例代碼 這只是部分代碼 不能直接使用 Serial.print("DNS #1, #2 IP: "); WiFi.dnsIP().printTo(Serial); Serial.print(", "); WiFi.dnsIP(1).printTo(Serial); Serial.println(); //DNS #1, #2 IP: 62.179.1.60, 62.179.1.61
函數講解:
/** * 獲取ESP8266 station DHCP的主機名 * @return 主機名 */ String hostname();
設置host名字,有3個可用函數,請看函數講解:
/** * 設置ESP8266 station DHCP的主機名 * @param aHostname 最大長度:32 * @return ok */ bool hostname(char* aHostname); bool hostname(const char* aHostname); bool hostname(String aHostname);
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.printf("Default hostname: %s\n", WiFi.hostname().c_str()); WiFi.hostname("Station_Tester_02"); Serial.printf("New hostname: %s\n", WiFi.hostname().c_str()); //Default hostname: ESP_081117 //New hostname: Station_Tester_02
函數講解:
/** * 返回wifi的鏈接狀態 * @return 返回wl_status_t中定義的其中一值,wl_status_t在 wl_definitions.h中定義 */ wl_status_t status();
函數講解:
/** * 返回當前通訊網絡的SSID * @return SSID */ String SSID() const;
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.printf("SSID: %s\n", WiFi.SSID().c_str()); //SSID: sensor-net
函數講解:
/** * 返回當前通訊網絡的密碼 * @return psk */ String psk() const;
函數講解:
/** * 返回當前通訊網絡的mac地址 * @return bssid uint8_t * */ uint8_t * BSSID(); String BSSIDstr();
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str()); //BSSID: 00:1A:70E:C1:68
函數講解:
/** * Return the current network RSSI.返回當前通訊網絡的信號強度,單位是dBm * @return RSSI value */ int32_t RSSI();
應用實例:
//實例代碼 這只是部分代碼 不能直接使用 Serial.printf("RSSI: %d dBm\n", WiFi.RSSI()); //RSSI: -68 dBm
第四部分方法,提供一些備用遠程配置方法去鏈接WiFi-Protected Setup(WPS)以及智能配置方法(SmartConfig);
bool beginWPSConfig(void); /** * 啓動 SmartConfig */ bool beginSmartConfig(); /** * 中止 SmartConfig */ bool stopSmartConfig(); /** * 查找SmartConfig狀態來決定是否中止配置 * @return smartConfig Done */ bool smartConfigDone();
這部分不是本篇的重點,暫時忽略,後續章節會詳細講解。
上面博主講了一堆方法理論的知識,下面咱們開始講解操做實例,博主儘可能都在代碼中註釋,直接看代碼就好。
statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印IP地址。
源碼:
/** * Demo1: * statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印IP地址 * @author 單片機菜鳥 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #define AP_SSID "TP-LINK_5344" //這裏改爲你的wifi名字 #define AP_PSW "6206908you11011010"//這裏改爲你的wifi密碼 //如下三個定義爲調試定義 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) void setup(){ //設置串口波特率,以便打印信息 DebugBegin(115200); //延時2s 爲了演示效果 delay(2000); DebugPrintln("Setup start"); //啓動STA模式,並鏈接到wifi網絡 WiFi.begin(AP_SSID, AP_PSW); DebugPrint(String("Connecting to ")+AP_SSID); //判斷網絡狀態是否鏈接上,沒鏈接上就延時500ms,而且打出一個點,模擬鏈接過程 //筆者擴展:加入網絡一直都連不上 是否能夠作個判斷,由大家本身實現 while (WiFi.status() != WL_CONNECTED){ delay(500); DebugPrint("."); } DebugPrintln(""); DebugPrint("Connected, IP address: "); //輸出station IP地址,這裏的IP地址由DHCP分配 DebugPrintln(WiFi.localIP()); DebugPrintln("Setup End"); } void loop() { }
操做結果:
statin模式下,配置IP地址,網關地址,子網掩碼,而且打印IP地址。
源碼:
/** * Demo2: * statin模式下,配置IP地址,網關地址,子網掩碼,而且打印IP地址 * @author 單片機菜鳥 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #define AP_SSID "TP-LINK_5344" //這裏改爲你的wifi名字 #define AP_PSW "6206908you11011010"//這裏改爲你的wifi密碼 //如下三個定義爲調試定義 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) IPAddress staticIP(192,168,1,22);//固定IP地址 IPAddress gateway(192,168,1,9);//網關地址 IPAddress subnet(255,255,255,0);//子網掩碼地址 void setup(){ //設置串口波特率,以便打印信息 DebugBegin(115200); //延時2s 爲了演示效果 delay(2000); DebugPrintln("Setup start"); //啓動STA模式,並鏈接到wifi網絡 WiFi.begin(AP_SSID, AP_PSW); DebugPrint(String("Connecting to ")+AP_SSID); //配置網絡 WiFi.config(staticIP,gateway,subnet); //判斷網絡狀態是否鏈接上,沒鏈接上就延時500ms,而且打出一個點,模擬鏈接過程 //筆者擴展:加入網絡一直都連不上 是否能夠作個判斷,由大家本身實現 while (WiFi.status() != WL_CONNECTED){ delay(500); DebugPrint("."); } DebugPrintln(""); DebugPrint("Connected, IP address: "); //輸出station IP地址,這裏的IP地址理論上就是上面配置的 DebugPrintln(WiFi.localIP()); DebugPrintln("Setup End"); } void loop() { }
操做結果:
statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印station信息。
源碼:
/** * Demo3: * statin模式下,建立一個鏈接到可接入點(wifi熱點),而且打印station信息 * @author 單片機菜鳥 * @date 2019/09/02 */ #include <ESP8266WiFi.h> #define AP_SSID "TP-LINK_5344" //這裏改爲你的wifi名字 #define AP_PSW "6206908you11011010" //這裏改爲你的wifi密碼 //如下三個定義爲調試定義 #define DebugBegin(baud_rate) Serial.begin(baud_rate) #define DebugPrintln(message) Serial.println(message) #define DebugPrint(message) Serial.print(message) void setup(){ //設置串口波特率,以便打印信息 DebugBegin(115200); //延時2s 爲了演示效果 delay(2000); DebugPrintln("Setup start"); //啓動STA模式,並鏈接到wifi網絡 WiFi.begin(AP_SSID, AP_PSW); //設置自動鏈接 WiFi.setAutoConnect(true); //設置自動重連 WiFi.setAutoReconnect(true); DebugPrint(String("Connecting to ")+AP_SSID); //判斷網絡狀態是否鏈接上,沒鏈接上就延時500ms,而且打出一個點,模擬鏈接過程 //筆者擴展:加入網絡一直都連不上 是否能夠作個判斷,由大家本身實現 while (WiFi.status() != WL_CONNECTED){ delay(500); DebugPrint("."); } DebugPrintln(""); DebugPrintln("rint Network Info:"); if (WiFi.status() == WL_CONNECTED){ //輸出mac地址 DebugPrintln(String("Connected, mac address: ")+WiFi.macAddress().c_str()); //輸出station IP地址,這裏的IP地址由DHCP分配 DebugPrintln(String("Connected, IP address: ")+WiFi.localIP().toString()); //輸出子網掩碼地址 DebugPrintln(String("Subnet mask: ")+WiFi.subnetMask().toString()); //輸出網關 IP地址 DebugPrintln(String("Gataway IP: ")+WiFi.gatewayIP().toString()); //輸出hostname DebugPrintln(String("Default hostname: ")+WiFi.hostname()); //設置新的hostname WiFi.hostname("Station_host_博哥"); DebugPrintln(String("New hostname: ")+WiFi.hostname()); //輸出SSID DebugPrintln(String("SSID: ")+WiFi.SSID()); //輸出psk DebugPrintln(String("psk: ")+WiFi.psk()); //輸出BSSID DebugPrintln(String("BSSID: ")+WiFi.BSSIDstr()); //輸出RSSI DebugPrintln(String("RSSI: ") + WiFi.RSSI() + " dBm"); } DebugPrintln("Setup End"); } void loop() { }
操做結果:
注意點:
ESP8266WiFiClass WiFi;
//舉個例子 WiFi.SSID() 改爲 WiFi.SSID().toString()
本節主要是基於ESP8266WiFiSTA庫來說解Station模式下的函數使用,而且給你們提供了三個實例,至於更多例子我就不繼續舉例,只能說引導你們入門使用。