0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32-C3 WIFI的工作模式

CHANBAEK 来源:编程圈子 作者:编程圈子 2023-03-13 15:38 次阅读

一、 ESP32-C3 WIFI的工作模式

ESP32 的 Wi-Fi 可以工作在以下几种工作状态:

  • Station 模式(STA):在这种模式下,ESP32 连接到一个已经存在的无线网络,类似于一台普通的 Wi-Fi 客户端设备。
  • Access Point 模式(AP):在这种模式下,ESP32 自己作为一个 Wi-Fi 热点,并接受其他 Wi-Fi 客户端设备的连接,类似于一个路由器。
  • Station + Access Point 模式(STA+AP):在这种模式下,ESP32 同时工作在 Station 和 Access Point 两种模式下,既可以连接到已有的 Wi-Fi 网络,也可以提供 Wi-Fi 热点。
  • Wi-Fi Direct 模式(P2P):在这种模式下,ESP32 作为 Wi-Fi Direct 设备,可以直接和其他 Wi-Fi Direct 设备进行通信,不需要使用路由器。
  • Promiscuous 模式:在这种模式下,ESP32 可以在监听所有 Wi-Fi 数据包,而不仅仅是与它连接的 AP 或者 P2P 设备相关的数据包。

前面文章介绍了ESP32作为 Station的工作模式,今天使用其Access Point模式。

二、SoftAP配置

1.wifi_config_t结构体

示例代码设置 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));

2.wifi_event_handler事件

(1)esp_event_handler_instance_register注册事件

示例:

//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用于在事件循环中注册事件处理程序,其参数解释:

  • WIFI_EVENT:事件的基础类型,该函数将向WiFi事件注册处理程序。
  • ESP_EVENT_ANY_ID:这是事件ID,这里使用ESP_EVENT_ANY_ID表示注册所有WiFi事件。
  • &wifi_event_handler:这是事件处理程序的指针,它将在WiFi事件发生时被调用。
  • NULL:这是事件处理程序的参数,这里没有使用参数,因此将其设置为NULL。
  • NULL:这是事件处理程序的实例,这里没有使用多个实例,因此将其设置为NULL。

(2)system_event_sta_connected_t结构体

在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,代表连接的设备数量。

3. 关闭SoftAP

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热点的步骤:

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存储区
    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最大接入数 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);
}

运行效果:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    454

    文章

    50679

    浏览量

    423007
  • 无线网络
    +关注

    关注

    6

    文章

    1431

    浏览量

    65924
  • 路由器
    +关注

    关注

    22

    文章

    3723

    浏览量

    113692
  • WIFI
    +关注

    关注

    81

    文章

    5295

    浏览量

    203546
  • ESP32
    +关注

    关注

    18

    文章

    968

    浏览量

    17194
