完整代码放在文末

1.wifi事件处理函数

/*wifi事件处理函数*/
static 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;ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",                          //串口输出TAG,设备MAC地址,状态(接入/离开),分配到的id号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);}
}

查看wifi_event_ap_staconnected_t定义

/** Argument structure for WIFI_EVENT_AP_STACONNECTED event */
typedef struct {uint8_t mac[6];           /**< MAC address of the station connected to ESP32 soft-AP */uint8_t aid;              /**< the aid that ESP32 soft-AP gives to the station connected to  */bool is_mesh_child;       /**< flag to identify mesh child */
} wifi_event_ap_staconnected_t;

查看wifi_event_ap_stadisconnected_t定义

/** Argument structure for WIFI_EVENT_AP_STADISCONNECTED event */
typedef struct {uint8_t mac[6];           /**< MAC address of the station disconnects to ESP32 soft-AP */uint8_t aid;              /**< the aid that ESP32 soft-AP gave to the station disconnects to  */bool is_mesh_child;       /**< flag to identify mesh child */
} wifi_event_ap_stadisconnected_t;

个人觉得可以理解aid=assigned id,分配到的id
所以这结构体里个成员的含义就很好理解了,依次是:
mac地址,分配到的id号,是否是当前wifi网络成员标志位(已进入、已离开)

2.wifi softap模式初始化

/*wifi softap模式初始化*/
void wifi_init_softap(void)
{ESP_ERROR_CHECK(esp_netif_init());                  //初始化检查ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_ap();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handler,NULL,NULL));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},};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());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);
}

查看cppwifi_init_config_t定义

/*** @brief WiFi stack configuration parameters passed to esp_wifi_init call.*/
typedef struct {system_event_handler_t event_handler;          /**< WiFi event handler */wifi_osi_funcs_t*      osi_funcs;              /**< WiFi OS functions */wpa_crypto_funcs_t     wpa_crypto_funcs;       /**< WiFi station crypto functions when connect */int                    static_rx_buf_num;      /**< WiFi static RX buffer number */int                    dynamic_rx_buf_num;     /**< WiFi dynamic RX buffer number */int                    tx_buf_type;            /**< WiFi TX buffer type */int                    static_tx_buf_num;      /**< WiFi static TX buffer number */int                    dynamic_tx_buf_num;     /**< WiFi dynamic TX buffer number */int                    cache_tx_buf_num;       /**< WiFi TX cache buffer number */int                    csi_enable;             /**< WiFi channel state information enable flag */int                    ampdu_rx_enable;        /**< WiFi AMPDU RX feature enable flag */int                    ampdu_tx_enable;        /**< WiFi AMPDU TX feature enable flag */int                    amsdu_tx_enable;        /**< WiFi AMSDU TX feature enable flag */int                    nvs_enable;             /**< WiFi NVS flash enable flag */int                    nano_enable;            /**< Nano option for printf/scan family enable flag */int                    rx_ba_win;              /**< WiFi Block Ack RX window size */int                    wifi_task_core_id;      /**< WiFi Task Core ID */int                    beacon_max_len;         /**< WiFi softAP maximum length of the beacon */int                    mgmt_sbuf_num;          /**< WiFi management short buffer number, the minimum value is 6, the maximum value is 32 */uint64_t               feature_caps;           /**< Enables additional WiFi features and capabilities */bool                   sta_disconnected_pm;    /**< WiFi Power Management for station at disconnected status */int                    magic;                  /**< WiFi init magic number, it should be the last field */
} wifi_init_config_t;

这结构体成员有点多,自己看吧

wifi_config_t定义

//共用体,来设置AP/STA模式
typedef union {wifi_ap_config_t  ap;  /**< configuration of AP */wifi_sta_config_t sta; /**< configuration of STA */
} wifi_config_t;

wifi_ap_config_t定义

