admin管理员组

文章数量:1619282

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录       _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

       确定

文章目录

    • 一、ESP32 WIFI介绍
    • 二、WiFi 的启动(STA 及 AP 模式)
      • 1. WiFi STA 模式(连接到其他设备的热点)
        • (1) 步骤及API简介
        • (2) 分步讲解
        • (3) 完整代码示例
      • 2. WiFi AP 模式(ESP32作为热点供其他设备链接)
    • 三、STA模式下扫描外部WiFi
      • 1. 步骤
      • 2. 代码示例

一、ESP32 WIFI介绍

Wi-Fi 库支持配置及监控 ESP32 Wi-Fi 连网功能。

支持配置:

  • 基站模式(即 STA 模式或 Wi-Fi 客户端模式),此时 ESP32 连接到接入点 (AP)。

  • AP 模式(即 Soft-AP 模式或接入点模式),此时基站连接到 ESP32。

  • AP-STA 共存模式(ESP32 既是接入点,同时又作为基站连接到另外一个接入点)。

  • 上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。

  • 扫描接入点(包括主动扫描及被动扫描)。

  • 使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。

二、WiFi 的启动(STA 及 AP 模式)

1. WiFi STA 模式(连接到其他设备的热点)

(1) 步骤及API简介

① 初始化nvs_flash
② 初始化esp_netif
③ 创建事件循环event_loop —— event_loop是esp32库的一种事件处理模式,中文曰“事件循环”
④ 初始化、配置WiFi并启动
⑤ 事件处理(使用第③步创建的事件循环)

(2) 分步讲解

① 初始化nvs_flash

#include <nvs_flash.h>

/**
 * @brief 用于初始化nvs
 */
void init_nvs() {
   
	/*尝试初始化一次nvs_flash*/
    esp_err_t err = nvs_flash_init();
    if(err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND){
   
    /*第一次初始化失败, 检查错误, 处理错误, 重新初始化*/
        nvs_flash_erase();
        err = nvs_flash_init();
    }
    ESP_ERROR_CHECK(err);
}

② 初始化event_loop

#include "esp_event.h"

esp_event_loop_create_default();

esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
									想要用于处理事件的函数, NULL, &wifi_handler);
esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP,
									想要用于处理时间的函数, NULL, &ip_handler));

代码解析:

  • esp_event_loop_create_default(); 函数用于创建一个默认的事件循环(同一个esp32程序中可以有多个event_loop,这里使用默认的事件循环)
  • esp_event_handler_instance_register() 函数解析见下:
函数名 esp_event_handler_instance_register()
函数原型 esp_err_t esp_event_handler_instance_register(esp_event_base_t event_base, int32_t event_id, esp_event_handler_t event_handler, void *event_handler_arg, esp_event_handler_instance_t *instance)
含义 将事件处理程序的实例注册到默认循环。
返回值 esp_err_t
参数 event_base类型为:esp_event_base_t;表示 事件基,代表事件的大类(如WiFi事件,IP事件等)
event_id类型为:int32_t;表示事件ID,即事件基下的一个具体事件(如WiFi连接丢失,IP成功获取)
event_handler类型为:esp_event_handler_t;表示一个handler函数(模板请见第⑤步
*event_handler_arg类型为:void;表示需要传递给handler函数的参数
*instance类型为:esp_event_handler_instance_t指针;**[输出]**表示此函数注册的事件实例对象,用于生命周期管理(如删除unrigister这个事件handler)

③ 初始化esp_netif

#include "esp_netif.h"

esp_netif_t *pEsp_wifi_netif;

esp_netif_init();

/*创建wifi sta模式的默认netif, 返回一个指针*/
pEsp_wifi_netif = esp_netif_create_default_wifi_sta();

/* (非必须) 这行代码是修改ESP32的主机名, 即WiFi设备名, 连接其他WiFi时显示的名称 */
esp_netif_set_hostname(esp_wifi_netif, "Augtons");// 不建议使用汉字

上述代码第 6 行函数esp_netif_create_default_wifi_sta()是必要的,只不过函数返回值可以在不需要的时候忽略(本文我们借助这个创建得到的esp_netif对象来修改了主机名为Augtons,因此保留了这个返回值)

④ 初始化、配置WiFi并启动

注意:下文的代码实例只展示了最简单的wifi连接代码,实际上第4行配置的结构体下的sta还有很多成员,这里不再细讲

#include "driver/wifi.h"
/* 第一步, WiFi初始化 */
/*
	这个宏 WIFI_INIT_CONFIG_DEFAULT() 可以初始化一 			
	个wifi_init_config(wifi初始化配置)结构体为默认值
*/
wifi_init_config_t wifi_init_config = WIFI_INIT_CONFIG_DEFAULT(

本文标签: 两种模式espwifiIDF