数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 41|回复: 1

《DNESP32S3使用指南-IDF版_V1.6》第四十八章 扫描WiFi实验

[复制链接]
发表于 8 小时前 | 显示全部楼层 |阅读模式
第四十八章 扫描WiFi实验

ESP32-S3WiFi库支持配置及监控ESP32-S3Wi-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主要有两种模式:STAAP模式。AP模式即无线接入点,是我们常说的手机热点,被其他设备连接;STA模式即Station,是连接热点的设备。另外,ESP32S3可支持STAAP两种模式共存,就像手机那样可以开热点,也可以连接其他热点。
WiFi库支持配置及监控ESP32S3 Wi-Fi连网功能。支持配置:
①:Station模式(即STA模式或WiFi客户端模式),此时 ESP32 S3连接到接入点 (AP)
②:AP模式(即Soft-AP模式或接入点模式),此时基站连接到ESP32S3设备。
③:Station/AP 共存模式(ESP32S3 既是接入点,同时又作为基站连接到另外一个接入点)。
④:上述模式的各种安全模式(WPAWPA2 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 硬件设计
1. 例程功能
本章实验功能简介:扫描附近的WIFI信号,并在LCD显示屏右侧显示12WIFI名称。
2. 硬件资源
1LED
LED-IO1
2XL9555
IIC_INT-IO0(需在P5连接IO0)
IIC_SDA-IO41
IIC_SCL-IO42
3SPILCD
CS-IO21
SCK-IO12
SDA-IO11
DC-IO40(在P5端口,使用跳线帽将IO_SETLCD_DC相连)
PWR- IO1_3XL9555)
RST- IO1_2XL9555)
4ESP32-S3内部WiFi
3. 原理图
本章实验使用的WiFiESP32-S3的片上资源,因此并没有相应的连接原理图。
48.3 软件设计
48.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。
48.3.1 程序流程图
48.3.2 程序解析
在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
/* 存储12WIFI名称 */
#define DEFAULT_SCAN_LIST_SIZE  12
i2c_obj_t i2c0_master;
static const char *TAG = "scan";
/**
* @brief       身份认证模式
* @param       authmode :身份验证模式
* @retval      
*/
static void print_auth_mode(int authmode)
{
    switch (authmode)
    {
        /* 省略身份认证模式代码 */
    }
}
/**
* @brief       打印WIFI密码类型
* @param       pairwise_cipher :密码类型
* @param       group_cipher    :群密码类型
* @retval      
*/
static void print_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));
    /* 设置WIFISTA模式 */
    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 < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++)
    {
        sprintf(lcd_buff, "%s",ap_info.ssid);
        lcd_show_string(200, 20 * i, 240, 16, 16, lcd_buff, BLUE);
        ESP_LOGI(TAG, "SSID \t\t%s", ap_info.ssid);
        ESP_LOGI(TAG, "RSSI \t\t%d", ap_info.rssi);
        print_auth_mode(ap_info.authmode);
        
        if (ap_info.authmode != WIFI_AUTH_WEP)
        {
            print_cipher_type(ap_info.pairwise_cipher
, ap_info.group_cipher);
        }
        ESP_LOGI(TAG, "Channel \t\t%d\n", ap_info.primary);
    }
}
/**
* @brief       程序入口
* @param      
* @retval      
*/
void app_main(void)
{
    esp_err_t ret;
    ret = nvs_flash_init();             /* 初始化NVS */
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();
    }
    led_init();                         /* 初始化LED */
    i2c0_master = iic_init(I2C_NUM_0);  /* 初始化IIC0 */
    spi2_init();                        /* 初始化SPI2 */
    xl9555_init(i2c0_master);           /* IO扩展芯片初始化 */
    lcd_init();                         /* 初始化LCD */
    lcd_show_string(10, 80, 240, 32, 32, "ESP32-S3", RED);
    lcd_show_string(10, 120, 240, 24, 24, "WiFi SCAN Test", RED);
    lcd_show_string(10, 150, 240, 16, 16, "ATOM@ALIENTEK", RED);
    lcd_draw_line(190,0,190,239,DARKBLUE);
    wifi_scan();
    while (1)
    {
        LED_TOGGLE();
        vTaskDelay(500);
    }
}
在上述源码中,作者从wifi_scan函数开始讲解,该函数首先创建了event loop事件回调,即任务事件处理机制。接着,配置WiFiSTA模式(设备连接热点模式)并设置相应的参数,然后启动WiFi。最后,程序会扫描附近的12个热点,并在LCD上显示热点的名称。此外,读者还可以通过串口查看热点的安全模式等身份认证信息。
48.4 下载验证
程序下载成功后,我们可以看到LCD显示附近20个热点名称,如下图所示:
48.4.1 SPILCD显示效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
发表于 5 小时前 | 显示全部楼层
感谢你的分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-9 17:41 , Processed in 0.109201 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表