【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地址,及其他基本信息;在基站断开时也会返回前面的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/3882.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nss刷题3

[SWPUCTF 2022 新生赛]webdog1__start level1&#xff1a; 打开环境后什么也&#xff0c;没有&#xff0c;查看源码&#xff0c;看到第一关是MD5值&#xff0c;要get传参web&#xff0c;然后web的值的MD5和它原来值相等&#xff0c;0e开头的字符在php中都是0&#xff0c;传入…

如何使用C#与SQL Server数据库进行交互

一.创建数据库 用VS 创建数据库的步骤&#xff1a; 1.打开vs&#xff0c;创建一个新项目&#xff0c;分别在搜素框中选择C#、Windows、桌面&#xff0c;然后选择Windows窗体应用(.NET Framework) 2.打开“视图-服务器资源管理器”&#xff0c;右键单击“数据连接”&#xff0…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…

讲一下ZooKeeper的持久化机制?

大家好&#xff0c;我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲一下ZooKeeper的持久化机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…

【青蛙过河——思维】

题目 图解 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int n, x; int h[N]; bool check(int mid) {for(int i 1; i mid - 1 < n; i)if(h[i mid - 1] - h[i - 1] < 2 * x) return false;return true; } int main() {cin >> …

港湾周评|万科的多重压力

《港湾商业观察》李镭 成立于1984年&#xff0c;经营了41年之久的行业模范生与明星房企&#xff0c;万科&#xff08;000002.SZ&#xff1b;02202.HK&#xff09;似乎从未遇到过这样的惊天骇浪。 一方面债务承压&#xff0c;2025年是否能妥善解决&#xff0c;又或是终将“暴雷…

搜维尔科技:Xsens人形机器人解决方案的优势

Xsens 致力于推动人形机器人技术的发展&#xff0c;塑造机器人与人类环境无缝融合的未来&#xff0c;通过创新精确和协作&#xff0c;协助生产和服务&#xff0c;改善人类生活和产业。 Xsens通过人形跟随捕捉详细的人体运动数据&#xff0c;使机器人能够学习类人的动作&#x…

LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145185794 Scaling Laws (缩放法则) 是大模型领域中&#xff0c;用于描述 模型性能(Loss) 与 模型规模N、数据量D、计算资源C 之间关系的经验规律…

数组常见解决方案

数组常见解决方案 1.快慢指针(双指针) 慢指针记录当前位置 快指针寻找下一个符合条件的数 当符合条件时,此数将slow位置的数覆盖,slow指针指向下一个位置. 最后slow的位置就是符合条件的数组的长度. 80. 删除有序数组中的重复项 II - 力扣&#xff08;LeetCode&#xff09; …

智能学习平台系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装智能学习平台系统软件来发挥其高效地信息处理的作用&#…

前端项目搭建和基础配置

这个模块主要是介绍从零开始搭建项目的一些操作&#xff0c;包含一些前端常用的配置&#xff0c;这里只是一部分&#xff0c;会在后续的文章中逐步进行补充和完善 一、创建项目 在项目路径下使用以下命令生成前后端项目 npm create vite输入项目名称&#xff0c;框架选择Vue…

RC2在线加密工具

RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法&#xff0c;它可作为DES算法的建议替代算法。RC2是一种分组加密算法&#xff0c;RC2的密钥长度可变&#xff0c;可以从8字节到128字节&#xff0c;安全性选择更加灵活。 开发调试上&#xff0c;有时候需要进行对…

Qt Desiogn生成的ui文件转化为h文件

1.找到这个工具 2.查找到ui文件以及要转化为的h文件的路径。 3.在1中的工具输入uic /xx/xxx.ui -o /xx/xxx.h即可得到结果。

多元线性回归分析

介绍: 回归分析是一种强大的统计方法&#xff0c;用于研究变量之间的关系&#xff0c;特别是一个或多个自变量与一个因变量之间的定量关系。 总结就是研究X和Y之间的相关性的分析 First:相关性: 相关性不代表因果性, Eg:统计数据表明:游泳死亡人数越高&#xff0c;雪糕卖得…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

【大数据2025】Hadoop 万字讲解

文章目录 一、大数据通识大数据诞生背景与基本概念大数据技术定义与特征大数据生态架构概述数据存储数据计算与易用性框架分布式协调服务和任务调度组件数仓架构流处理架构 二、HDFSHDFS 原理总结一、系统架构二、存储机制三、数据写入流程四、心跳机制与集群管理 安全模式&…

彻底讲清楚 单体架构、集群架构、分布式架构及扩展架构

目录 什么是系统架构 单体架构 介绍 示例图 优点 缺点 集群架构 介绍 示意图 优点 缺点 分布式架构 示意图 优点 缺点 生态扩展 介绍 示意图 优点 缺点 扩展&#xff1a;分布式服务解析 纵切拆服务 全链路追踪能力 循环依赖 全链路日志&#xff08;En…

Typora + PowerShell 在终端打开文件

最近在用 Hexo 搭我人生中的第一个博客&#xff0c;Hexo 新建帖子的时候需要在终端用命令hexo n&#xff0c;然后再用 Typora 打开&#xff0c;用鼠标感觉很麻烦&#xff0c;因此直接用终端一键启动了。 发现 Typora 的一个 bug&#x1f41b;&#xff0c;在 YAML 后面写第一个字…

【RAG落地利器】向量数据库Qdrant使用教程

TrustRAG项目地址&#x1f31f;&#xff1a;https://github.com/gomate-community/TrustRAG 可配置的模块化RAG框架 环境依赖 本教程基于docker安装Qdrant数据库&#xff0c;在此之前请先安装docker. Docker - The easiest way to use Qdrant is to run a pre-built Docker i…

设计模式-单例模式

定义 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 类图 类型 饿汉式 线程安全&#xff0c;调用效率高&#xff0c;但是不能延迟加载。 public class HungrySingleton {private static final HungrySingleton instancenew HungrySingleton();private …