[ESP32 IDF] wifi 的应用

目录

背景知识

wifi的基本连接使用

WiFi篇—— WiFi两种模式文章中二、WiFi 的启动(STA 及 AP 模式)

输出现象

通过websocket控制LED

实践验证

实验现象


  • 背景知识

WIFI是ESP32非常重要的一个功能,想要使用一下IDF的API实现将ESP32连接到AP节点中,正好idf的example中有提供一个叫做fast scan的demo。在此之前可以阅读一下下面这篇文章,ESP32 WIFI的背景知识介绍的非常详细,并且提供了一些参考代码,可以进行学习一下:

WiFi两种模式

  • wifi的基本连接使用

WiFi篇—— WiFi两种模式文章中二、WiFi 的启动(STA 及 AP 模式)

文章的这个小节对STA模式的连接过程及API调用有很详细的描述,而在demo中也正如文章所描述的一致。


#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "esp_log.h"
#include "esp_event.h"
#include "nvs_flash.h"// ......
//以上这一堆是通过Kconfig进行配置的参数,包括设置需要连接AP的名称,密码,以及信号强度。static const char *TAG = "scan";static void event_handler(void* arg, esp_event_base_t event_base,int32_t event_id, void* event_data)
{if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {esp_wifi_connect();} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {esp_wifi_connect();} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));}
}/* Initialize Wi-Fi as sta and set scan method */
static void fast_scan(void)
{ESP_ERROR_CHECK(esp_netif_init());ESP_ERROR_CHECK(esp_event_loop_create_default());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, &event_handler, NULL, NULL));ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, NULL));// Initialize default station as network interface instance (esp-netif)esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta();assert(sta_netif);// Initialize and start WiFiwifi_config_t wifi_config = {.sta = {.ssid = DEFAULT_SSID,.password = DEFAULT_PWD,.scan_method = DEFAULT_SCAN_METHOD,.sort_method = DEFAULT_SORT_METHOD,.threshold.rssi = DEFAULT_RSSI,.threshold.authmode = DEFAULT_AUTHMODE,},};ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));ESP_ERROR_CHECK(esp_wifi_start());
}void app_main(void)
{// Initialize NVSesp_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());ret = nvs_flash_init();}ESP_ERROR_CHECK( ret );fast_scan();
}

其中调用nvs_flash_initesp_netif_init进行初始化是为了设置和配置与网络相关的两个重要组件:NVS(Non-Volatile Storage)和网络接口(esp_netif),nvs_flash是ESP32中用于非易失性存储的组件我以为初始化它是为了后面保存wifi的配置信息,但是我屏蔽这段esp_wifi_init初始化会提示错误:

应该是有一些初始化参数还是存在NVS中,也有可能是NVS的使能导致的,所以避免出错还是要按照demo中的流程进行配置。

  • 输出现象

这里设置了RSSI的阈值,如果小于设定值,那么wifi连接会失败:

  • 通过websocket控制LED

通过网页控制LED灯的亮灭,一般的ESP32开发板都可以实现,下面这篇文章是国外开发者提供的一个通过websocket控制LED的实例, 文章对如何实现有非常详细的描述,但是需要魔法才能访问如下连接:

esp32-esp-idf-websocket-web-server

对应的工程源码在github可以找到:

ESP32-ESP-IDF-WebSocket-Web-Server

  • 实践验证

我这里是在ubuntu 22.04中使用了v5.1.1-dirty的idf版本进行编译,由于idf版本的问题,我这里需要将main.c中修改下面的接口为gpio_reset_pin:

其次,我这里根据我使用的ESP32,修改了csv文件,需要的可以参考一下:

# Name,   Type, SubType, Offset,  Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs,      data, nvs,     ,        0x6000,
phy_init, data, phy,     ,        0x1000,
factory,  app,  factory, ,        0x100000,
storage,  data, spiffs,  ,        0x80000,  

  • 实验现象

获得ESP32的wifi ip:

通过浏览器访问该ip,点击按键可以观察到led的亮灭状态:

小结

使用ESP32 IDF还是需要一些背景知识,比如说最基本的编译和烧录,还有menuconfig没接触过的可能还是会比较懵,如果是这样,那就得多花些时间去填充知识的盲区。

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

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

相关文章

Ubuntu中安装OpenSSL

Ubuntu中安装OpenSSL 参考:linux上安装Openssl步骤详解_linux安装openssl-CSDN博客 下载: https://www.openssl.org/source/openssl-3.0.1.tar.gz 解压: tar -xzvf xxxx.tar.gz 安装: cd openssl-3.0.12 ./config make -j3…

关于如何利用ChatGPT提高编程效率的

自从去年ChatGPT3.5推出以后,这一年时间在编程过程中我也在慢慢熟悉人工智能的使用,目前来看即使是免费的ChatGPT3.5对于编程效率的提升也是有很大帮助的,虽然在使用过程中确实出现了一些问题,本文记录下我的一些心得体会和用法。…

开发工具之GIT协同开发流程和微服务部署实践与总结

GIT协同开发流程和微服务部署的实践,并总结经验和教训。通过合理的GIT协同开发流程和良好的微服务部署策略,团队可以更高效地开发和部署软件。 ## 引言 在当今快节奏的软件开发环境中,采用合适的工具和流程对于实现高效协同开发和可靠部署至…

iOS 包含行间距计算富文本size

在一次开发过程中,发现带有行间距的富文本计算高度,会有不准确的情况,富文本内容明明很长,但是计算出的高度只有不到20像素,导致整个cell的高度计算异常。 需求上是文字固定宽度,最多显示3行,超…