typedef struct {uint8_t ssid[32];           /**< SSID of ESP32 soft-AP. If ssid_len field is 0, this must be a Null terminated string. Otherwise, length is set according to ssid_len. */uint8_t password[64];       /**< Password of ESP32 soft-AP. */uint8_t ssid_len;           /**< Optional length of SSID field. */uint8_t channel;            /**< Channel of ESP32 soft-AP */wifi_auth_mode_t authmode;  /**< Auth mode of ESP32 soft-AP. Do not support AUTH_WEP in soft-AP mode */uint8_t ssid_hidden;        /**< Broadcast SSID or not, default 0, broadcast the SSID */uint8_t max_connection;     /**< Max number of stations allowed to connect in, default 4, max 10 */uint16_t beacon_interval;   /**< Beacon interval which should be multiples of 100. Unit: TU(time unit, 1 TU = 1024 us). Range: 100 ~ 60000. Default value: 100 */wifi_cipher_type_t pairwise_cipher;   /**< pairwise cipher of SoftAP, group cipher will be derived using this. cipher values are valid starting from WIFI_CIPHER_TYPE_TKIP, enum values before that will be considered as invalid and default cipher suites(TKIP+CCMP) will be used. Valid cipher suites in softAP mode are WIFI_CIPHER_TYPE_TKIP, WIFI_CIPHER_TYPE_CCMP and WIFI_CIPHER_TYPE_TKIP_CCMP. */bool ftm_responder;         /**< Enable FTM Responder mode */
} wifi_ap_config_t;

wifi_sta_config_t定义

/** @brief STA configuration settings for the ESP32 */
typedef struct {uint8_t ssid[32];      /**< SSID of target AP. */uint8_t password[64];  /**< Password of target AP. */wifi_scan_method_t scan_method;    /**< do all channel scan or fast scan */bool bssid_set;        /**< whether set MAC address of target AP or not. Generally, station_config.bssid_set needs to be 0; and it needs to be 1 only when users need to check the MAC address of the AP.*/uint8_t bssid[6];     /**< MAC address of target AP*/uint8_t channel;       /**< channel of target AP. Set to 1~13 to scan starting from the specified channel before connecting to AP. If the channel of AP is unknown, set it to 0.*/uint16_t listen_interval;   /**< Listen interval for ESP32 station to receive beacon when WIFI_PS_MAX_MODEM is set. Units: AP beacon intervals. Defaults to 3 if set to 0. */wifi_sort_method_t sort_method;    /**< sort the connect AP in the list by rssi or security mode */wifi_scan_threshold_t  threshold;     /**< When sort_method is set, only APs which have an auth mode that is more secure than the selected auth mode and a signal stronger than the minimum RSSI will be used. */wifi_pmf_config_t pmf_cfg;    /**< Configuration for Protected Management Frame. Will be advertized in RSN Capabilities in RSN IE. */uint32_t rm_enabled:1;        /**< Whether Radio Measurements are enabled for the connection */uint32_t btm_enabled:1;       /**< Whether BSS Transition Management is enabled for the connection */uint32_t mbo_enabled:1;       /**< Whether MBO is enabled for the connection */uint32_t reserved:29;         /**< Reserved for future feature set */
} wifi_sta_config_t;

主函数

void app_main(void)
{//初始化NVS(非易失性存储),保存AP相关信息,使esp32断电重启后依然能工作WIFI_APesp_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);ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");wifi_init_softap();
}

NVS 指非易失性存储(NVS,nonvolatile storage,non-volatile storage),esp32 中的 NVS 使用的是 Flash,可以存储 softAP 的参数配置信息。如果不需要存储任何信息,可以不初始化 NVS,同时将 menuconfig->Component config->Wi-Fi->WiFi NVS flash 选项关闭。

参考:
示例历程中,softAP,为什么要初始化NVS

完整例程代码,softap_example_main.c

#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"#include "lwip/err.h"
#include "lwip/sys.h"/* The examples use WiFi configuration that you can set via project configuration menu.If you'd rather not, just change the below entries to strings withthe config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"例程使用的wifi配置你可以通过项目配置菜单来实现如果你不想这么搞,就修改下列定义比如#define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_ESP_WIFI_SSID "ESP32"                   //wifi名称
#define EXAMPLE_ESP_WIFI_PASS "123456789"               //wifi密码
#define EXAMPLE_ESP_WIFI_CHANNEL   CONFIG_ESP_WIFI_CHANNEL          //wifi频道 1
#define EXAMPLE_MAX_STA_CONN       CONFIG_ESP_MAX_STA_CONN          //WiFi最大接入数 4static const char *TAG = "wifi softAP";                 //串口输出信息TAG/*wifi事件处理函数*/
static 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;ESP_LOGI(TAG, "station "MACSTR" join, AID=%d",                          //串口输出TAG,设备MAC地址,状态(接入/离开),分配到的id号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);}
}/*wifi softap模式初始化*/
void wifi_init_softap(void)
{ESP_ERROR_CHECK(esp_netif_init());                  //初始化检查ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_ap();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();            //wifi相关设置初始化ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,             //检查ESP_EVENT_ANY_ID,&wifi_event_handler,NULL,NULL));wifi_config_t wifi_config = {                       //设置为AP模式,配置名称,密码,频道,最大连接数,认证模式.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},};if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0) {           //如果密码长度为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());ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d",          //WiFi_AP初始化完成,串口输出信息EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_CHANNEL);
}void app_main(void)
{//初始化NVS(非易失性存储),保存AP相关信息,使esp32断电重启后依然能工作WIFI_APesp_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);ESP_LOGI(TAG, "ESP_WIFI_MODE_AP");wifi_init_softap();
}

