当前位置: 首页 > news >正文

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver

引言

ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分,其实内容比我想象的要多得多。所以通常来说,如果你想要编写自己的Wi-Fi应用程序,最快捷的方法就是先找一个类似的示例应用,然后将它的相关部分搬移到你的项目中,强烈建议在开始项目前先阅读ESP-IDF-Wi-Fi 驱动程序编程指南

ESP32-S3 Wi-Fi概述

ESP32-S3的Wi-Fi库提供了配置和监控ESP32-S3 Wi-Fi网络功能的支持。这包括以下配置:

  • Station模式 (也称为STA模式或Wi-Fi客户端模式):ESP32-S3连接到一个接入点。
  • AP模式 (也称为Soft-AP模式或接入点模式):站点连接到ESP32-S3。
  • Station/AP共存模式 (ESP32-S3同时作为一个接入点和一个连接到另一个接入点的站点)。

ESP32-S3 Wi-Fi STA模式扫描 AP流程

初始化Wi-Fi、设置Wi-Fi模式、启动Wi-Fi

在这里插入图片描述
1. Wi-Fi/LwIP 初始化阶段

  • s1.1:主任务通过调用函数 esp_netif_init() 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作。

  • s1.2:主任务通过调用函数 esp_event_loop_create() 创建一个系统事件任务,并初始化应用程序事件的回调函数。在此情况下,该回调函数唯一的动作就是将事件中继到应用程序任务中。

  • s1.3:主任务通过调用函数 esp_netif_create_default_wifi_ap() 或 esp_netif_create_default_wifi_sta() 创建有 TCP/IP 堆栈的默认网络接口实例绑定 station 或 AP。

  • s1.4:主任务通过调用函数 esp_wifi_init() 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序。

2. Wi-Fi 配置阶段

  • Wi-Fi 驱动程序初始化成功后,可以进入到配置阶段。该场景下,Wi-Fi 驱动程序处于 station 模式。因此,首先你需调用函数 esp_wifi_set_mode() (WIFI_MODE_STA) 将 Wi-Fi 模式配置为 station 模式。可通过调用其它 esp_wifi_set_xxx API 进行更多设置,例如:协议模式、国家代码、带宽等。

3. Wi-Fi 启动阶段

  • s3.1:调用函数 esp_wifi_start() 启动 Wi-Fi 驱动程序。

配置扫描信息、获取扫描的AP数量和获取具体的AP信息

请添加图片描述
4. WIFI 扫描配置阶段

  • s1.1:如果默认的国家信息有误,调用函数 esp_wifi_set_country() 进行配置。请参阅 Wi-Fi 国家/地区代码。

  • s1.2:调用函数 esp_wifi_scan_start() 配置扫描信息,可参阅 扫描配置。该场景为全信道扫描,将 SSID/BSSID/channel 设置为 0 即可。

5. 扫描完成后事件处理阶段

  • 调用函数 esp_wifi_scan_get_ap_num() 获取在本次扫描中找到的 AP 数量。然后,分配出足够的事物槽,并调用函数 esp_wifi_scan_get_ap_records() 获取 AP 记录

ESP32-S3 Wi-Fi扫描程序

