在 ESP32 IDF 中,Wi-Fi(Wireless Fidelity)是一种无线网络技术,用于实现设备之间的无线数据传输和通信。ESP32 支持多种 Wi-Fi 标准和模式,例如:802.11b/g/n,AP 模式,STA 模式,网桥模式等。
下面是一些常用的 ESP32 Wi-Fi API 函数:
- esp_wifi_init()
用于初始化 Wi-Fi 驱动程序。函数原型如下:
esp_err_t esp_wifi_init(wifi_init_config_t *cfg);
- esp_wifi_start()
用于启动 Wi-Fi 驱动程序。函数原型如下:
esp_err_t esp_wifi_start(void);
- esp_wifi_stop()
用于停止 Wi-Fi 驱动程序。函数原型如下:
esp_err_t esp_wifi_stop(void);
- esp_wifi_set_mode()
用于设置 ESP32 Wi-Fi 工作模式。函数原型如下:
esp_err_t esp_wifi_set_mode(wifi_mode_t mode);
- esp_wifi_connect()
用于连接到 Wi-Fi 网络。函数原型如下:
esp_err_t esp_wifi_connect(void);
- esp_wifi_disconnect()
用于断开 Wi-Fi 连接。函数原型如下:
esp_err_t esp_wifi_disconnect(void);
- esp_wifi_scan_start()
用于开始 Wi-Fi 扫描。函数原型如下:
esp_err_t esp_wifi_scan_start(wifi_scan_config_t *config, bool block);
通过使用这些 API 函数,我们可以很容易地实现 ESP32 Wi-Fi 的初始化、连接、扫描等功能。下面是一个简单的示例,演示如何在 ESP32 上连接到 Wi-Fi 网络。
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "freertos/event_groups.h"
static const char *TAG = "wifi station";
/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;
/* The event group allows multiple bits for each event, but we only care about one event - are we connected to the AP with an IP? */
const int WIFI_CONNECTED_BIT = BIT0;
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch(event->event_id) {
case SYSTEM_EVENT_STA_START:
ESP_LOGI(TAG, "Wi-Fi started");
esp_wifi_connect();
break;
case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "Got IP address");
xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
ESP_LOGI(TAG, "Disconnected from Wi-Fi network");
esp_wifi_connect();
xEventGroupClearBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
break;
default:
break;
}
return ESP_OK;
}
static void wifi_connect() {
wifi_config_t wifi_config = {
.sta = {
.ssid = "your_SSID",
.password = "your_PASSWORD",
},
};
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_start();
}
void app_main()
{
s_wifi_event_group = xEventGroupCreate();
tcpip_adapter_init();
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&wifi_init_config) );
wifi_connect();
EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, WIFI_CONNECTED_BIT, pdFALSE, pdFALSE, portMAX_DELAY);
if ((bits & WIFI_CONNECTED_BIT) == 0) {
ESP_LOGE(TAG, "Failed to connect to Wi-Fi network");
return;
}
while(true) {
ESP_LOGI(TAG, "Connected to Wi-Fi network.");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
在代码中,我们首先使用 wifi_init_config_t 结构体初始化 Wi-Fi 驱动程序并设置 Wi-Fi 连接配置信息。然后我们使用 esp_wifi_start() 函数来启动 Wi-Fi 驱动程序,并使用 esp_wifi_connect() 函数来连接到 Wi-Fi 网络。
为了处理 Wi-Fi 连接相关事件,我们使用 esp_event_loop_init() 函数来初始化事件循环处理器,并使用 SYSTEM_EVENT_STA_GOT_IP、SYSTEM_EVENT_STA_START 和 SYSTEM
_EVENT_STA_DISCONNECTED 事件处理器来处理 Wi-Fi 连接相关事件。当 ESP32 连接到 Wi-Fi 网络时,SYSTEM_EVENT_STA_GOT_IP 事件将被触发,并通过 xEventGroupSetBits() 函数设置 WIFI_CONNECTED_BIT 位。当连接断开时,SYSTEM_EVENT_STA_DISCONNECTED 事件将被触发,并通过 xEventGroupClearBits() 函数清除 WIFI_CONNECTED_BIT。
在代码的最后,我们使用 xEventGroupWaitBits() 函数来等待 WIFI_CONNECTED_BIT 位被设置,表示 ESP32 已成功连接到 Wi-Fi 网络。如果连续等待一段时间后这个位没有设置,将会输出错误日志并退出程序。
总之,在 ESP32 IDF 中,Wi-Fi 是一种非常灵活和强大的无线网络技术,通过使用 Wi-Fi API 函数,我们可以轻松地实现各种 Wi-Fi 连接、扫描、控制等功能,帮助我们构建更加智能和高效的 IoT 应用程序。