WiFi外设配置
ESP32/8266的Wi-Fi库支持配置及监控Wi-Fi连网功能
相关内容参考乐鑫的ESP32/8266文档https://docs.espressif.com/projects/esp-idf/zh_CN/release-v4.1/api-reference/network/esp_wifi.html
基本模式
基站模式(又称STA模式或Client模式):将ESP连接到附近的AP,此时相当于ESP在蹭网
AP模式(又称Soft-AP模式或Server模式):将ESP设置为AP,可供周围设备连接,此时相当于ESP开热点
AP-STA共存模式:ESP32既是接入点,同时又作为基站连接到另外一个接入点,此时相当于ESP连着隔壁wifi开热点给自家用
同时支持以上模式的安全模式(WPA、WPA2、WEP等),可以理解成安全蹭网
基本功能
- 主动/被动扫描附近AP,主动找别人家网蹭
- 使用混杂模式监控IEEE802.11 Wi-Fi数据包,可以理解成ESP能看到你上了什么不可描述的网站
库函数
- 初始化与设置
1 | esp_wifi_init(const wifi_init_config_t *config)//WiFi功能初始化,config为初始化结构体句柄 |
- 关闭WiFi
1 | esp_wifi_stop()//STA模式下断开wifi连接,AP模式下关闭热点并释放内存,共用模式下断开连接并关闭热点 |
- 连接/断开WiFi
1 | /* 用于STA模式 */ |
- 扫描附近
1 | esp_wifi_scan_start(const wifi_scan_config_t *config, bool block)//扫描AP以蹭网 |
- 操作系统相关
1 | esp_wifi_set_event_mask(uint32_t mask)//设置事件掩码 |
- 其他
1 | esp_wifi_set_protocol(wifi_interface_t ifx, uint8_t protocol_bitmap)//设置特殊接口的协议类型 |
- 低功耗相关
1 | esp_wifi_set_inactive_time(wifi_interface_t ifx, uint16_t sec)//设置暂时休眠时间 |
特征:大部分API都有对应的set和get两个方向,需要回传数据时使用get*,初始设置时使用set*
AP模式初始化
1 | void wifi_init_softap(void) |
其中主要用到了wifi_config_t这个结构体,它的内容如下所示
1 | typedef struct { |
STA模式初始化
1 | void wifi_init_sta(void) |
其中主要用到了wifi_sta_config_t这个结构体,它的内容如下所示
1 | typedef struct { |
AP-STA共存模式
1 | esp_err_t event_handler(void *ctx, system_event_t *event) |
在这里使用了状态机(SM)的编程思路,【开始连接】-【连接完毕】-【丢失连接】几个状态切换中都会调用event_handler()进行处理并打印相关信息
基本初始化方法
1 | //设置线程 |
WiFi连接实际上使用的是一套异步的状态机,所有需要调用的外设都被ESP-IDF封装起来了,开发者只需要配置基本逻辑即可。流程如下:
初始化用于存储WiFi配置数据(包括ssid和密码)的NVS
配置WiFi数据并将其写入WiFi外设(或NVS)
开启WiFi
设备自动根据外设寄存器内的配置连接附近WiFi,并根据当前连接情况向主程序发送事件集
开发者编写的状态机负责处理WiFi外设发来的事件,主要分成以下几种情况:
- WiFi已连接
- WiFi未连接
- 找不到指定ssid的WiFi
- 连接丢失
一般使用ESP-IDF中的默认事件循环来实现状态机
使用其中的事件类型和事件ID区分各个不同的具体时间
关于ESP-IDF的事件集可以参考ESP32上移植的FreeRTOS相关教程