在ESP32-S3上进行Wi-Fi扫描的主要步骤包括初始化NVS存储、初始化Wi-Fi、设置Wi-Fi模式、启动Wi-Fi、配置扫描信息、获取扫描的AP数量和获取具体的AP信息。

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "nvs_flash.h"
#include "esp_wifi.h"void app_main(void)
{ESP_LOGI("WIFI", "0. 初始化NVS存储");ESP_ERROR_CHECK(nvs_flash_init());                   // 对NVS默认的区域进行初始化ESP_LOGI("WIFI", "1. WIFI 初始化阶段");esp_netif_init();                    // 1.1 创建一个 LwIP 核心任务esp_event_loop_create_default();             // 1.2 创建一个系统事件任务esp_netif_create_default_wifi_sta(); // 1.3.1 创建有 TCP/IP 堆栈的默认网络接口实例wifi_init_config_t wifi_config = WIFI_INIT_CONFIG_DEFAULT();esp_wifi_init(&wifi_config);             // 1.3.2 创建 Wi-Fi 驱动程序任务ESP_LOGI("WIFI", "2. WIFI 配置阶段");esp_wifi_set_mode(WIFI_MODE_STA);       // 2 将 Wi-Fi 模式配置为 stationESP_LOGI("WIFI", "3. WIFI 启动阶段");esp_wifi_start();                        // 3.1 启动 Wi-Fi 驱动程序ESP_LOGI("WIFI", "4. WIFI 扫描");//在所有信道中扫描全部 AP(前端)wifi_country_t country_config = {.cc = "CN",.schan = 1,.nchan = 13,};esp_wifi_set_country(&country_config); // 4.1 扫描配置国家代码wifi_scan_config_t scan_config = {.show_hidden = true               // 显示隐藏};esp_wifi_scan_start(&scan_config,true); // 4.2 配置扫描信息 true表示当这个任务执行的时候,回进入阻塞状态等待扫描//得到扫描的AP数量uint16_t ap_num =0;ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_num)); ESP_LOGI("WIFI","AP Count : %d",ap_num);//获取具体的AP信息uint16_t max_aps=20;wifi_ap_record_t ap_records[max_aps];memset(ap_records,0,sizeof(ap_records));uint16_t aps_count =max_aps;ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&aps_count,ap_records));//打印信息ESP_LOGI("WIFI","AP Count: %d",aps_count);printf("%30s %3s %3s %3s\n","SSID","频道","强度","MAC地址");for(int i=0;i<aps_count;i++){printf("%30s %4d %4d %02X-%02X-%02X-%02X-%02X-%02X\n", ap_records[i].ssid, ap_records[i].primary, ap_records[i].rssi, ap_records[i].bssid[0], ap_records[i].bssid[1], ap_records[i].bssid[2], ap_records[i].bssid[3], ap_records[i].bssid[4], ap_records[i].bssid[5]);}
}

效果如下
在这里插入图片描述

参考资料

  1. ESP-IDF编程指南

相关文章:

29-ESP32-S3-WIFI_Driver-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分&#xff0c;其实内容比我想象的要多得多。所以通常来说&#xff0c;如果你想要编写自己的Wi-Fi应用程序&#xff0c;最快捷的方法就是先找一个类似的示例应用&#xff0c;然后将它的相…...

2024了,还有人在问为甚死锁?

大家好&#xff0c;我是javapub。 接上篇提到了锁&#xff0c;《InnoDB有哪些锁类型》。这么多的锁&#xff0c;你有遇到过死锁吗&#xff1f; 死锁是在事务数据库中会发生的一种特殊现象&#xff0c;多个事务在执行过程中&#xff0c;相互等待对方持有的资源&#xff0c;导致…...

Java中Arrays.toString与new String()字节数组使用的差异

Java 编程语言提供了许多内置方法和类&#xff0c;这使得程序员能够更加方便的处理数据和对象。本文将讨论 Arrays.toString 方法和 new String() 方法在处理字节数组时的不同。 文章目录 Arrays.toString 方法new String() 方法总结 Arrays.toString 方法 Arrays.toString() …...

开源表单流程设计器有哪几个突出的优势特点?

当前&#xff0c;传统的表单制作已经无法满足现在企业的发展需求了。想要实现高效率发展&#xff0c;需要引进先进的低代码技术平台、开源表单流程设计器等优秀软件平台助力发展。它们具有可视化操作界面、灵活好操作、易维护、效率高等诸多优势特点&#xff0c;在推动企业实现…...

景源畅信:抖音小店如何开橱窗?

在当今数字化时代&#xff0c;社交媒体平台不仅仅是人们交流和分享生活的工具&#xff0c;更成为了商家们展示和销售产品的重要场所。抖音作为一款流行的短视频社交应用&#xff0c;其内置的电商功能——抖音小店&#xff0c;为众多商家和个人提供了便捷的在线销售途径。其中&a…...

Unix环境高级编程--8-进程控制---8.7函数waitid 8.8函数wait3 wait4

1、Single Unix Specification支持一个取得进程终止状态的函数--waitid&#xff0c;此函数类似于waitpid&#xff1a; pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); …...

window.addEventListener 用法

