ESP-C3入门13. SoftAP模式

  • 一、 ESP32-C3 WIFI的工作模式
  • 二、SoftAP配置
    • 1. `wifi_config_t` 结构体
    • 2. `wifi_event_handler ` 事件
      • (1) `esp_event_handler_instance_register` 注册事件
      • (2) `system_event_sta_connected_t` 结构体
    • 3. 关闭SoftAP
  • 三、示例
    • 1. main.c
    • 2. wifi_ap.h
    • 3. wifi_ap.c

一、 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");// 关闭 softAPesp_wifi_stop();esp_wifi_deinit();esp_netif_deinit();vTaskDelete(NULL);

三、示例

ESP32可以通过Wi-Fi芯片在AP(接入点)模式下运行,充当热点。下面是开启ESP32热点的步骤:

1. main.c

#include <string.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"#include <nvs_flash.h>
#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最大接入数 4static 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) {// 如果有客户端接入wifiwifi_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);
}

运行效果:

ESP-C3入门13. SoftAP模式相关推荐

  1. Golang并发模型:轻松入门流水线FAN模式

    前一篇文章<Golang并发模型:轻松入门流水线模型>,介绍了流水线模型的概念,这篇文章是流水线模型进阶,介绍FAN-IN和FAN-OUT,FAN模式可以让我们的流水线模型更好的利用Gol ...

  2. ios单应用模式_如何为iOS 13暗模式设置应用

    ios单应用模式 Apple launched the much-awaited iOS 13 updates globally on September 19 across all iPhones ...

  3. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  4. 苹果iOS 13暗黑模式概念图曝光 将于iOS 13.1版本更新

    iOS的暗黑模式一直是广大用户迫切关注的功能之一.此前在iOS 12发布之际,很多用户都非常期待苹果可以推出基于iOS的深色主题模式,网友们也将这种模式称为"暗黑模式".iOS 1 ...

  5. 安卓13开发者模式怎么开?

    很多时候我们操作一些功能都需要进入到系统的开发者模式下才可以操作,有很多用户不知道怎么进入,其实很简单,只需要进入手机设置找到安卓系统版本然后点击就可以了. 安卓13开发者模式怎么开 1.进入手机设置 ...

  6. FFmpeg4入门13:h264编码为mp4

    上一篇将yuv源视频文件编码为*.h264的由libx264实现压缩的文件,将源文件从55M编码为620KB,但是h264文件只有视频数据,而且使用范围不太广.那么就需要进一步的封装,在此选用最常用的 ...

  7. 05_RabbitMQ入门案例—fanout模式Direct模式Topic模式

    RabbitMQ入门案例-fanout模式 package com.tian.rabbitmq.routing;import com.rabbitmq.client.Channel; import c ...

  8. Java设计模式快速入门之外观模式

    3.2Java设计模式快速入门之外观模式 3.2.1概念 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向 ...

  9. uni-app 5小时快速入门 13 uni-app路由

    uni-app 5小时快速入门 13 uni-app路由 文章目录 uni-app 5小时快速入门 13 uni-app路由 13.1 具体操作 13.1.1 创建新项目 13.1.2 添加几个页面 ...

最新文章

  1. vue更新data中的数据页面不渲染_vue更新obj类data的属性无效,页面data没刷新解决方法vue.set...
  2. loadrunner提高篇 - 结果分析实践
  3. C编译器、链接器、加载器详解
  4. 会员系统中需要验证用户的邮箱是否真实存在
  5. 剑英的区块链学习手记(一)
  6. Git----分支管理之分支管理策略04
  7. 6.dubbo常用的xml配置有哪些_【面试篇】必须掌握的Spring 常用注解
  8. iOS oc 线程 进程,同步异步,并发串行,来捋捋
  9. 【零基础学Java】—初识Java(一)
  10. vc6.0 debug 比 release 快??_全网稀缺的快应用开源项目熊宝儿歌故事QuickApp
  11. 教你彻底卸载Ubuntu双系统,去污不残留
  12. Android手机root概念
  13. 按Volume Down进Factory Mode的修改:
  14. 计算理论基础 第2版 Harry R. Lewis 第1章
  15. Office XP 试用感受
  16. ASCII码与英文的显示原理
  17. 我做产品的三大思维:发散思维、纵横思维和表里思维(下篇)
  18. notify()会立刻释放锁么?
  19. linux_系统帮助propos/whatis/which/whereis/man/info/help...)/bashzsh/build-in command帮助/wildcard/regex
  20. 深刻揭露步态识别的“谎言”(篇二:深度学习乱拳打进来)

热门文章

  1. 关于在CentOS上安装网易云音乐的一些tips
  2. 王者荣耀账号转服务器,《王者荣耀》账号怎么转区 账号转区方法
  3. html访问xlsx文件,【html】xlsx文件实现预览,浏览器实现xlsx文件的预览,前端实现xlsx文件的预览...
  4. AttributeError: 'Bullet' object has no attribute 'draw_bullet'
  5. win10关机后cpu风扇还在转_电脑自动关机或重启的解决办法(笔记本)
  6. Android夜间模式的简单实现
  7. 洪荒:我的身份被诸天大能曝光了(三)
  8. 捉虫 | mmlab 系列安装过程遇到的问题合集
  9. 该如何从 Java 8 升级到 Java 10
  10. Linux实现控制U盘只读