一、概述
WIFI是ESP32的核心功能之一,作为一款专为IOT设计的芯片,ESP32的WIFI功能是非常完善的,可以作AP,也可以做STA,还可以同时作为STA和AP。
二、ESP32的WIFI配置
ESP32的WIFI特点:
- WIFI可作为AP、STA以及AP+STA三种模式
- 作为 AP 时,可以被 4 个 STA 连接
- AP 是 (Wireless) AccessPoint 的缩写,即 (无线) 访问接入点。简单来讲就像是无线路由器一样,设备打开后进入 AP 模式,在手机的网络列表里面,可以搜索到类似TPLINK_XXX 的名字(SSID)
- STA 是每一个连接到无线网络中的终端(如笔记本电脑、手机、PAD 及其它可以联网的用
户设备)都可称为一个站点,STA 本身并不接受无线的接入,它可以连接到 AP。
ESP32开启WIFI热点流程:
按照以上流程,通过调用API函数,以及设置一些自定义参数,如SSID,PASSWORD等,可以实现创建WIFI的目的。
在 ESP-IDF 中,整个 wifi 协议栈是一个状态机,它在各个时刻都有一个状态。用户可以根据自己的需要,让协议栈在某个状态时自动处理某些工作。在调用 esp_event_loop_init()
函数时 ,我们传入了一个参数 event_handler
,它是一个函数指针,当wifi状态机的状态变化时,会调用函数 event_handler()
,并给它传递适当的参数。
ESP32 WIFI状态机工作原理流程图如下:
状态机解析函数:
回调原型 | static esp_err_t event_handler ( void *ctx, system_event_t *event ) |
函数功能 | WIFI状态机回调函数(状态发生改变时回调) |
参数 | [in] event: //事件 ID 取值 SYSTEM_EVENT_AP_STADISCONNECTED, /*有 STA 断开 ESP32 的 AP*/ |
返回值 | ESP_OK:成功 ESP_ERR_INVALID_ARG : 参数错误 |
1. AP模式
本节将ESP32配置在AP模式下,作为一个wifi热点。手机或电脑可以通过TCP协议链接ESP32,进行通讯。
以下为WIFI初始化API介绍:
- 设置 WiFi 回调函数 esp_event_loop_init();
回调原型 | esp_err_t esp_event_loop_init ( system_event_cb_t cb, void *ctx ) |
函数功能 | 初始化事件 loop,设置 WiFi 回调函数 |
参数 | [in] cb:回调函数指针 [in] ctx:系统调用回调函数时需要传递给回调函数的参数 |
返回值 | ESP_OK:成功 other: 失败 |
- esp_wifi_set_mode(WIFI_MODE_AP) 设置wifi工作模式
- esp_wifi_start() 启动
wifi.h文件内容:
#ifndef COMPONENTS_WIFI_INCLUDE_WIFI_H_
#define COMPONENTS_WIFI_INCLUDE_WIFI_H_
#include <stdio.h>
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "esp_event.h"
#define PORT CONFIG_EXAMPLE_PORT
#define KEEPALIVE_IDLE CONFIG_EXAMPLE_KEEPALIVE_IDLE
#define KEEPALIVE_INTERVAL CONFIG_EXAMPLE_KEEPALIVE_INTERVAL
#define KEEPALIVE_COUNT CONFIG_EXAMPLE_KEEPALIVE_COUNT
void wifi_init_softap(void);
static esp_err_t event_handler(void *ctx, system_event_t *event); //事件处理函数
#endif /* COMPONENTS_WIFI_INCLUDE_WIFI_H_ */
wifi.c文件内容:
#include "wifi.h"
/**
* wifi事件处理函数
*/
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
switch (event->event_id)
{
case SYSTEM_EVENT_AP_START:
printf("\nwifi_softap_start\n");
break;
case SYSTEM_EVENT_AP_STACONNECTED:
printf("\nwifi_softap_connectted\n");
break;
case SYSTEM_EVENT_AP_STADISCONNECTED:
printf("\nwifi_softap_disconnectted\n");
break;
default:
break;
}
return ESP_OK;
}
/**
* wifi初始化
*/
void wifi_init_softap(){
ESP_ERROR_CHECK( nvs_flash_init() );
tcpip_adapter_init();
ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
//配置热点
wifi_config_t wifi_config = {
.ap = {
.ssid = "wangy_wifi",
.ssid_len = 0,
/* 最多只能被4个station同时连接,这里设置为只能被一个station连接 */
.max_connection = 1,
.password = "20211219",
.authmode = WIFI_AUTH_WPA_WPA2_PSK,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); //设置AP模式
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config));//配置AP模式参数
ESP_ERROR_CHECK(esp_wifi_start()); //启动
}
2. STA模式
ESP32配置为STA模式非常简单,只需要修改上述AP模式参数即可。
三、结束
本节介绍了ESP32 使用wifi功能时的两种模式,分别为AP以及STA模式。