基于VScode的ESP32开发学习(二):官方例程softap,提供wifi,详解
完整代码放在文末
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,详解相关推荐
- 前端开发学习路径之阶段七:BootStrap详解
Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript的,它在jQuery的基础上进行了更为个性化和人性化的完善,形成一 ...
- 安卓开发学习之002 LinearLayout之android:layout_gravity详解
1.使用说明 这个是针对控件本身而言,用来控制该控件在包含该控件的父控件中的位置.同样,当我们在Button按钮控件中设置android:layout_gravity="left" ...
- 微信小程序开发学习笔记005--微信小程序组件详解
先来再看看事件冒泡: 看个例子,新建项目库credemo05 case1.wxml <view bindtap="fn1"> outer <view bin ...
- 微信小程序开发学习笔记006--微信小程序组件详解02
技术交流QQ群:170933152 案例7:开关选择器 案例8:各种图标 案例9:页面跳转 案例10:多媒体音视频 案例11:嵌入地图 案例12:画布:在上面可以画柱状图等等. 今天继续讲组件: 登录 ...
- 我的Java开发学习之旅------Java资源的国际化详解
internationalization (国际化)简称 i18n,因为在i和n之间还有18个字符,localization(本地化 ),简称L10n. 国际化相关的Java类 Java国际化主要通过 ...
- Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
Spring MVC 学习总结(二)--控制器定义与@RequestMapping详解 目录 一.控制器定义 1.1.实现接口Controller定义控制器 1.2.使用注解@Controller定义 ...
- 深度学习之图像分类(二十六)-- ConvMixer 网络详解
深度学习之图像分类(二十六)ConvMixer 网络详解 目录 深度学习之图像分类(二十六)ConvMixer 网络详解 1. 前言 2. A Simple Model: ConvMixer 2.1 ...
- 深度学习之图像分类(二十五)-- S2MLPv2 网络详解
深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...
- 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
最新文章
- 如何在linux下写脚本定时备份mysql数据库
- 常用免费精品Web应用列表(转)
- ceph编译_Ceph编译:L版本及其之后的版本
- 读书笔记--互联网必读《长尾理论》作者克里斯.安德森
- php 在函数里打开链接,JavaScript中打开链接的几种方法介绍
- [BUGKU][CTF][PWN][2020] PWN writeup
- Nginx文档阅读笔记-Reverse Proxy vs. Load Balancer(反向代理与负载均衡)
- centos7 mysql
- Java字符串分割到map_如何在Java中按空格分割字符串并以键值形式存储在map中?...
- 时序图如何表现分支_【Video Recognition】在视频分类任务中如何高效使用3D卷积...
- 转:apache+python+mod_python+django 编译安装指南
- spring-boot spring-security-oauth2
- Linux中Apache服务器的简单配置
- 普通母函数理解篇(PPT)
- 论文笔记:ARTNet、Non-local Neural Networks
- 1987:【20CSPS提高组】括号树P5658 [CSP-S2019] 括号树
- java谜题读书笔记_《java深度历险》读书笔记(一)
- 算法刷题记录(Day 73)
- 微信小程序之电子商场的设计以及实现
- 开启 Linux 版的 Window 子系统(WSL)