一、 ESP32-C3 WIFI的工作模式
ESP32 的 Wi-Fi 可以工作在以下幾種工作狀態(tài):
- Station 模式(STA):在這種模式下,ESP32 連接到一個(gè)已經(jīng)存在的無線網(wǎng)絡(luò),類似于一臺(tái)普通的 Wi-Fi 客戶端設(shè)備。
- Access Point 模式(AP):在這種模式下,ESP32 自己作為一個(gè) Wi-Fi 熱點(diǎn),并接受其他 Wi-Fi 客戶端設(shè)備的連接,類似于一個(gè)路由器。
- Station + Access Point 模式(STA+AP):在這種模式下,ESP32 同時(shí)工作在 Station 和 Access Point 兩種模式下,既可以連接到已有的 Wi-Fi 網(wǎng)絡(luò),也可以提供 Wi-Fi 熱點(diǎn)。
- Wi-Fi Direct 模式(P2P):在這種模式下,ESP32 作為 Wi-Fi Direct 設(shè)備,可以直接和其他 Wi-Fi Direct 設(shè)備進(jìn)行通信,不需要使用路由器。
- Promiscuous 模式:在這種模式下,ESP32 可以在監(jiān)聽所有 Wi-Fi 數(shù)據(jù)包,而不僅僅是與它連接的 AP 或者 P2P 設(shè)備相關(guān)的數(shù)據(jù)包。
前面文章介紹了ESP32作為 Station的工作模式,今天使用其Access Point模式。
二、SoftAP配置
1.wifi_config_t結(jié)構(gòu)體
示例代碼設(shè)置 ESP32 的 Wi-Fi 模塊工作在 AP 模式下,同時(shí)配置 Wi-Fi AP 熱點(diǎn)的一些參數(shù),方便客戶端連接:
// 設(shè)置為AP模式,配置名稱,密碼,頻道,最大連接數(shù),認(rèn)證模式
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注冊(cè)事件
示例:
//wifi相關(guān)設(shè)置初始化
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, //檢查
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
NULL));
esp_event_handler_instance_register用于在事件循環(huán)中注冊(cè)事件處理程序,其參數(shù)解釋:
- WIFI_EVENT:事件的基礎(chǔ)類型,該函數(shù)將向WiFi事件注冊(cè)處理程序。
- ESP_EVENT_ANY_ID:這是事件ID,這里使用ESP_EVENT_ANY_ID表示注冊(cè)所有WiFi事件。
- &wifi_event_handler:這是事件處理程序的指針,它將在WiFi事件發(fā)生時(shí)被調(diào)用。
- NULL:這是事件處理程序的參數(shù),這里沒有使用參數(shù),因此將其設(shè)置為NULL。
- NULL:這是事件處理程序的實(shí)例,這里沒有使用多個(gè)實(shí)例,因此將其設(shè)置為NULL。
(2)system_event_sta_connected_t結(jié)構(gòu)體
在ESP-IDF中,當(dāng)一個(gè)設(shè)備通過WiFi連接到ESP32的WiFi熱點(diǎn)時(shí),ESP32會(huì)觸發(fā)一個(gè)連接事件。 這個(gè)事件會(huì)包含一個(gè)結(jié)構(gòu)體
system_event_sta_connected_t,其中包含連接設(shè)備的MAC地址(event->mac)和連接設(shè)備在該AP熱點(diǎn)下的AID(event->aid)。
其中,event->aid代表的是連接設(shè)備在AP熱點(diǎn)下的AID(Association ID),AID是一個(gè)整數(shù)值,表示AP熱點(diǎn)中連接的設(shè)備的編號(hào)。
在802.11標(biāo)準(zhǔn)中,AID是一個(gè)由AP熱點(diǎn)指派的,可以被用來唯一標(biāo)識(shí)一個(gè)STA(Station)設(shè)備的值。 在ESP-IDF中,AID的范圍是1~16,代表連接的設(shè)備數(shù)量。
3. 關(guān)閉SoftAP
ESP_LOGI(TAG, "Max clients reached, shutting down AP");
// 關(guān)閉 softAP
esp_wifi_stop();
esp_wifi_deinit();
esp_netif_deinit();
vTaskDelete(NULL);
三、示例
ESP32可以通過Wi-Fi芯片在AP(接入點(diǎn))模式下運(yùn)行,充當(dāng)熱點(diǎn)。 下面是開啟ESP32熱點(diǎn)的步驟:
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存儲(chǔ)區(qū)
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最大接入數(shù) 4
static const char *TAG = "wifi softAP lib";
/*wifi事件處理函數(shù)*/
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;
// 設(shè)備MAC地址,狀態(tài)(接入/離開),分配到的id號(hào)
// MACSTR是一個(gè)宏定義,用于將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相關(guān)設(shè)置初始化
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
//wifi相關(guān)設(shè)置初始化
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, //檢查
ESP_EVENT_ANY_ID,
&wifi_event_handler,
NULL,
NULL));
// 設(shè)置為AP模式,配置名稱,密碼,頻道,最大連接數(shù),認(rèn)證模式
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
},
};
//如果密碼長(zhǎng)度為0(未設(shè)置密碼),則認(rèn)證模式改為開放
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);
}
運(yùn)行效果:
-
芯片
+關(guān)注
關(guān)注
455文章
50816瀏覽量
423612 -
無線網(wǎng)絡(luò)
+關(guān)注
關(guān)注
6文章
1435瀏覽量
65943 -
路由器
+關(guān)注
關(guān)注
22文章
3732瀏覽量
113778 -
WIFI
+關(guān)注
關(guān)注
81文章
5297瀏覽量
203715 -
ESP32
+關(guān)注
關(guān)注
18文章
971瀏覽量
17261
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論