博客專欄

        EEPW首頁 > 博客 > 老宇哥帶你玩轉 ESP32:13 終于到WiFi功能的使用了

        老宇哥帶你玩轉 ESP32:13 終于到WiFi功能的使用了

        發布人:芯片之大家 時間:2023-07-02 來源:工程師 發布文章
        image.png


        今天我們來說說ESP32 的WiFi

        ESP32的WiFi

        我們之所以使用ESP32做一些小項目,最重要的就是看中了ESP32的WiFi功能,ESP32相當于一個強大的單片機+無線WiFi+藍牙多合一的一個芯片,芯片有了WiFi,它就不再孤獨寂寞,就可以與外界通信,這就是它區別于常規MCU最大的特點,就像2G手機跟4G手機的區別,4G手機能實現很多2G手機時代渴望的功能

        WiFi就是一種無線通訊技術,生活中接觸最多的就是電腦跟手機通過路由器的WiFi信號上網,說白了其實就是一種射頻信號,跟我們早期接觸的315MHz、433MHz射頻通信,藍牙,Zigbee等一樣,WiFi工作于2.4GHz或者5Ghz的頻率,今天我們先學習一下WiFi的基本功能

        AP模式

        AP模式就是讓ESP32建立一個網絡,可以發出WiFi信號來讓其他設備搜索到,就跟路由器發出信號來類似,只需要一行代碼,我們就可以建立一個我們自己命名的無線網絡了,期待一下。

        image.png


        #include <WiFi.h>void setup(){
          WiFi.softAP("ESP32_WiFi");
        }void loop(){
        }

        上面這一行代碼,我們就建立了一個名為ESP32_WiFi的,不加密的無線網絡了,我們將代碼燒錄進去,然后打開手機WiFi連接界面,就可以看到這個網絡并進行連接了。

        image.png


        常用函數

        我們打開WiFiAP.h這個頭文件就可以看到AP模式的相關函數了,這里分享一些常用的,有一些概念比如子網掩碼,網關地址等不清楚的,大家可以自行上網查看。

        該函數建立并啟動AP網絡

        bool softAP(const char* ssid, const char* passphrase = NULL, int channel = 1, int ssid_hidden = 0, int max_connection = 4);
        • ssid,AP網絡的名字,最大不超過32字節;

        • passphrase,密碼,8-63字節,不設置就是不加密;

        • channel,WiFi網絡信道,1-13可選;

        • ssid_hidden,網絡名字是否隱藏;

        • ssid_hidden,最大接入數,1-4可選。

        本地地址等設置

        bool softAPConfig(IPAddress local_ip, IPAddress gateway, IPAddress subnet);
        • local_ip,本地網絡地址,比如默認為192.168.4.1;

        • gateway,網關地址, 192.168.4.1;

        • subnet,子網掩碼,255.255.255.0。

        連接數量,返回連接到本AP的客戶端的數量

        uint8_t softAPgetStationNum();

        設置主機名字,比如設置為"CHIPHOME"

        bool softAPsetHostname(const char * hostname);

        查詢主機的MAC地址,函數返回主機的MAC地址

        String softAPmacAddress(void);

        代碼測試

        下面我們寫一個小程序,測試下上面幾個函數的功能:

        #include <WiFi.h>const char *ssid = "ESP32_WiFi";const char *password = "12345678";IPAddress local_IP(192,168,4,1);IPAddress gateway(192,168,4,1);IPAddress subnet(255,255,255,0);void setup(){
          Serial.begin(115200);
          Serial.println();
        
          WiFi.mode(WIFI_AP); // AP模式
        
          WiFi.softAPConfig(local_IP, gateway, subnet); // 設置AP地址
          WiFi.softAP(ssid, password);                  // 啟動AP成功返回1
        
          Serial.print("IP address: ");
          Serial.println(WiFi.softAPIP()); // 打印IP地址
        
          WiFi.softAPsetHostname("CHIPHOME"); // 設置主機名
          Serial.print("Hostname: ");
          Serial.println(WiFi.softAPgetHostname()); // 打印主機名
        
          Serial.print("MAC Address: ");
          Serial.println(WiFi.softAPmacAddress()); // 打印MAC地址  }void loop(){ 
          Serial.print("當前連接客戶端數: ");
          Serial.println(WiFi.softAPgetStationNum()); // 打印客戶端連接數量
          delay(5000);
        }

        將上面代碼編譯燒錄之后,我們可以在串口監視器中看到如下打印:

        image.png


        代碼中如預期的打印了了IP地址,主機名,MAC地址,連接數量,OK,AP模式相關我們就介紹到這里。

        STA模式

        STA模式就是讓ESP32當做客戶端,去連接AP主機,就好比手機去連接路由器一樣

        image.png


        #include <WiFi.h>const char *ssid = "********"; // 網絡名稱const char *password = "********"; // 網絡密碼void setup(){
         WiFi.begin(ssid, password);
        }void loop(){
        }

        上面這一行代碼,我們就將ESP32設置為STA模式,ssid跟password填寫我們要連接的WiFi的賬號密碼,就可以連接上了。

        常用函數

        我們打開WiFiSTA.h這個頭文件就可以看到STA模式的相關函數了,全部的請查閱SDK,下面是一些常用的一些:

        該函數用于接入WiFi網絡,參數同上面的AP模式基本一樣,一般就設置第一個跟第二個參數,其他選擇默認

        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);

        設置網絡地址,包括本機IP,網關地址,子網掩碼,DNS

        bool config(IPAddress local_ip, IPAddress gateway, IPAddress subnet, IPAddress dns1 = (uint32_t)0x00000000, IPAddress dns2 = (uint32_t)0x00000000);

        聯網狀態

        static wl_status_t status();

        返回不同的枚舉值代表不同的狀態:

        • 0:WL_IDLE_STATUS正在WiFi工作模式間切換;

        • 1:WL_NO_SSID_AVAIL無法訪問設置的SSID網絡;

        • 2:WL_SCAN_COMPLETED掃描完成;

        • 3:WL_CONNECTED連接成功;

        • 4:WL_CONNECT_FAILED連接失敗;

        • 5:WL_CONNECTION_LOST丟失連接;

        • 6:WL_DISCONNECTED斷開連接;

        模塊IP地址

        IPAddress localIP()

        模塊子網掩碼

        IPAddress subnetMask()

        模塊網關地址

        IPAddress gatewayIP()

        模塊MAC地址

        const char * getHostname()

        代碼測試

        下面我們寫一個小程序,測試下上面幾個函數的功能:

        #include <WiFi.h>const char *ssid = "*********";  //改為你自己的WIFI賬號const char *password = "********"; //改為你自己的WIFI密碼void setup(){
          Serial.begin(115200);
          Serial.println();
        
          WiFi.mode(WIFI_STA); //設置工作在STA模式
        
          WiFi.begin(ssid, password); //連接WiFi
        
          while (WiFi.status() != WL_CONNECTED ){  //等待網絡連接成功
            delay(1000);
            Serial.print(".");
          }
          Serial.println("WiFi Connected!");
        
          Serial.print("IP address: ");
          Serial.println(WiFi.localIP()); //IP地址
        
          Serial.print("subnetMask: ");
          Serial.println(WiFi.subnetMask()); //子網掩碼地址
        
          Serial.print("gateway: ");
          Serial.println(WiFi.gatewayIP()); //網關地址
        
          Serial.print("MAC Address: ");
          Serial.println(WiFi.macAddress()); //MAC地址}
        
        void loop(){
        }

        將上面代碼編譯燒錄之后,我們可以在串口監視器中看到如下打印:

        image.png


        代碼中如預期的打印了了IP地址,子網掩碼,網關地址,MAC地址,既然ESP32連接上路由器了,那么我們在路由器的設備列表頁面是不是也能看到ESP32:

        image.png


        異步搜索

        有一些情況,我們需要知道當前空間中存在哪些WiFi信號,比如在WiFi配網的時候,下面我們搜索一下當前空間中的WiFi信息,然后打印出來。

        image.png


        常用函數

        我們打開WiFiScan.h這個頭文件就可以看到Scan的相關函數了,全部的請查閱SDK,下面是一些常用的一些:

        該函數用于掃描啟動

        int16_t scanNetworks(bool async = false, bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300, uint8_t channel = 0);
        • async,異步掃描,設置為true則不阻塞;

        • show_hidden,是否掃描不廣播的網絡;

        • passive,掃描速度;

        • max_ms_per_chan,每個通道的掃描時間;

        • channel,通道選擇。

        該函數用于判斷掃描是否完成

        int16_t scanComplete();
        • -1,掃描還沒結束;

        • -2,掃描還沒觸發;

        • n,掃描到的WiFi信號個數;

        刪除內存中的掃描數據

        void scanDelete();

        掃描到的網絡名稱

        String SSID(uint8_t networkItem);

        掃描到的網絡加密類型

        wifi_auth_mode_t encryptionType(uint8_t networkItem)

        掃描到的網絡信號強度

        int32_t RSSI(uint8_t networkItem)

        掃描到的網絡信道號

        int32_t channel(uint8_t networkItem)

        代碼測試

        下面我們寫一個小程序,異步掃描我們空間中當前存在的WiFi信號并打印出來:

        #include <WiFi.h>
        
        void setup(){
          Serial.begin(115200);
          Serial.println();
        
          WiFi.mode(WIFI_STA);  // 設置為STA模式
        
          Serial.println("開始掃描");
          WiFi.scanNetworks(true); //啟動異步掃描}
        
        void loop(){  
          int n = WiFi.scanComplete(); //獲取掃描狀態,信號個數
          if (n >= 0){
            Serial.println("掃描完成");    for (int i = 0; i < n; ++i){
              Serial.println();
              Serial.print(i + 1);
              Serial.print(":       ");
              Serial.print(WiFi.SSID(i)); //網絡名稱
              Serial.print("        ");
              Serial.print(WiFi.RSSI(i)); //信號強度
              Serial.print("        ");
              Serial.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? "未加密" : "加密"); //是否加密
              delay(10);
            }
            WiFi.scanDelete(); //清除內存中的掃描結果
          }  else if (n == -1){
            Serial.println("正在掃描");
          }  else if (n == -2) {
            Serial.println("未觸發掃描");
          }
        
          delay(1000);
        }

        我們看下打印的結果,周圍的WiFi信號的數據都被打印了出來

        image.png


        到這里,WiFi的基本使用我們算是入門了,聯網之后,外面的世界非常美妙,我們可以做很多有意思的項目,做一些漂亮的網絡時鐘,做一些智能家居的小產品,做一個網絡收音機,做一個游戲模擬器,很多很多......

        關于WiFi的一些其它功能,比如TCP協議,UDP協議,Web服務器等,我們用到的時候再細說。

        感謝大家,關于ESP32的學習,希望大家Enjoy!


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: WiFi

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宽城| 如皋市| 花莲县| 旌德县| 泗阳县| 九龙城区| 伽师县| 林州市| 保亭| 宜兴市| 阳西县| 龙州县| 定边县| 宣武区| 沽源县| 冀州市| 张北县| 黄龙县| 错那县| 廉江市| 阳信县| 柳林县| 彰化市| 长顺县| 余干县| 武川县| 潜江市| 曲周县| 镇雄县| 奉新县| 富宁县| 固安县| 林州市| 隆昌县| SHOW| 津南区| 二连浩特市| 璧山县| 白水县| 牟定县| 韩城市|