基于VScode的ESP32开发学习(二):官方例程softap,提供wifi,详解相关推荐

  1. 前端开发学习路径之阶段七:BootStrap详解

    Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript的,它在jQuery的基础上进行了更为个性化和人性化的完善,形成一 ...

  2. 安卓开发学习之002 LinearLayout之android:layout_gravity详解

    1.使用说明 这个是针对控件本身而言,用来控制该控件在包含该控件的父控件中的位置.同样,当我们在Button按钮控件中设置android:layout_gravity="left" ...

  3. 微信小程序开发学习笔记005--微信小程序组件详解

    先来再看看事件冒泡: 看个例子,新建项目库credemo05 case1.wxml <view bindtap="fn1"> outer    <view bin ...

  4. 微信小程序开发学习笔记006--微信小程序组件详解02

    技术交流QQ群:170933152 案例7:开关选择器 案例8:各种图标 案例9:页面跳转 案例10:多媒体音视频 案例11:嵌入地图 案例12:画布:在上面可以画柱状图等等. 今天继续讲组件: 登录 ...

  5. 我的Java开发学习之旅------Java资源的国际化详解

    internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n. 国际化相关的Java类 Java国际化主要通过 ...

  6. Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解

    Spring MVC 学习总结(二)--控制器定义与@RequestMapping详解 目录 一.控制器定义 1.1.实现接口Controller定义控制器 1.2.使用注解@Controller定义 ...

  7. 深度学习之图像分类(二十六)-- ConvMixer 网络详解

    深度学习之图像分类(二十六)ConvMixer 网络详解 目录 深度学习之图像分类(二十六)ConvMixer 网络详解 1. 前言 2. A Simple Model: ConvMixer 2.1 ...

  8. 深度学习之图像分类(二十五)-- S2MLPv2 网络详解

    深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...

  9. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

最新文章

  1. 如何在linux下写脚本定时备份mysql数据库
  2. 常用免费精品Web应用列表(转)
  3. ceph编译_Ceph编译:L版本及其之后的版本
  4. 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
  5. php 在函数里打开链接,JavaScript中打开链接的几种方法介绍
  6. [BUGKU][CTF][PWN][2020] PWN writeup
  7. Nginx文档阅读笔记-Reverse Proxy vs. Load Balancer(反向代理与负载均衡)
  8. centos7 mysql
  9. Java字符串分割到map_如何在Java中按空格分割字符串并以键值形式存储在map中?...
  10. 时序图如何表现分支_【Video Recognition】在视频分类任务中如何高效使用3D卷积...
  11. 转:apache+python+mod_python+django 编译安装指南
  12. spring-boot spring-security-oauth2
  13. Linux中Apache服务器的简单配置
  14. 普通母函数理解篇(PPT)
  15. 论文笔记:ARTNet、Non-local Neural Networks
  16. 1987:【20CSPS提高组】括号树P5658 [CSP-S2019] 括号树
  17. java谜题读书笔记_《java深度历险》读书笔记(一)
  18. 算法刷题记录(Day 73)
  19. 微信小程序之电子商场的设计以及实现
  20. 开启 Linux 版的 Window 子系统(WSL)

热门文章

  1. 实验7-1-13 装箱问题 (20分)
  2. 阅读笔记-m3u8文件格式
  3. SOC芯片的功耗管理策略
  4. mac电脑免费将caj转pdf,将pdf转word菜鸟教程
  5. 树莓派4b主板特点_树莓派4B的实用配件清单推荐
  6. python猪肉价格预测_如果现在生猪期货上市,猪肉价格会下降吗?
  7. 手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏07游戏输入管理
  8. 【Web技术】624- redux、mobx、concent 状态管理方案对比
  9. 微信营销八(朋友圈活动技巧)
  10. 熊猫烧香被恶搞,网友爆笑诗词句大集合[zz]