FPGA高端项目:Xilinx Zynq7020系列FPGA多路视频拼接 工程解决方案 提供6套工程源码和技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我已有的FPGA视频拼接叠加融合方案本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Artix7 系列FPGA上的应用 3、设计思路框架视频源选择ov5640 i2c配置及采集动态彩条多路视频…

精通Python第13篇—数据之光:Pyecharts旭日图的魔法舞台

文章目录 引言准备工作绘制基本旭日图调整颜色和样式添加交互功能定制标签和标签格式嵌套层级数据高级样式与自定义进阶主题:动态旭日图数据源扩展:外部JSON文件总结 引言 数据可视化在现代编程中扮演着重要的角色,而Pyecharts是Python中一个…

黑群晖使用SynologyDrive同步家庭和公司电脑文件

文章目录 前言一、黑群晖安装SynologyDrive服务二、樱花frp内网穿透2.1、创建一个隧道2.2、在群晖里面下载、安装、开启樱花frp 三、本地电脑安装SynologyDrive 前言 最近看b站学习视频,发现里面老师喜欢文件都是使用坚果云同步到云盘里面,以前我是瞧不…

OpenHarmony—仅允许在表达式中使用typeof运算符

规则:arkts-no-type-query 级别:错误 ArkTS仅支持在表达式中使用typeof运算符,不允许使用typeof作为类型。 TypeScript let n1 42; let s1 foo; console.log(typeof n1); // number console.log(typeof s1); // string let n2: typeof …

Nuget包缓存存放位置迁移

一、背景 默认情况下,NuGet会将项目中使用的包缓存到C盘,随着项目开发积累nuget包越来越多,这会逐渐挤占大量C盘空间,所以我们可以将nuget包缓存位置指定到其他盘中存放。 二、软件环境 win10、vs2022 三、查看当前缓存存放位…

亚信安慧AntDB打造开放创新的数据库生态

在当今信息化快速发展的时代背景下,亚信安慧AntDB作为一种新兴的DBMS,以其核心优势引起了行业内的广泛关注。它基于具有广泛全球影响力和繁荣社区支持的PostgreSQL(PG)内核,继承了PG的开放性与生态活力,同时在性能和稳定性方面进行…

【C++】引用、内联函数、auto关键字等

前言:在前面我们讲解了C入门基础的一些学习例如命名空间、缺省参数、函数重载等。今天我们将进一步的学习,跟着博主的脚步再次往前迈一步吧。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C学习…

10 Java表达式引擎Aviator

文章目录 一、Aviator介绍二、Aviator使用1. pom.xml引入依赖2. 开发代码 三、Aviator语法1. 运算符优先级2. 常量和变量3. 内置函数 一、Aviator介绍 Aviator是一个高性能、轻量级的 java 语言实现的表达式求值引擎, 主要用于各种表达式的动态求值。 Aviator非常小&#xff0…

【极数系列】Flink环境搭建Docker版本(04)

文章目录 引言01 Linux安装Docker1.安装yum-utils软件包2.安装docker3.启动docker4.设置docker自启动5.配置Docker使用systemd作为默认Cgroup驱动6.重启docker 02 docker部署Flink1.18版本1.拉取最新镜像2.检查镜像3.编写dockerFile文件4.执行dockerFile5.检查flink是否启动成功…

万字长文扫盲JUC基础

文章源码地址 文章目录 JUC概述什么是JUC线程和进程的概念进程和线程线程的状态wait和sleep并发和并行管程monitor用户线程与守护线程 Lock接口复习Synchronizedsyschronized卖票案例多线程编程步骤 什么是Lock接口Lock接口的介绍Lock实现可重入锁实现卖票案例 线程间通信案例…

PyTorch的nn.Module类的详细介绍

在PyTorch中,nn.Module 类是构建神经网络模型的基础类,所有自定义的层、模块或整个神经网络架构都需要继承自这个类。nn.Module 类提供了一系列属性和方法用于管理网络的结构和训练过程中的计算。 1. PyTorch中nn.Module基类的定义 在PyTorch中&#xf…

【洛谷 P1481】魔族密码 题解(字符串+字典树)

魔族密码 题目背景 风之子刚走进他的考场,就…… 花花:当当当当~~偶是魅力女皇——花花!!^^(华丽出场,礼炮,鲜花) 风之子:我呕……(杀死人的眼神&#xf…

go语言基础strconv类型转换

strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi()、Itoa()、parse系列、format系列、append系列。 string与int类型转换 这一组函数是我们平时编程中用的最多的。 Atoi() Atoi()函数用于将字符串类型的整数转换为int类型…

从云计算到物联网:虚拟化技术的演变与嵌入式系统的融合

文章目录 一、硬件性能提升:摩尔定律与嵌入式虚拟化二、CPU多核技术:为嵌入式虚拟化提供支持三、业务负载整合:嵌入式虚拟化的核心需求四、降低硬件成本:虚拟化技术的经济效益五、软件重用与移植:虚拟化技术的优势六、…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏4(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言源码制作系统简单绘制制作系统面板UI斧头素材代码控制工具栏操作制作石斧 完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇…

C#用DateTime.Now.ToString方法将日期格式化为指定格式

目录 一、DateTime.Now.ToString方法 二、实例 一、DateTime.Now.ToString方法 调用DateTime对象的ToString方法可以将当前DateTime对象的值转换为其等效的字符串表示形式,而且ToString方法提供了重载,可以在ToString方法中添加不同的参数,…