博客 / 詳情

返回

《ESP32-S3使用指南—IDF版 V1.6》第四十八章 掃描WiFi實驗

第四十八章掃描WiFi實驗

ESP32-S3的WiFi庫支持配置及監控ESP32-S3的Wi-Fi連網功能。它支持配置基站模式(即STA模式或WiFi客户端模式),此時ESP32-S3連接到接入點(AP)。還支持AP模式(即Soft-AP模式或接入點模式),此時基站連接到ESP32-S3。同時,支持AP-STA共存模式,此時ESP32-S3既是接入點,同時又作為STA。本章節的實驗是基於樂鑫官方提供的WiFi庫來實現的,但遺憾的是樂鑫並沒有公開WiFi庫的源碼,所以我們只能調用API函數實現。
本章分為如下幾個小節:
48.1 WiFi模式概述
48.2 硬件設計
48.3 軟件設計
48.4 下載驗證

48.1 WiFi模式概述

WiFi主要有兩種模式:STA和AP模式。AP模式即無線接入點,是我們常説的手機熱點,被其他設備連接;STA模式即Station,是連接熱點的設備。另外,ESP32S3可支持STA和AP兩種模式共存,就像手機那樣可以開熱點,也可以連接其他熱點。
WiFi庫支持配置及監控ESP32S3 Wi-Fi連網功能。支持配置:
①:Station模式(即STA模式或WiFi客户端模式),此時 ESP32 S3連接到接入點 (AP)。
②:AP模式(即Soft-AP模式或接入點模式),此時基站連接到ESP32S3設備。
③:Station/AP 共存模式(ESP32S3 既是接入點,同時又作為基站連接到另外一個接入點)。
④:上述模式的各種安全模式(WPA、WPA2 及 WEP 等)。
⑤:掃描接入點(包括主動掃描及被動掃描)。
⑥:使用混雜模式監控 IEEE802.11 Wi-Fi 數據包。
下面作者講解ESP32S3開啓WiFi兩種模式啓動流程,如下:
一、WiFi-AP啓動流程
WiFi-AP啓動流程如下。

圖48.1.1 AP啓動流程
上圖展示了ESP32系列芯片以AP模式開啓WiFi的啓動流程。首先,系統需要對lwIP協議棧進行初始化。接着,創建一個任務,該任務將用於觸發相應的事件。然後,配置WiFi參數和AP模式參數。最後,啓動WiFi,從而完成以AP模式開啓WiFi的操作。
二、WiFi-STA啓動流程
WiFi-STA啓動流程如下。

圖48.1.2 STA模式啓動流程
上圖展示了ESP32系列芯片以STA模式開啓WiFi的啓動流程。首先,系統需要創建定時器和事件組,並對lwIP協議棧進行初始化。接着,創建一個任務,該任務將用於觸發相應的事件。然後,配置WiFi參數和STA模式參數。最後,啓動WiFi,從而完成以STA模式開啓WiFi的操作。

48.2 硬件設計

1.例程功能
本章實驗功能簡介:掃描附近的WIFI信號,並在LCD顯示屏右側顯示12個WIFI名稱。
2.硬件資源
1)LED燈

   LED-IO1

2)XL9555

   IIC_INT-IO0(需在P5連接IO0)

IIC_SDA-IO41
IIC_SCL-IO42
3)SPILCD

   CS-IO21
   SCK-IO12
   SDA-IO11
   DC-IO40(在P5端口,使用跳線帽將IO_SET和LCD_DC相連)
   PWR- IO1_3(XL9555)
   RST- IO1_2(XL9555)

4)ESP32-S3內部WiFi
3.原理圖
本章實驗使用的WiFi為ESP32-S3的片上資源,因此並沒有相應的連接原理圖。

48.3 軟件設計

48.3.1 程序流程圖

程序流程圖能幫助我們更好的理解一個工程的功能和實現的過程,對學習和設計工程有很好的主導作用。下面看看本實驗的程序流程圖。

圖48.3.1 程序流程圖

48.3.2 程序解析

在本章節實驗中,我們只關心main.c文件內容即可,該文件內容如下:

