概述
一、目的
ESP32能火的很大一部分原因是其既有WiFi又有Bluetooth,而传统的MCU如果需要能够访问网络则必须外接WiFi芯片,从本篇开始我们将介绍ESP32的WiFi功能。
二、介绍
按照惯例我们贴上官网资料方便大家学习
Wi-Fi - ESP32 - — ESP-IDF Programming Guide latest documentation (espressif.com)https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html
特点
ESP32 WiFi支持三种模式,分别为:
- Station模式(作为WiFi设备主动连接路由器,也叫做WiFi Client)
- AP模式(作为一个Access Point,让其他WiFi设备来连接)即WiFi热点
- Station/AP共存模式(ESP32连接路由器的同时自身也是一个热点供其他WiF设备来连接)
支持各种加密方式(WPA、WPA2、WEP等)
支持主动或者被动扫描WiFi热点
Promiscuous 混杂模式用于监听IEEE802.11 WiFi包
其中需要特别强调的是混杂模式,因为这个模式的存在我们才可以实现airkiss配网、微信配网等功能。
WiFi库框架
参看资料为esp-idf里面的components/esp_wifi/include/esp_wifi.h
从上图我们可以看到总共四个模块,分别为tcpip协议栈、事件循环任务、WiFi Driver以及用户任务。WiFi Driver是一个黑盒,它只能接收API调用产生事件或者自身主动产生事件。
WiFi功能的核心是一个事件循环任务,配合上tcp/ip协议栈和WiFi Driver,我们就可以在应用层使用各种网络功能;
在嵌入式平台上TCP/IP协议栈首选LwIP,所以上图中最左边是lwip协议栈的内容(以后台任务的形式处理各种网络事件);
在应用层中我们通过调用各种API来控制WiFi Driver来使用WiFi,WiFi的各种事件(如联网成功、扫描网络完成等事件都转发给事件循环任务,事件循环任务则执行一些必要处理后通过回调的形式通知应用层;
应用层再根据事件类型进行业务处理,完成我们需要的功能。
这种分层的设计有助于应用层与驱动层解耦。
API介绍
esp_err_t esp_wifi_init(const wifi_init_config_t *config)
在使用wifi功能之前必须先进行初始化,上面的函数用来初始化WiFi Driver需要的各种资源并且启动一个WiFi后台任务;需要注意的是,总是使用WIFI_INIT_CONFIG_DEFAULT宏作为入参,这样可以正确地初始化默认值;当然如果你很熟悉里面的配置项也可以手动修改某些参数以达到某些特殊需求。
esp_err_t esp_wifi_deinit(void)
如果不想再使用WiFi相关功能,可以调用上面的接口销毁WiFi模块使用的资源。
esp_err_t esp_wifi_set_mode(wifi_mode_tmode)
设置WiFi的模式(STA、AP、STA&AP)
esp_err_t esp_wifi_get_mode(wifi_mode_t *mode)
获取当前WiFi设置的模式
esp_err_t esp_wifi_set_config(wifi_interface_t interface, wifi_config_t *conf);
设置WiFi配置,我们看一下wifi_config_t这个联合体
/** @brief Soft-AP configuration settings for the ESP32 */
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_pmf_config_t pmf_cfg; /**< Configuration for Protected Management Frame */
} wifi_ap_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;
/** @brief Configuration data for ESP32 AP or STA.
*
* The usage of this union (for ap or sta configuration) is determined by the accompanying
* interface argument passed to esp_wifi_set_config() or esp_wifi_get_config()
*
*/
typedef union {
wifi_ap_config_t ap; /**< configuration of AP */
wifi_sta_config_t sta; /**< configuration of STA */
} wifi_config_t;
我们配置时使用对应的字段就可以了,其中最主要的两个字段就是ssid和password。
esp_err_t esp_wifi_start(void)
根据当前的设置的模式和配置信息启动WiFi;如果是WIFI_MODE_STA,那么就创建station控制块并且启动station;如果是WIFI_MODE_AP,就创建softap控制块并且启动softap;如果是WIFI_MODE_APSTA,就创建station和softap控制块并启动。
esp_err_t esp_wifi_stop(void)
停止WiFi 运行并销毁对应资源
esp_err_t esp_wifi_connect(void);
连接WiFi热点,注意只在WIFI_MODE_STA或者WIFI_MODE_APSTA模式下生效。
esp_err_t esp_wifi_disconnect(void);
主动断开连接
esp_err_t esp_wifi_scan_start(const wifi_scan_config_t *config, bool block);
主动发起扫描,wifi_scan_config_t的字段如下,用来指定扫描策略
/** @brief Parameters for an SSID scan. */
typedef struct {
uint8_t *ssid; /**< SSID of AP */
uint8_t *bssid; /**< MAC address of AP */
uint8_t channel; /**< channel, scan the specific channel */
bool show_hidden; /**< enable to scan AP whose SSID is hidden */
wifi_scan_type_t scan_type; /**< scan type, active or passive */
wifi_scan_time_t scan_time; /**< scan time per channel */
} wifi_scan_config_t;
block字段指明是否阻塞等待扫描结果 ,阻塞情况下只有扫描到结果此接口才退出。
esp_err_t esp_wifi_scan_stop(void);
停止扫描(只有在非阻塞扫描调用下可以使用)
esp_err_t esp_wifi_scan_get_ap_num(uint16_t *number)
获取上一次扫描到AP个数
esp_err_t esp_wifi_scan_get_ap_records(uint16_t *number, wifi_ap_record_t *ap_records)
获取上一次的扫描结果(扫描完成后一定要调用此接口,否则会有内存泄漏)
以上就是WiFi相关的一些接口,下面我们去看看WiFi相关的事件
/** WiFi event declarations */
typedef enum {
WIFI_EVENT_WIFI_READY = 0, /**< ESP32 WiFi ready */
WIFI_EVENT_SCAN_DONE, /**< ESP32 finish scanning AP */
WIFI_EVENT_STA_START, /**< ESP32 station start */
WIFI_EVENT_STA_STOP, /**< ESP32 station stop */
WIFI_EVENT_STA_CONNECTED, /**< ESP32 station connected to AP */
WIFI_EVENT_STA_DISCONNECTED, /**< ESP32 station disconnected from AP */
WIFI_EVENT_STA_AUTHMODE_CHANGE, /**< the auth mode of AP connected by ESP32 station changed */
WIFI_EVENT_STA_WPS_ER_SUCCESS, /**< ESP32 station wps succeeds in enrollee mode */
WIFI_EVENT_STA_WPS_ER_FAILED, /**< ESP32 station wps fails in enrollee mode */
WIFI_EVENT_STA_WPS_ER_TIMEOUT, /**< ESP32 station wps timeout in enrollee mode */
WIFI_EVENT_STA_WPS_ER_PIN, /**< ESP32 station wps pin code in enrollee mode */
WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP, /**< ESP32 station wps overlap in enrollee mode */
WIFI_EVENT_AP_START, /**< ESP32 soft-AP start */
WIFI_EVENT_AP_STOP, /**< ESP32 soft-AP stop */
WIFI_EVENT_AP_STACONNECTED, /**< a station connected to ESP32 soft-AP */
WIFI_EVENT_AP_STADISCONNECTED, /**< a station disconnected from ESP32 soft-AP */
WIFI_EVENT_AP_PROBEREQRECVED, /**< Receive probe request packet in soft-AP interface */
WIFI_EVENT_FTM_REPORT, /**< Receive report of FTM procedure */
/* Add next events after this only */
WIFI_EVENT_STA_BSS_RSSI_LOW, /**< AP's RSSI crossed configured threshold */
WIFI_EVENT_ACTION_TX_STATUS, /**< Status indication of Action Tx operation */
WIFI_EVENT_ROC_DONE, /**< Remain-on-Channel operation complete */
WIFI_EVENT_STA_BEACON_TIMEOUT, /**< ESP32 station beacon timeout */
WIFI_EVENT_MAX, /**< Invalid WiFi event ID */
} wifi_event_t;
WIFI_EVENT_STA_CONNECTED这个事件就是代表已经连接到AP
以上事件就不一一介绍了,大家可以看看源码和注释。
好了,本篇内容到此结束,后面会针对每个功能进行详细的使用介绍。
最后
以上就是大气小猫咪为你收集整理的ESP32系列--第四篇 WiFi概述一、目的二、介绍的全部内容,希望文章能够帮你解决ESP32系列--第四篇 WiFi概述一、目的二、介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复