【ESP32】ESP-IDF开发 | WiFi开发 | AP模式 + 基站连接例程
1. 简介
前面一篇讲了WiFi的基站模式,演示了怎么编程连接AP,所以这一篇讲一讲AP模式,ESP32作AP,让其他的设备连接自己。
1.1 DHCP
这里需要补充一个知识点——DHCP服务器。当基站连接一个AP时,会被分配一个IP,那么这个IP一般就是通过AP中的DHCP服务器来分配的。
DHCP(Dynamic Host Configuration Protocol),全称动态主机配置协议,其可以实现网络动态合理地分配IP地址给主机使用。它主要的特定是可以统一管理、分配IP地址;同时提出了IP地址租期的概念,使得IP地址能更高效使用。
1.2 信道
配置AP时,可能会涉及到配置信道,信道通俗讲就是不同的频率段。像2.4G频段,一共有14个信道,每个信道的频宽为22MHz,正常来说只有中间的20MHz是能用的,其余的2MHz是保险频段而已。
AP能配置的信道数是跟它支持的频宽有关的,像ESP32最大频宽是40MHz,所以它可以配置2个信道。一个要注意的点是,相邻的信道其实是有重叠的,所以设置的时候我们最好选择互不重叠的信道;这种信道有4组,1/6/11、2/7/12、3/8/13和4/9/14。
另外一个要注意的点是,每个国家开放给民用的信道是不同的;像中国的话,支持1-13信道。
1.3 编程流程
1. 初始化阶段
- 调用 esp_event_loop_create() 创建一个系统事件任务,并初始化应用程序事件的回调函数;
- 调用 esp_netif_init() 创建一个 LwIP 核心任务,并初始化 LwIP 相关工作;
- 调用 esp_netif_create_default_wifi_sta() 创建有TCP/IP堆栈的默认网络接口实例绑定station;
- 调用函数 esp_wifi_init() 创建 Wi-Fi 驱动程序任务,并初始化 Wi-Fi 驱动程序;
2. 配置阶段
- 调用函数 esp_wifi_set_mode() 将 Wi-Fi 模式配置为 station 模式;
- 调用 esp_wifi_set_protocol() 设置 WiFi 支持的协议(可选,默认是全开);
- 调用 esp_wifi_set_bandwidth() 设置 WiFi 支持的带宽(可选);
- 调用 esp_wifi_set_country_code() 设置国家代码(可选);
- 调用函数 esp_wifi_set_config() 配置AP;
3. 启动阶段
- 调用 esp_wifi_start() 启动 Wi-Fi 驱动程序;
- 调用 esp_event_handler_instance_register() 注册对应的事件回调到应用当中;
4. 连接阶段
- WIFI_EVENT_AP_STACONNECTED 事件触发,应用回调作处理;
5. 断开阶段
-
WIFI_EVENT_AP_STADISCONNECTED 事件触发,应用回调作处理。
2. 例程
这个例程会配置ESP32作为AP,然后使用手机去连接ESP32。
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_mac.h"
#include "nvs_flash.h"#include "lwip/err.h"
#include "lwip/sys.h"#include <string.h>#define TAG "app"
#define AP_SSID "ESP32"
#define AP_PASS "12345678"static void wifi_event_handler(void* arg,esp_event_base_t event_base,int32_t event_id,void* event_data)
{if (event_id == WIFI_EVENT_AP_STACONNECTED) {wifi_event_ap_staconnected_t* event = (wifi_event_ap_staconnected_t*) event_data;ESP_LOGI(TAG, "station "MACSTR" join, AID=%d", MAC2STR(event->mac), event->aid);} else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {wifi_event_ap_stadisconnected_t* event = (wifi_event_ap_stadisconnected_t*) event_data;ESP_LOGI(TAG, "station "MACSTR" leave, AID=%d, reason=%d", MAC2STR(event->mac), event->aid, event->reason);}
}int app_main()
{/* 初始化NVS */esp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ESP_ERROR_CHECK(nvs_flash_init());}/* 初始化WiFi协议栈 */ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());esp_netif_create_default_wifi_ap();wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();ESP_ERROR_CHECK(esp_wifi_init(&cfg));ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,ESP_EVENT_ANY_ID,&wifi_event_handler,NULL,NULL));wifi_config_t wifi_config = {.ap = {.ssid = AP_SSID,.ssid_len = strlen(AP_SSID),.channel = 1,.password = AP_PASS,.max_connection = 10,.authmode = WIFI_AUTH_WPA_WPA2_PSK,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());ESP_LOGI(TAG, "WiFi AP running at SSID: %s, password:%s", AP_SSID, AP_PASS);return 0;
}
总体的编程流程跟前面的介绍是大差不差的,这里主要讲一下配置AP的这个结构体;下面只挑几个常用的讲。
typedef struct {uint8_t ssid[32];uint8_t password[64];uint8_t ssid_len;uint8_t channel;wifi_auth_mode_t authmode;uint8_t ssid_hidden;uint8_t max_connection;uint16_t beacon_interval;uint8_t csa_count;uint8_t dtim_period;wifi_cipher_type_t pairwise_cipher;bool ftm_responder;wifi_pmf_config_t pmf_cfg;wifi_sae_pwe_method_t sae_pwe_h2e;
} wifi_ap_config_t;
- ssid:SSID,就是我们所说的WiFi名;
- password:WiFi密码;
- ssid_len:SSID长度;
- channel:信道,默认为1,设置时最好查询自己国家支持的信道;
- authmode:授权模式,如果不需要密码就用 WIFI_AUTH_OPEN,一般的话就选 WIFI_AUTH_WPA_WPA2_PSK 可以覆盖常用的几种授权方式;
- ssid_hidden:是否隐藏SSID,使能之后AP就不会广播自己的SSID,进行AP扫描的时候就扫不出来了;
- max_connection:最大连接数,默认是10,最大是15;
- beacon_interval:beacon 间隔,范围为100 ~ 60000ms,默认为100ms;这个就是AP广播SSID的包间隔。
当基站成功连接时,回调函数会接收到对方的MAC地址,及其他基本信息;在基站断开时也会返回前面的信息。
相关文章:
【ESP32】ESP-IDF开发 | WiFi开发 | AP模式 + 基站连接例程
1. 简介 前面一篇讲了WiFi的基站模式,演示了怎么编程连接AP,所以这一篇讲一讲AP模式,ESP32作AP,让其他的设备连接自己。 1.1 DHCP 这里需要补充一个知识点——DHCP服务器。当基站连接一个AP时,会被分配一个IP…...
Ubuntu升级Linux内核教程
本文作者CVE-柠檬i: CVE-柠檬i-CSDN博客 本文使用的方法是dpkg安装,目前版本为5.4.0-204,要升级成5.8.5版本 下载 下载网站:https://kernel.ubuntu.com/mainline/ 在该网站下载deb包,选择自己想要升级的版本,这里是5…...
关于AWS网络架构的思考
目录: AWS概述 EMR Serverless AWS VPC及其网络 关于AWS网络架构的思考 在AWS K8S中部署的业务,有不同的流量路径。 流量进入 客户端请求 普通的客户端流量流向从前到后是: 客户端公司网关(endpoint)业务的Endpoint ServiceLoad Balancers(监听80和…...
Pandas库的常用内容归纳
Pandas 是一个强大的 Python 数据分析库,提供了大量用于数据处理和分析的功能。以下是一些 Pandas 库中常用的功能: 数据创建和操作 Series 和 DataFrame:创建一维的 Series 和二维的 DataFrame 对象。数据导入:从 CSV、Excel、…...
【错误解决方案记录】spine3.8.75导出的数据使用unity-spine3.8插件解析失败报错的解决方案
报错信息 Exception: Unsupported skeleton data, please export with a newer version of Spine. Spine.SkeletonBinary.ReadSkeletonData (System.IO.Stream file) (at Assets/Spine/Runtime/spine-csharp/SkeletonBinary.cs:132) Spine.Unity.Editor.AssetUtility.AddRequi…...
Python与PyTorch的浅拷贝与深拷贝
1.Python赋值操作的原理 在python中,x something, 这样的赋值操作,准确的理解是:给存储something建立一个索引x (即存储地址), x通过访问something的存储内容,获得something的值。 在下面代码中ÿ…...
【unity进阶篇】弧度、角度和三角函数(Mathf),并实现类似蛇的运动
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
【分类】【损失函数】处理类别不平衡:CEFL 和 CEFL2 损失函数的实现与应用
引言 在深度学习中的分类问题中,类别不平衡问题是常见的挑战之一。尤其在面部表情分类任务中,不同表情类别的样本数量可能差异较大,比如“开心”表情的样本远远多于“生气”表情。面对这种情况,普通的交叉熵损失函数容易导致模型…...
支持selenium的chrome driver更新到132.0.6834.83
最近chrome释放新版本:132.0.6834.83 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only su…...
IO模型与NIO基础二
抽象基类之二 FilterInputStream FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。 它的常用的子类有BufferedInputStream和DataInputStream。 (1) BufferedInputStream的作用就是为“输入流提供缓冲功能,以及mark()和res…...
什么是FPGA开发?
FPGA(Field-Programmable Gate Array),即现场可编程门阵列,是一种通过编程方式实现特定功能的集成电路。与传统的ASIC(专用集成电路)相比,FPGA具有灵活性高、开发周期短、成本相对较低等优势&am…...
寻找川味:成都九尺板鸭
寻找川味:成都九尺板鸭 在四川这片美食的天堂里,隐藏着无数令人垂涎的传统名吃。其中,成都九尺板鸭以其悠久的历史、独特的制作工艺和令人难以抗拒的美味,成为了许多食客心中不可错过的地道川味。 历史渊源 九尺板鸭,顾名思义,因主产于四川省成都市彭州市九尺镇而得名。早在5…...
Object常用的方法及开发中的使用场景
在前端开发中,Object 对象提供了许多常用的方法,这些方法帮助我们操作对象的属性和结构。以下是常用的 Object 方法及其功能简要说明: 对象常用的方法 1. 创建对象 Object.create(proto[, propertiesObject]) 创建一个具有指定原型对象和属性…...
ElasticSearch上
安装ElasticSearch Lucene:Java语言的搜索引擎类库,易扩展;高性能(基于倒排索引)Elasticsearch基于Lucene,支持分布式,可水平扩展;提供Restful接口,可被任何语言调用Ela…...
基于SpringCloud的广告系统设计与实现(二)
一、common公共模块 1.common的作用 通用的代码、配置不应该散落在各个业务模块中,不利于维护与更新 一个大的系统,响应对象需要统一外层格式 各种业务设计与实现,可能会抛出各种各样的异常,异常信息的收集也应该做到统一 2.统…...
2011年西部数学奥林匹克的几何题
2011G1 证明: 显然, O O O, I I I, F F F 共线, E I / / M O EI//MO EI//MO, △ E I F ∼ △ M O F \triangle EIF \sim \triangle MOF △EIF∼△MOF. 进而 E F / M F r 1 / r 2 EF/MFr_1/r_2 EF/MFr1/r2. ( r 1 (r_1 (r1 为圆 I I I 的半径, r 2 r_2 r2 为…...
(一)afsim第三方库编译
注意:防止奇怪的问题,源码编译的路径最好不要有中文,请先检查各文件夹名 AFSIM版本 Version: 2.9 Plugin API Version: 11 软件环境 操作系统: Kylin V10 SP1 项目构建工具: cmake-3.26.0-linux-aarch6…...
boss直聘 __zp_stoken__ 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 py代码 import execjs imp…...
python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像
目录 1. 使用plt.savefig保存无边框图形 2. 显示在屏幕上,并且去掉窗口的标题栏和工具栏 3. 通过配置 matplotlib 的 backend 和使用 Tkinter(或其他图形库) 方法 1:使用 TkAgg 后端,并禁用窗口的工具栏和标题栏 …...
AI-Talk开发板之替换唤醒词
一、说明 聆思提供的Demo唤醒词默认为"小美,小美",V2.4及之后的SDK支持替换唤醒词,聆思提供了在线工具生成唤醒词固件。 工具:tool.listenai.com/audio-custom/products/ 官方博客教程:实操给桌面AI语音助理ÿ…...
C#实现字符串反转的4种方法
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... 1、string.Reverse 方法 string content "Hello World";string reverseStri…...
【MySQL索引:B+树与页的深度解析】
文章目录 MySQL索引:B树与页的深度解析1. 索引使用的数据结构——B树1.1 B树介绍1.2 B树的特点1.3 B树和B树的对比 2. MySQL中的页2.1 页的介绍2.2 页主体2.3 页目录2.4 B树在MySQL索引中的应用 MySQL索引:B树与页的深度解析 在MySQL数据库中࿰…...
在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)
根据你提供的文件内容,MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令,你需要找到 mysql 可执行文件的路径。 在 macOS 上,mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此,完整的路径应该是࿱…...
深入HDFS——数据上传源码
引入 就如RPC篇章里提到的观点一样,任何一种能广为传播的技术,都是通过抽象和封装的思想,屏蔽底层底层复杂实现,提供简单且强大的工具,来降低使用门槛的。 HDFS的风靡自然也是如此。 通过前面深入了NameNode和DataN…...
归并排序算法
归并排序 1算法介绍 和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用…...
优雅解决webview_flutter不支持安卓选择图片视频文件问题
这个问题,网上一搜索,就是要去修改别人写好的插件。 搞Flutter开发,尽量不要去修改别人的插件 ,特别是像 webview_flutter 这种比较大的官方插件。 相信我,你拿捏不了它。 主要问题就是: webview_flutter…...
Linux UDP 编程详解
一、引言 在网络编程领域,UDP(User Datagram Protocol,用户数据报协议)作为一种轻量级的传输层协议,具有独特的优势和适用场景。与 TCP(Transmission Control Protocol,传输控制协议࿰…...
UllnnovationHub,一个开源的WPF控件库
目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…...
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令
[Python学习日记-78] 基于 TCP 的 socket 开发项目 —— 模拟 SSH 远程执行命令 简介 项目分析 如何执行系统命令并拿到结果 代码实现 简介 在Python学习日记-77中我们介绍了 socket 基于 TCP 和基于 UDP 的套接字,还实现了服务器端和客户端的通信,本…...
css3过渡总结
一、过渡的定义与作用 CSS3 过渡(Transitions)允许 CSS 属性在一定的时间区间内平滑地过渡,从一个值转变为另一个值。它能够让网页元素的状态变化更加自然、流畅,给用户带来更好的视觉体验。例如,当一个元素从隐藏状态…...
生产环境中常用的设计模式
生产环境中常用的设计模式 设计模式目的使用场景示例单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点- 日志记录器- 配置管理器工厂方法模式定义一个创建对象的接口,让子类决定实例化哪个类- 各种工厂类(如视频游戏工厂模式创…...
【STM32-学习笔记-4-】PWM、输入捕获(PWMI)
文章目录 1、PWMPWM配置 2、输入捕获配置3、编码器 1、PWM PWM配置 配置时基单元配置输出比较单元配置输出PWM波的端口 #include "stm32f10x.h" // Device headervoid PWM_Init(void) { //**配置输出PWM波的端口**********************************…...
游戏行业销售数据分析可视化
完整源码项目包获取→点击文章末尾名片! 🌟分析: 可看出最近五年用户最喜爱的游戏类型依然还是Action-动作类(当然市场发行的也很多) Sports-运动类和Shooter-射击类顺序互换,但我估计现在大环境局势紧张可以会推动射击…...
微服务网关,如何选择?
什么是API网关 API网关(API Gateway)是微服务架构中的一个关键组件,它充当了客户端与后端服务之间的中间层。其主要功能包括请求路由、协议转换、负载均衡、安全认证、限流熔断等。通过API网关,客户端无需直接与多个微服务交互&a…...
Java开发提速秘籍:巧用Apache Commons Lang工具库
一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…...
多用户商城系统源码哪家好用?怎么选?
想拥有属于自己的多用户商城系统,但回头一看自己又是个技术小白,看着网上眼花缭乱的b2b2c商城系统,更是不知道如何选起?下面给大家分享一条较为成熟的选择思路,以作参考。 1、从需求上决定系统方向 企业在选型b2b2c商…...
聊聊如何实现Android 放大镜效果
一、前言 很久没有更新Android 原生技术内容了,前些年一直在做跨端方向开发,最近换工作用重新回到原生技术,又回到了熟悉但有些生疏的环境,真是感慨万分。 近期也是因为准备做地图交互相关的需求,功能非常复杂&#x…...
NVIDIA视频编解码
开源了两个项目:英伟达显卡视频编解码、jetson视频编解码。都是基于官方SDK进行的封装,由于官方自带的demo晦涩难懂并且每块都是独立的,我对SDK进行二次封装并形成了一套较为完整的视频编解码流程,调用简单,有完整的测…...
Mysql事务隔离级
什么是事务的隔离级别 数据库事务的隔离级别是指事务在并发执行时,如何控制事务之间相互影响的程度。它决定了多个事务并发执行时,事务中的操作对其他事务的可见性,进而影响数据的一致性和并发性。 为什么会有隔离级别的概念? …...
K210视觉识别模块
K210视觉识别模块是一款功能强大的AI视觉模块,以下是对其的详细介绍: 一、核心特性 强大的视觉识别功能:K210视觉识别模块支持多种视觉功能,包括但不限于人脸识别、口罩识别、条形码和二维码识别、特征检测、数字识别、颜色识别…...
springboot使用websocket
文章目录 一、概述1、简介 二、 使用1、引包2、配置处理器3、前端测试 一、概述 1、简介 简介略,附上官方文档,spring5和spring6的官方文档内容大致是一样的: https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framewo…...
线程池底部工作原理
线程池内部是通过线程和队列实现的,当我们通过线程池处理任务时: 如果线程池中的线程数量小于corePoolSize,无论是否有处于空闲的线程,都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize,…...
DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图
在当今数字化飞速发展的时代,开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员,其发展历程与成果备受关注。值此之际,GitCode 精心整理了 DevUI 年度运营报告,为您全面呈现 DevUI 社区在过去一年里的开源之…...
Mybatis面试题
Mybatis面试题 什么是 MyBatis?讲下 MyBatis 的缓存Mybatis 是如何进行分页的?分页插件的原理是什么?简述 Mybatis 的插件运行原理,以及如何编写一个插件?Mybatis 动态 sql 是做什么的?都有哪些动态 sql&am…...
Python获取系统运行时间
有时候想获取系统启动后到现在的运行时间,在Linux C可以使用clock_gettime()来获得,如下, #include <time.h> #include <stdio.h>int main() {struct timespec ts;clock_gettime(CLOCK_MONOTONIC, &ts);printf("syste…...
软考高级5个资格、中级常考4个资格简介及难易程度排序
一、软考高级5个资格 01、网络规划设计师 资格简介:网络规划设计师要求考生具备全面的网络规划、设计、部署和管理能力;该资格考试适合那些在网络规划和设计方面具有较好理论基础和较丰富从业经验的人员参加。 02、系统分析师 资格简介:系统分…...
【18】Word:明华中学-儿童医保❗
目录 题目 NO2 NO3 NO4 NO5 NO6 NO7 NO8 NO9 题目 NO2 布局→页面设置对话框→纸张方向:横向→纸张大小:A3 ;页面设置对话框:直接输入纸张大小的宽度和高度即可→页面设置对话框:上下左右边距→版式&…...
Vue 中实现修改数组,并保持页面渲染数据是响应式更改
如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的,直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新,你可以使用 Vue 提供的 Vue.set() 方法(在 Vue 2 中)或使用 this.$set() 方法(在 Vue…...
MATLAB算法实战应用案例精讲-【数模应用】图形变换和复杂图形组合(附python和MATLAB代码实现)
目录 前言 算法原理 变换 1二维变换 1.1缩放 1.2 翻转 1.3剪切 1.4 旋转 2齐次坐标 2.1引入齐次坐标的原因 2.2 二维齐次坐标 2.3二维仿射变换 2.4逆变换 4组合变换 5三维变换(由二维变换推理而来) 5.1三维齐次坐标 5.2 三维仿射变换 5.3 缩放和平移 5.4…...
GCC支持Objective C的故事?Objective-C?GCC只能编译C语言吗?Objective-C 1.0和2.0有什么区别?
GCC支持Objective C的故事 Objective-C 主要由 Stepstone 公司的Brad Cox和 Tom Love 在1980 年左右发明。乔布斯离开苹果公司后成立了NeXT STEP公司, 买下了Objective-C 语言的授权。GCC对Objective-C语言的支持是在1992年加入的,具体是在GCC 1.3版本中…...