【esp32 專案】使用esp32的wifi

FBshark發表於2024-06-10

原文:《老宇哥帶你玩轉 ESP32:13 終於到WiFi功能的使用了》

連結:https://www.eepw.com.cn/zhuanlan/315164.html

今天我們來說說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訊號來讓其他裝置搜尋到,就跟路由器發出訊號來類似,只需要一行程式碼,我們就可以建立一個我們自己命名的無線網路了,期待一下。

【esp32 專案】使用esp32的wifi

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

void loop(){
}

上面這一行程式碼,我們就建立了一個名為ESP32_WiFi的,不加密的無線網路了,我們將程式碼燒錄進去,然後開啟手機WiFi連線介面,就可以看到這個網路並進行連線了。

【esp32 專案】使用esp32的wifi

常用函式

我們開啟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);
}

將上面程式碼編譯燒錄之後,我們可以在串列埠監視器中看到如下列印:

【esp32 專案】使用esp32的wifi

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

STA模式

常用函式

我們開啟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()
{
}

將上面程式碼編譯燒錄之後,我們可以在串列埠監視器中看到如下列印:

【esp32 專案】使用esp32的wifi

登陸路由器管理介面,可以看到已經接入:

【esp32 專案】使用esp32的wifi

非同步搜尋

有一些情況,我們需要知道當前空間中存在哪些WiFi訊號,比如在WiFi配網的時候,下面我們搜尋一下當前空間中的WiFi資訊,然後列印出來

【esp32 專案】使用esp32的wifi

常用函式

我們開啟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訊號的資料都被列印了出來

【esp32 專案】使用esp32的wifi

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

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

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

相關文章