第四十八章扫描WiFi实验
1)实验平台:正点原子DNESP32S3开发板
2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6
3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html
5)正点原子官方B站:https://space.bilibili.com/394620890
6)正点原子DNESP32S3开发板技术交流群:132780729
ESP32-S3的WiFi库支持配置及监控ESP32-S3的Wi-Fi连网功能。它支持配置基站模式(即STA模式或WiFi客户端模式),此时ESP32-S3连接到接入点(AP)。还支持AP模式(即Soft-AP模式或接入点模式),此时基站连接到ESP32-S3。同时,支持AP-STA共存模式,此时ESP32-S3既是接入点,同时又作为STA。本章节的实验是基于乐鑫官方提供的WiFi库来实现的,但遗憾的是乐鑫并没有公开WiFi库的源码,所以我们只能调用API函数实现。
本章分为如下几个小节:
48.1 WiFi模式概述
48.2 硬件设计
48.3 软件设计
48.4 下载验证
48.1 WiFi模式概述
WiFi主要有两种模式:STA和AP模式。AP模式即无线接入点,是我们常说的手机热点,被其他设备连接;STA模式即Station,是连接热点的设备。另外,ESP32S3可支持STA和AP两种模式共存,就像手机那样可以开热点,也可以连接其他热点。
WiFi库支持配置及监控ESP32S3 Wi-Fi连网功能。支持配置:
①:Station模式(即STA模式或WiFi客户端模式),此时 ESP32 S3连接到接入点 (AP)。
②:AP模式(即Soft-AP模式或接入点模式),此时基站连接到ESP32S3设备。
③:Station/AP 共存模式(ESP32S3 既是接入点,同时又作为基站连接到另外一个接入点)。
④:上述模式的各种安全模式(WPA、WPA2 及 WEP 等)。
⑤:扫描接入点(包括主动扫描及被动扫描)。
⑥:使用混杂模式监控 IEEE802.11 Wi-Fi 数据包。
下面作者讲解ESP32S3开启WiFi两种模式启动流程,如下:
一、WiFi-AP启动流程
WiFi-AP启动流程如下。
图48.1.1 AP启动流程
上图展示了ESP32系列芯片以AP模式开启WiFi的启动流程。首先,系统需要对lwIP协议栈进行初始化。接着,创建一个任务,该任务将用于触发相应的事件。然后,配置WiFi参数和AP模式参数。最后,启动WiFi,从而完成以AP模式开启WiFi的操作。
二、WiFi-STA启动流程
WiFi-STA启动流程如下。
图48.1.2 STA模式启动流程
上图展示了ESP32系列芯片以STA模式开启WiFi的启动流程。首先,系统需要创建定时器和事件组,并对lwIP协议栈进行初始化。接着,创建一个任务,该任务将用于触发相应的事件。然后,配置WiFi参数和STA模式参数。最后,启动WiFi,从而完成以STA模式开启WiFi的操作。
48.2 硬件设计
- 例程功能
本章实验功能简介:扫描附近的WIFI信号,并在LCD显示屏右侧显示12个WIFI名称。
- 硬件资源
1)LED灯
LED-IO1
2)XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3)SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SET和LCD_DC相连)
PWR- IO1_3(XL9555)
RST- IO1_2(XL9555)
4)ESP32-S3内部WiFi
- 原理图
本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。
48.3 软件设计
48.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。
图48.3.1 程序流程图
48.3.2 程序解析
在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
[code]/* 存储12个WIFI名称 */#define DEFAULT_SCAN_LIST_SIZE 12i2c_obj_t i2c0_master;static const char *TAG = "scan";/***@brief 身份认证模式*@param authmode :身份验证模式*@retval 无*/static voidprint_auth_mode(int authmode){ switch (authmode) { /* 省略身份认证模式代码 */ }}/***@brief 打印WIFI密码类型*@param pairwise_cipher :密码类型*@param group_cipher :群密码类型*@retval 无*/static voidprint_cipher_type(int pairwise_cipher, int group_cipher){ switch (pairwise_cipher) { /* 省略WIFI密码类型代码 */ } switch (group_cipher) { /* 省略WIFI密码类型代码 */ }}/***@brief 将Wi-Fi初始化为sta并设置扫描方法*@param 无*@retval 无*/void wifi_scan(void){ char lcd_buff[100] = {0}; /* 网卡初始化 */ ESP_ERROR_CHECK(esp_netif_init()); /* 创建新的事件循环 */ ESP_ERROR_CHECK(esp_event_loop_create_default()); /* 用户初始化STA模式 */ esp_netif_t *sta_netif =esp_netif_create_default_wifi_sta(); assert(sta_netif); /* wifi配置初始化 */ wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); ESP_ERROR_CHECK(esp_wifi_init(&cfg)); uint16_t number =DEFAULT_SCAN_LIST_SIZE; wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE]; uint16_t ap_count = 0; memset(ap_info, 0, sizeof(ap_info)); /* 设置WIFI为STA模式 */ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); /* 启动WIFI */ ESP_ERROR_CHECK(esp_wifi_start()); /* 开始扫描附件的WIFI */ esp_wifi_scan_start(NULL, true); /* 获取上次扫描中找到的AP列表 */ ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info)); /* 获取上次扫描中找到的AP数量 */ ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count)); ESP_LOGI(TAG, "Total APs scanned = %u", ap_count); /* 下面是打印附件的WIFI信息 */ for (int i = 0; (i |