一、 ESP32-C3 WIFI的工作模式
ESP32 的 Wi-Fi 可以工作在以下幾種工作狀態:
- Station 模式(STA):在這種模式下,ESP32 連接到一個已經存在的無線網絡,類似于一臺普通的 Wi-Fi 客戶端設備。
- Access Point 模式(AP):在這種模式下,ESP32 自己作為一個 Wi-Fi 熱點,并接受其他 Wi-Fi 客戶端設備的連接,類似于一個路由器。
- Station + Access Point 模式(STA+AP):在這種模式下,ESP32 同時工作在 Station 和 Access Point 兩種模式下,既可以連接到已有的 Wi-Fi 網絡,也可以提供 Wi-Fi 熱點。
- Wi-Fi Direct 模式(P2P):在這種模式下,ESP32 作為 Wi-Fi Direct 設備,可以直接和其他 Wi-Fi Direct 設備進行通信,不需要使用路由器。
- Promiscuous 模式:在這種模式下,ESP32 可以在監聽所有 Wi-Fi 數據包,而不僅僅是與它連接的 AP 或者 P2P 設備相關的數據包。
前面文章介紹了ESP32作為 Station的工作模式,今天使用其Access Point模式。
二、SoftAP配置
1.wifi_config_t結構體
示例代碼設置 ESP32 的 Wi-Fi 模塊工作在 AP 模式下,同時配置 Wi-Fi AP 熱點的一些參數,方便客戶端連接:
// 設置為AP模式,配置名稱,密碼,頻道,最大連接數,認證模式
wifi_config_t wifi_config = {
.ap = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
.channel = EXAMPLE_ESP_WIFI_CHANNEL,
.password = EXAMPLE_ESP_WIFI_PASS,
.max_connection = EXAMPLE_MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK
},
};
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
2.wifi_event_handler事件
(1)esp_event_handler_instance_register注冊事件
示例:
//wifi相關設置初始化
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, //檢查
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
NULL));
esp_event_handler_instance_register用于在事件循環中注冊事件處理程序,其參數解釋:
- WIFI_EVENT:事件的基礎類型,該函數將向WiFi事件注冊處理程序。
- ESP_EVENT_ANY_ID:這是事件ID,這里使用ESP_EVENT_ANY_ID表示注冊所有WiFi事件。
- &wifi_event_handler:這是事件處理程序的指針,它將在WiFi事件發生時被調用。
- NULL:這是事件處理程序的參數,這里沒有使用參數,因此將其設置為NULL。
- NULL:這是事件處理程序的實例,這里沒有使用多個實例,因此將其設置為NULL。
(2)system_event_sta_connected_t結構體
在ESP-IDF中,當一個設備通過WiFi連接到ESP32的WiFi熱點時,ESP32會觸發一個連接事件。 這個事件會包含一個結構體
system_event_sta_connected_t,其中包含連接設備的MAC地址(event->mac)和連接設備在該AP熱點下的AID(event->aid)。
其中,event->aid代表的是連接設備在AP熱點下的AID(Association ID),AID是一個整數值,表示AP熱點中連接的設備的編號。
在802.11標準中,AID是一個由AP熱點指派的,可以被用來唯一標識一個STA(Station)設備的值。 在ESP-IDF中,AID的范圍是1~16,代表連接的設備數量。
3. 關閉SoftAP
ESP_LOGI(TAG, "Max clients reached, shutting down AP");
// 關閉 softAP
esp_wifi_stop();
esp_wifi_deinit();
esp_netif_deinit();
vTaskDelete(NULL);
三、示例
ESP32可以通過Wi-Fi芯片在AP(接入點)模式下運行,充當熱點。 下面是開啟ESP32熱點的步驟:
1. 主要
#include
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include
#include "network/include/wifi.h"
#include "network/include/wifi_sta.h"
#include "network/include/wifi_ap.h"
static const char *TAG = "wifi connection";
void app_main()
{
ESP_LOGE(TAG, "app_main");
// 初始化NVS存儲區
esp_err_t ret = nvs_flash_init();
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();
}
ESP_ERROR_CHECK(ret);
// Wi-Fi初始化
ESP_LOGI(TAG, "Wi-Fi initialization");
wifi_initialize();
// ---------- WiFi SoftAp -----------------
wifi_init_softap();
while (1) {
vTaskDelay(pdMS_TO_TICKS(500));
}
}
2. wifi_ap.h
//
// Created by hs26661 on 2023/2/25.
//
#ifndef ESP32_LEARN_WIFI_AP_H
#define ESP32_LEARN_WIFI_AP_H
void wifi_init_softap(void);
#endif //ESP32_LEARN_WIFI_AP_H
3. wifi_ap.c
#include "string.h"
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_wifi_default.h"
#include "freertos/event_groups.h"
EventGroupHandle_t s_wifi_event_group;
#define EXAMPLE_ESP_WIFI_SSID "ESP32" // wifi名稱
#define EXAMPLE_ESP_WIFI_PASS "12345678" // wifi密碼
#define EXAMPLE_ESP_WIFI_CHANNEL 1 // wifi頻道 1
#define EXAMPLE_MAX_STA_CONN 4 // WiFi最大接入數 4
static const char *TAG = "wifi softAP lib";
/*wifi事件處理函數*/
void wifi_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
if (event_id == WIFI_EVENT_AP_STACONNECTED) {
// 如果有客戶端接入wifi
wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *) event_data;
// 設備MAC地址,狀態(接入/離開),分配到的id號
// MACSTR是一個宏定義,用于將MAC地址以字符串形式打印出來
ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid);
} else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
// 沒有客戶端連接
wifi_event_ap_stadisconnected_t *event = (wifi_event_ap_stadisconnected_t *) event_data;
ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d", MAC2STR(event->mac), event->aid);
}
}
void wifi_init_softap(void) {
esp_netif_create_default_wifi_ap();
//wifi相關設置初始化
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
//wifi相關設置初始化
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, //檢查
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
NULL));
// 設置為AP模式,配置名稱,密碼,頻道,最大連接數,認證模式
wifi_config_t wifi_config = {
.ap = {
.ssid = EXAMPLE_ESP_WIFI_SSID,
.ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID),
.channel = EXAMPLE_ESP_WIFI_CHANNEL,
.password = EXAMPLE_ESP_WIFI_PASS,
.max_connection = EXAMPLE_MAX_STA_CONN,
.authmode = WIFI_AUTH_WPA_WPA2_PSK
},
};
//如果密碼長度為0(未設置密碼),則認證模式改為開放
if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {
wifi_config.ap.authmode = WIFI_AUTH_OPEN;
}
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
//WiFi_AP初始化完成,串口輸出信息
ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d",
EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL);
}
運行效果:
-
芯片
+關注
關注
456文章
51170瀏覽量
427210 -
無線網絡
+關注
關注
6文章
1443瀏覽量
66087 -
路由器
+關注
關注
22文章
3744瀏覽量
114467 -
WIFI
+關注
關注
81文章
5308瀏覽量
204758 -
ESP32
+關注
關注
18文章
978瀏覽量
17523
發布評論請先 登錄
相關推薦
評論