ESP32 的 Wi-Fi 可以工作在以下几种工作状态:
前面文章介绍了ESP32作为 Station的工作模式,今天使用其Access Point模式。
示例代码设置 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));
示例:
//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用于在事件循环中注册事件处理程序,其参数解释:
在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,代表连接的设备数量。
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热点的步骤:
#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));
}
}
//
// 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
#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);
}
运行效果:
全部0条评论
快来发表一下你的评论吧 !