收藏 人收藏

    评论

    相关推荐

    使用ESP32-C3的SoftAP模式创建Wi-Fi热点,ESP32-C3不输出任何日志,并且无法响应,为什么?

    问题描述: 我正在使用ESP32-C3的SoftAP模式创建Wi-Fi热点,并使用手机连接到该热点。当手机连接成功并熄屏一段时间后,我发现手机无法获取热点的信息。在此期间,ESP32-C3不输
    发表于 06-07 08:26

    浅谈ESP32-C3ESP32-S3芯片

    ESP32-C3ESP32-S3的发布,不仅为IOT行业提供了高性价比、稳定、好用、安全的通讯层,支持AI加速,同时在显示层应用也将占有一席之地。
    发表于 04-28 10:37 1.9w次阅读

    ESP32-C3芯片的性价比有多高

    今天小明为大家捋一捋ESP32-C3性价比到底有多高呢?很多在说乐鑫急着发布ESP32-C3ESP32-S3,是在布一个大局,到底在布啥局呢?
    发表于 04-28 09:52 5229次阅读
    <b class='flag-5'>ESP32-C3</b>芯片的性价比有多高

    浅谈ESP32-C3芯片的应用领域

    之前大家期待已久的ESP32-C3,将在4月份量产啦!届时大家可以看到它的真面目。那么介绍了那么多,它的应用有哪些?
    发表于 04-06 14:31 3173次阅读

    ESP32-C3芯片到底有哪些特性

    五一假期,让大家身处快乐星球一般。现在假期结束了,快乐难道就消失了吗?答案是否定的。快乐其实很简单,本月乐鑫esp32驱动86面板,esp32-C3 +2.4寸彩屏,esp32- C3
    发表于 06-01 18:12 3025次阅读

    ESP32-C3模组芯片的功能特性

    重磅消息来喽!本月乐鑫esp32驱动86面板,esp32-C3 +2.4寸彩屏,esp32- C3+1.3寸圆屏 QSPI即将出品!一颗mcu搞定W
    发表于 06-03 11:22 2074次阅读

    基于nanoESP32-C3开发板用ESP32-c3下试跑Zephyr

    上周MuseLab的吴同学寄来一片nanoESP32-C3–一块带有ESPLink(base DAPlink)的ESP32-C3开发板。 正好最近支持esp32-c3的pr已经merge进入
    的头像 发表于 08-09 09:10 9383次阅读

    通用型WiFi和低功耗蓝牙模组ESP32-C3的优势特征及应用范例

    ESP32-C3-WROOM-02(简称ESP32-C3)模组是一款专为物联网应用场景设计的通用型 WiFi 和低功耗蓝牙模组,安全性高、内存充足、外设接口多、应用场景丰富、尺寸小,可用于智能家居、工业自动化、医疗、消费电子产品
    的头像 发表于 06-24 10:16 4563次阅读

    【DFRobot Beetle ESP32-C3开发板试用体验】车载导航天气挂件?

    1602A显示屏 合宙Air 551G导航模块 DFRobot Beetle ESP32-C3开发板 杜邦线若干 连接方式 跟之前的连接一样。 ESP32-C3通过自制一分二的线分别给LCD屏幕和Air
    的头像 发表于 11-28 11:01 1315次阅读
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>开发板试用体验】车载导航天气挂件?

    【DFRobot Beetle ESP32-C3开发板试用体验】开箱和1602A显示

    提供的 DFRobot Beetle ESP32-C3 开发板 试用机会。 拿到板子后,感觉的确是很小,比之前买的一个esp32 C3板子要小上一半。盒子里包含ESP32-C3开发板、
    的头像 发表于 11-28 14:06 1822次阅读
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>开发板试用体验】开箱和1602A显示

    ESP32-C3硬件定时器简介及使用

    ESP32-C3 有2个定时器组,每个组有2个定时器,共有4个定时器。
    的头像 发表于 03-14 11:43 4733次阅读
    <b class='flag-5'>ESP32-C3</b>硬件定时器简介及使用

    启明云端分享|盘点Esp32-C3Esp8266 的区别

    Tensilica处理器;2.工作电压方面,ESP32-C3也略低于ESP8266;3.GPIO口,ESP32-C3具有22个可编程GPIO
    的头像 发表于 10-12 18:31 5089次阅读
    启明云端分享|盘点<b class='flag-5'>Esp32-C3</b>与<b class='flag-5'>Esp</b>8266 的区别

    启明云端测试分享|ESP32-C3连接阿里云

    启明云端手把手教程ESP32-C3连接阿里云
    的头像 发表于 09-13 15:10 2700次阅读
    启明云端测试分享|<b class='flag-5'>ESP32-C3</b>连接阿里云

    ESP32-C3在智能充电桩上的应用,性价比爆棚!

    ESP32-C3在智能充电桩上的应用,性价比爆棚!
    的头像 发表于 01-20 08:03 820次阅读
    <b class='flag-5'>ESP32-C3</b>在智能充电桩上的应用,性价比爆棚!

    乐鑫esp32系列在睡眠模式下保持蓝牙连接的功耗测试

    本教程适用于ESP32-S3ESP32-C3ESP32-C6睡眠模式介绍ESP32系列常见的休眠方式有三种,分别为Modem-sleep
    的头像 发表于 06-21 08:04 2566次阅读
    乐鑫<b class='flag-5'>esp32</b>系列在睡眠<b class='flag-5'>模式</b>下保持蓝牙连接的功耗测试