/* 存儲12個WIFI名稱 */
#define DEFAULT_SCAN_LIST_SIZE  12
i2c_obj_t i2c0_master;
static const char *TAG = "scan";
/**
*@brief       身份認證模式
*@param       authmode :身份驗證模式
*@retval      無
*/
static voidprint_auth_mode(int authmode)
{
    switch (authmode)
    {
       /* 省略身份認證模式代碼 */
    }
}
/**
*@brief       打印WIFI密碼類型
*@param       pairwise_cipher :密碼類型
*@param       group_cipher    :羣密碼類型
*@retval      無
*/
static voidprint_cipher_type(int pairwise_cipher, int group_cipher)
{
    switch (pairwise_cipher)
    {
       /* 省略WIFI密碼類型代碼 */
    }
    switch (group_cipher)
    {
       /* 省略WIFI密碼類型代碼 */
    }
}
/**
*@brief       將Wi-Fi初始化為sta並設置掃描方法
*@param       無
*@retval      無
*/
void wifi_scan(void)
{
    char lcd_buff[100] = {0};
    /* 網卡初始化 */
   ESP_ERROR_CHECK(esp_netif_init());
    /* 創建新的事件循環 */
   ESP_ERROR_CHECK(esp_event_loop_create_default());
    /* 用户初始化STA模式 */
   esp_netif_t *sta_netif =esp_netif_create_default_wifi_sta();
   assert(sta_netif);
    /* wifi配置初始化 */
   wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
   ESP_ERROR_CHECK(esp_wifi_init(&cfg));
    uint16_t number =DEFAULT_SCAN_LIST_SIZE;
   wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
    uint16_t ap_count = 0;
   memset(ap_info, 0, sizeof(ap_info));
    /* 設置WIFI為STA模式 */
   ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
    /* 啓動WIFI */
   ESP_ERROR_CHECK(esp_wifi_start());
    /* 開始掃描附件的WIFI */
   esp_wifi_scan_start(NULL, true);
    /* 獲取上次掃描中找到的AP列表 */
   ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
    /* 獲取上次掃描中找到的AP數量 */
   ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
   ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
    /* 下面是打印附件的WIFI信息 */
    for (int i = 0; (i <DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++)
    {
       sprintf(lcd_buff, "%s",ap_info.ssid);
       lcd_show_string(200, 20 * i, 240, 16, 16, lcd_buff, BLUE);
       ESP_LOGI(TAG, "SSID \t\t%s", ap_info.ssid);
       ESP_LOGI(TAG, "RSSI \t\t%d", ap_info.rssi);
       print_auth_mode(ap_info.authmode);
      
       if (ap_info.authmode != WIFI_AUTH_WEP)
       {
           print_cipher_type(ap_info.pairwise_cipher
, ap_info.group_cipher);
       }
       ESP_LOGI(TAG, "Channel \t\t%d\n", ap_info.primary);
    }
}
/**
*@brief       程序入口
*@param       無
*@retval      無
*/
void app_main(void)
{
   esp_err_t ret;
    ret=nvs_flash_init();             /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
       ESP_ERROR_CHECK(nvs_flash_erase());
       ret =nvs_flash_init();
    }
   led_init();                         /* 初始化LED */
   i2c0_master = iic_init(I2C_NUM_0);  /* 初始化IIC0 */
   spi2_init();                        /* 初始化SPI2 */
   xl9555_init(i2c0_master);           /* IO擴展芯片初始化 */
   lcd_init();                         /* 初始化LCD */
   lcd_show_string(10, 80, 240, 32, 32, "ESP32-S3", RED);
   lcd_show_string(10, 120, 240, 24, 24, "WiFi SCANTest", RED);
   lcd_show_string(10, 150, 240, 16, 16, "ATOM@ALIENTEK", RED);
   lcd_draw_line(190,0,190,239,DARKBLUE);
    wifi_scan();
    while (1)
    {
       LED_TOGGLE();
       vTaskDelay(500);
    }
}

在上述源碼中,作者從wifi_scan函數開始講解,該函數首先創建了event loop事件回調,即任務事件處理機制。接着,配置WiFi為STA模式(設備連接熱點模式)並設置相應的參數,然後啓動WiFi。最後,程序會掃描附近的12個熱點,並在LCD上顯示熱點的名稱。此外,讀者還可以通過串口查看熱點的安全模式等身份認證信息。

48.4 下載驗證

程序下載成功後,我們可以看到LCD顯示附近20個熱點名稱,如下圖所示:

圖48.4.1 SPILCD顯示效果圖

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.