window.addEventListener 是JavaScript中用来为DOM元素&#xff08;在本例中是浏览器窗口window&#xff09;添加事件监听器的方法。这对于响应用户操作&#xff08;如点击、滚动等&#xff09;或页面/浏览器的特定状态变化非常有用。下面是如何使用window.addEventListener的基…...

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…...

python接口自动化之会话保持

&#x1f366; 会话保持-token 有的网站登录需要token鉴权&#xff0c;是啥意思呢&#xff0c;现在有两个接口&#xff0c;一个接口是登录&#xff0c;一个接口是提交订单&#xff0c;那你怎么保证&#xff0c;提交登录这个用户是登录状态呢。登录成功的接接口会在response里面…...

script 标签中 defer 和 async 属性的区别

script 标签中的 defer Vs. async 在 HTML 中&#xff0c;script 标签可以使用 defer 和 async 属性来控制外部 JavaScript 脚本加载和执行的方式。defer 和 async 都可以提高页面的加载性能&#xff0c;主要区别整理如下。 区别点deferasync加载顺序按顺序加载异步加载&…...

【axios】的浅度分析

一、Axios的拦截器能干些什么&#xff1f; Axios拦截器的实现原理主要涉及两个方面&#xff1a;请求拦截器和响应拦截器&#xff0c;它们分别在请求发送前和响应返回后进行预处理和后处理。 Axios内部维护了两个数组&#xff0c;一个用于存储请求拦截器&#xff0c;另一个用于…...

基于单片机的步进电机控制系统研究

摘 要 &#xff1a; 近年来 &#xff0c; 步进电机凭借其定位精度高 、 使用方便 、 性价比高 、 容易控制等优点 &#xff0c; 在各领域受到广泛应用 。 文中利用C52 单片机设计了一种步进电机控制系统 &#xff0c; 介绍了其总体方案 、 主控制模块 、 驱动电路 、 键盘 、 晶…...

Fine-tuning和模型训练的关系

概述 Fine-tuning和模型训练不是完全相同的概念&#xff0c;但它们之间有密切的关系&#xff0c;都是机器学习和深度学习过程中的重要步骤。 模型训练是一个更广泛的概念&#xff0c;指的是使用数据去调整模型的内部参数&#xff0c;以使得模型能够从输入数据中学习并做出预测…...

【ai】livekit:Agents 3 : pythonsdk和livekit-agent的可编辑模式下的安装

livekit-agent 依赖于livekit、livekit-api、livekit-protocol 其中livekit就是livekkit-rtc: 包含俩sdk 实时互动sdkReal-time SDK for connecting to LiveKit as a participant livekit-api : 服务端sdk https://pypi.org/project/livekit-api/ livekit的python sdk...

【传知代码】BERT论文解读及情感分类实战-论文复现

文章目录 概述原理介绍BERT模型架构任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建 核心代码超参数设置训练结果注意事项 小结 本文…...

【C language】判断一个正整数是否是2^n

题解&#xff1a;判断一个正整数是否是2^n(位运算方法) 1.题目 判断一个正整数是否是2^n 2.位运算法 思路&#xff1a;干掉二进制最右边的1&#xff0c;看是否是0 int main() {int num 16;if ((num & (num - 1)) 0) printf("the num is a 2^n");else print…...

解锁Android高效数据传输的秘钥 - Parcelable剖析

作为Android开发者&#xff0c;我们经常需要在不同的组件(Activity、Service等)之间传输数据。这里的"传输"往往不仅仅是简单的数据复制&#xff0c;还可能涉及跨进程的内存复制操作。当传输的数据量较大时&#xff0c;这种操作可能会带来严重的性能问题。而Android系…...

前端 CSS 经典:filter 滤镜

前言&#xff1a;什么叫滤镜呢&#xff0c;就是把元素里的像素点通过一套算法转换成新的像素点&#xff0c;这就叫滤镜。而算法有 drop-shadow、blur、contrast、grayscale、hue-rotate 等。我们可以通过这些算法实现一些常见的 css 样式。 1. drop-shadow 图片阴影 可以用来…...

专业的力量-在成为专家的道路上前进

