OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 108|回复: 0

《ESP32-S3使用指南—IDF版 V1.6》第四十八章 扫描WiFi实验

[复制链接]

1181

主题

1193

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
5104
金钱
5104
注册时间
2019-5-8
在线时间
1273 小时
发表于 前天 09:53 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2025-11-14 09:58 编辑

2.jpg
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
1.png
3.png

第四十八章 扫描WiFi实验

       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启动流程如下。

第四十八章 扫描WiFi实验807.png
图48.1.1 AP启动流程

       上图展示了ESP32系列芯片以AP模式开启WiFi的启动流程。首先,系统需要对lwIP协议栈进行初始化。接着,创建一个任务,该任务将用于触发相应的事件。然后,配置WiFi参数和AP模式参数。最后,启动WiFi,从而完成以AP模式开启WiFi的操作。

       二、WiFi-STA启动流程
       WiFi-STA启动流程如下。

第四十八章 扫描WiFi实验1007.png
图48.1.2 STA模式启动流程

       上图展示了ESP32系列芯片以STA模式开启WiFi的启动流程。首先,系统需要创建定时器和事件组,并对lwIP协议栈进行初始化。接着,创建一个任务,该任务将用于触发相应的事件。然后,配置WiFi参数和STA模式参数。最后,启动WiFi,从而完成以STA模式开启WiFi的操作。

       48.2 硬件设计

       1. 例程功能
       本章实验功能简介:扫描附近的WIFI信号,并在LCD显示屏右侧显示12个WIFI名称。

       2. 硬件资源

       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

       3. 原理图
       本章实验使用的WiFi为ESP32-S3的片上资源,因此并没有相应的连接原理图。

       48.3 软件设计

       48.3.1 程序流程图
       程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图。

第四十八章 扫描WiFi实验1603.png
图48.3.1 程序流程图

       48.3.2 程序解析
       在本章节实验中,我们只关心main.c文件内容即可,该文件内容如下:
  1. /* 存储12个WIFI名称 */
  2. #define DEFAULT_SCAN_LIST_SIZE  12
  3. i2c_obj_t i2c0_master;
  4. static const char *TAG = "scan";

  5. /**
  6. * @brief       身份认证模式
  7. * [url=home.php?mod=space&uid=271674]@param[/url]       authmode :身份验证模式
  8. * @retval      无
  9. */
  10. static void print_auth_mode(int authmode)
  11. {
  12.     switch (authmode)
  13.     {
  14.         /* 省略身份认证模式代码 */
  15.     }
  16. }

  17. /**
  18. * @brief       打印WIFI密码类型
  19. * @param       pairwise_cipher :密码类型
  20. * @param       group_cipher    :群密码类型
  21. * @retval      无
  22. */
  23. static void print_cipher_type(int pairwise_cipher, int group_cipher)
  24. {
  25.     switch (pairwise_cipher)
  26.     {
  27.         /* 省略WIFI密码类型代码 */
  28.     }

  29.     switch (group_cipher)
  30.     {
  31.         /* 省略WIFI密码类型代码 */
  32.     }
  33. }

  34. /**
  35. * @brief       将Wi-Fi初始化为sta并设置扫描方法
  36. * @param       无
  37. * @retval      无
  38. */
  39. void wifi_scan(void)
  40. {
  41.     char lcd_buff[100] = {0};
  42.     /* 网卡初始化 */
  43.     ESP_ERROR_CHECK(esp_netif_init());
  44.     /* 创建新的事件循环 */
  45.     ESP_ERROR_CHECK(esp_event_loop_create_default());
  46.     /* 用户初始化STA模式 */
  47.     esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();
  48.     assert(sta_netif);
  49.     /* wifi配置初始化 */
  50.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  51.     ESP_ERROR_CHECK(esp_wifi_init(&cfg));

  52.     uint16_t number = DEFAULT_SCAN_LIST_SIZE;
  53.     wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE];
  54.     uint16_t ap_count = 0;
  55.     memset(ap_info, 0, sizeof(ap_info));
  56.     /* 设置WIFI为STA模式 */
  57.     ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
  58.     /* 启动WIFI */
  59.     ESP_ERROR_CHECK(esp_wifi_start());
  60.     /* 开始扫描附件的WIFI */
  61.     esp_wifi_scan_start(NULL, true);
  62.     /* 获取上次扫描中找到的AP列表 */
  63.     ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info));
  64.     /* 获取上次扫描中找到的AP数量 */
  65.     ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count));
  66.     ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
  67.     /* 下面是打印附件的WIFI信息 */
  68.     for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++)
  69.     {
  70.         sprintf(lcd_buff, "%s",ap_info.ssid);
  71.         lcd_show_string(200, 20 * i, 240, 16, 16, lcd_buff, BLUE);
  72. <span style="font-style: italic;"><span style="font-style: normal;">        ESP_LOGI(TAG, "SSID \t\t%s", ap_info.ssid);
  73.         ESP_LOGI(TAG, "RSSI \t\t%d", ap_info</span><span style="font-style: normal;">.rssi);
  74.         print_auth_mode(ap_info</span><span style="font-style: normal;">.authmode);
  75.         
  76.         if (ap_info</span><span style="font-style: normal;">.authmode != WIFI_AUTH_WEP)
  77.         {
  78.             print_cipher_type(ap_info</span><span style="font-style: normal;">.pairwise_cipher
  79. , ap_info</span><span style="font-style: normal;">.group_cipher);
  80.         }
  81.         ESP_LOGI(TAG, "Channel \t\t%d\n", ap_info</span><span style="font-style: normal;">.primary);
  82.     }
  83. }

  84. /**
  85. * @brief       程序入口
  86. * @param       无
  87. * @retval      无
  88. */
  89. void app_main(void)
  90. {
  91.     esp_err_t ret;
  92.     ret = nvs_flash_init();             /* 初始化NVS */
  93. if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
  94. ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
  95.     {
  96.         ESP_ERROR_CHECK(nvs_flash_erase());
  97.         ret = nvs_flash_init();
  98.     }
  99.     led_init();                         /* 初始化LED */
  100.     i2c0_master = iic_init(I2C_NUM_0);  /* 初始化IIC0 */
  101.     spi2_init();                        /* 初始化SPI2 */
  102.     xl9555_init(i2c0_master);           /* IO扩展芯片初始化 */
  103.     lcd_init();                         /* 初始化LCD */
  104.     lcd_show_string(10, 80, 240, 32, 32, "ESP32-S3", RED);
  105.     lcd_show_string(10, 120, 240, 24, 24, "WiFi SCAN Test", RED);
  106.     lcd_show_string(10, 150, 240, 16, 16, "ATOM@ALIENTEK", RED);
  107.     lcd_draw_line(190,0,190,239,DARKBLUE);
  108.     wifi_scan();
  109.     while (1)
  110.     {
  111.         LED_TOGGLE();
  112.         vTaskDelay(500);
  113.     }
  114. }</span></span>
复制代码
       在上述源码中,作者从wifi_scan函数开始讲解,该函数首先创建了event loop事件回调,即任务事件处理机制。接着,配置WiFi为STA模式(设备连接热点模式)并设置相应的参数,然后启动WiFi。最后,程序会扫描附近的12个热点,并在LCD上显示热点的名称。此外,读者还可以通过串口查看热点的安全模式等身份认证信息。

       48.4 下载验证
       程序下载成功后,我们可以看到LCD显示附近20个热点名称,如下图所示:

第四十八章 扫描WiFi实验5156.png
图48.4.1 SPILCD显示效果图
回复

使用道具 举报

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

本版积分规则


关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-11-16 01:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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