专业的力量-在成为专家的道路上前进 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 现在稀缺的已不再是信息资源&#xff0c;而是运用信息的能力。过去…...

10分钟掌握FL Studio21中文版,音乐制作更高效!

FL Studio 21中文版是Image Line公司推出的一款深受欢迎的数字音频工作站软件&#xff0c;在音乐制作领域享有盛誉。这个版本特别针对中文用户进行了本地化处理&#xff0c;旨在提供更加便捷的用户体验和操作界面。本次评测将深入探讨FL Studio 21中文版的功能特点、使用体验及…...

Python中4种读取JSON文件和提取JSON文件内容的方法

在Python中&#xff0c;有几种常用的方法可以用于读取JSON文件并提取数据。以下是四种主要的方法 使用iamn 1oad:0”:这个方法用于格一个包合S0N文档的字符串(enr、wtas典otea实列)反席列化 (0eseia28)为Pm0n%象。例如&#xff0c;如果你有一个ISON格式的字荷电&#xff0c;你…...

el-pagination在删除非第一页的最后一条数据遇到的问题

文章目录 前言一、问题展示二、解决方案三、源码解析1、elementui2、elementplus 总结 前言 这个问题是element-ui中的问题&#xff0c;可以从源码中看出来&#xff0c;虽然页码更新了&#xff0c;active也是对的&#xff0c;但是未调用current-change的方法&#xff0c;这里就…...

视频汇聚平台LntonCVS视频监控系统前端错误日志记录及Debug模式详细讲解

LntonCVS作为一种支持GB28181标准的流媒体服务平台&#xff0c;旨在提供一个能够整合不同厂商设备、便于管理和扩展的解决方案&#xff0c;以适应日益复杂的视频监控环境。通过实现设备的统一管理和流媒体的高效传输&#xff0c;LntonCVS帮助构建更加灵活和强大的视频监控系统。…...

高并发项目-用户登录基本功能

文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式&#xff08;不安全&#xff09;2.改进方式&#xff08;两次加密加盐&#xff09; 2.密码加密功能实现1.pom.…...

kotlin基础之泛型和委托

Kotlin泛型的概念及使用 泛型概念 在Kotlin中&#xff0c;泛型&#xff08;Generics&#xff09;是一种允许在类、接口和方法中使用类型参数的技术。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替代。泛型的主要目的是提高代码的复用性、类型安全性和可读…...

awtk踩坑记录二:移植jerryscript到awtk design项目

工作要求&#xff0c;想尝试看看在awtk-designer设计界面的同时能不能用javascript开发逻辑层&#xff0c;以此和前端技术联动&#xff0c;本文是一种项目建构的思路。 从github下载并编译awtk, awtk-mmvm和awtk-jerryscript&#xff08;如果没有&#xff09; 用awtk-designer…...

正邦科技(day2)

自动校准 问题&#xff1a;电量不准都可以直接去校准 校准方式&#xff1a;可程式变频电压 问题分析&#xff1a;他是通过软件去自动自动校准的&#xff0c;flash 清空的时候有缓存没有清空&#xff0c;或者互感器没有读取到问题 互感器&#xff1a;电流互感器的作用包括电流测…...

技术架构设计指南:从需求到实现

技术架构是软件系统的骨架&#xff0c;它决定了系统的性能、可靠性、扩展性等关键特性。本文将介绍技术架构设计的一般步骤和方法。 第一步&#xff1a;需求分析 在设计技术架构之前&#xff0c;首先要对系统需求进行全面深入的分析。这包括功能需求、非功能需求&#xff08;如…...

【数据结构:排序算法】堆排序(图文详解)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 &#x1f369;1.大堆和小堆 &#x1f369;2.向上调整算法建堆和向下调整算法建堆&#xff1a;…...

git 派生仓库怎么同步主仓库的新分支

一、git 派生仓库怎么同步主仓库的新分支 要使你的Git派生仓库同步主仓库的新分支&#xff0c;请遵循以下步骤&#xff1a; 1、添加上游仓库&#xff08;如果尚未添加&#xff09;: 如之前所述&#xff0c;确保上游仓库已经被添加到你的本地仓库。如果没有&#xff0c;使用命…...