esp32通过smartconfig连接wifi

news2024/11/26 12:23:40

esp32通过smartconfig连接wifi整体设计流程

1.流程图

2.代码实现

#include <WiFi.h>
#include <SPIFFS.h>

// 定义存储文件的文件名
const char* wifi_config_file = "/wifi_config.txt";

// 定义变量存储 WiFi 信息
// 1)不填写为空时通过smartconfig流程进行配网
// 2)填写具体WiFi信息后直接根据填写的账号密码信息进行联网
const char* ssid = "";
const char* password = "";

// 设置断网重连的时间间隔
const uint32_t RECONNECT_TIMEOUT = 20000;  // 20s

void setup() {
  Serial.begin(115200);

  // 初始化 SPIFFS 文件系统
  if (!SPIFFS.begin(true)) {
    Serial.println("SPIFFS 初始化失败");
    return;
  }

  // 如果直接代码中ssid password 配置了,则直接去连接wifi
  if (ssid != NULL && password != NULL && ssid[0] != '\0' && password[0] != '\0') {
    // 尝试连接 WiFi
    connectToWifi(ssid, password, 10);
  } else {
    // 从flash中读取ssid password 后连接WiFi
    connectToWifiSSIDFromFlash();
  }
}

void loop() {
  // 定时检查 WiFi 连接状态
  if (WiFi.status() != WL_CONNECTED) {
    handleDisconnect();
  } else {
    Serial.println("连接WIFI成功");
    delay(3000);
  }
}

void connectToWifiSSIDFromFlash(void) {
  char ssidRead[32];
  char passwordRead[64];
  // 从 SPIFFS 文件中读取 WiFi 配置信息
  readCredentialsFromSPIFFS(ssidRead, passwordRead);

  if (ssidRead[0] != '\0' && passwordRead[0] != '\0') {
    Serial.print("ssid:");
    Serial.print(ssidRead);
    Serial.print(" password:");
    Serial.println(passwordRead);

    // 尝试连接 WiFi
    connectToWifi(ssidRead, passwordRead, 10);
  } else {
    // 进入 SmartConfig 模式
    startSmartConfig();
  }
}

// 尝试连接 WiFi
void connectToWifi(const char* ssid, const char* password, uint32_t maxTimeoutSec) {
  uint8_t connected = 1;
  uint32_t waitTimeMs = 0;

  WiFi.begin(ssid, password);
  Serial.print("连接WIFI:");
  Serial.println(ssid);

  // 等待连接成功
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
    waitTimeMs += 1000;

    if (waitTimeMs / 1000 > maxTimeoutSec) {
      connected = 0;
      break;
    }
  }

  if (connected) {
    // 连接成功
    Serial.println("");
    Serial.println("WIFI连接成功");
    Serial.print("IP地址:");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("WIFI连接失败");
  }
}

// 处理断网事件
void handleDisconnect() {
  // 用于记录上次重连尝试的时间
  static uint32_t firstReconnectAttempt = 0;
  // 用于记录重连的计数值
  static uint8_t reconnectCount = 0;

  Serial.println("WIFI连接断开,重新连接");

  // 检查是否需要重新进行 SmartConfig
  if (millis() - firstReconnectAttempt > RECONNECT_TIMEOUT) {
    // 置零
    reconnectCount = 0;

    Serial.println("连接失败,重新进行 SmartConfig");
    startSmartConfig();
  } else {
    if (reconnectCount++ == 1) {
      firstReconnectAttempt = millis();
    }
    connectToWifiSSIDFromFlash();
  }
}

// 从 SPIFFS 文件中读取 WiFi 配置信息
void readCredentialsFromSPIFFS(char* ssid, char* password) {
  File configFile = SPIFFS.open(wifi_config_file, "r");
  if (configFile) {
    // 读取 SSID 和密码
    configFile.readStringUntil('\n').toCharArray(ssid, 32);
    configFile.readStringUntil('\n').toCharArray(password, 64);
    configFile.close();
    Serial.println("从 SPIFFS 读取配置文件成功");
  } else {
    Serial.println("读取 SPIFFS 文件失败");
  }
}

// 将 WiFi 配置信息保存到 SPIFFS 文件
void saveCredentialsToSPIFFS(const char* ssidNew, const char* passwordNew) {
  File configFile = SPIFFS.open(wifi_config_file, "w");
  if (configFile) {
    // 写入 SSID 和密码
    configFile.print(ssidNew);
    configFile.print('\n');
    configFile.print(passwordNew);
    configFile.close();
    Serial.println("将配置信息保存到 SPIFFS 成功");
  } else {
    Serial.println("写入 SPIFFS 文件失败");
  }
}

// SmartConfig 完成处理
void smartConfigDoneHandle(void) {
  // 获取配置信息
  String ssid = WiFi.SSID();
  String password = WiFi.psk();
  char* ssidSave = (char*)&ssid[0];
  char* passwordSave = (char*)&password[0];

  Serial.println("SmartConfig 配置成功:");
  Serial.print("ssid:");
  Serial.print(ssidSave);
  Serial.print(" password:");
  Serial.println(passwordSave);

  // 保存配置信息到 SPIFFS
  saveCredentialsToSPIFFS(ssidSave, passwordSave);

  // 重新启动设备
  ESP.restart();
}

// 开始 SmartConfig 模式
void startSmartConfig() {
  // 初始化 WiFi
  WiFi.mode(WIFI_MODE_STA);
  WiFi.beginSmartConfig();

  Serial.println("请使用手机 小程序/APP 进行配置, 正在等待SmartConfig配置");

  //等待来自手机的SmartConfig数据包
  while (!WiFi.smartConfigDone()) {
    delay(500);
    Serial.print(".");
  }

  // SmartConfig配置完成后
  smartConfigDoneHandle();
}

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

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

相关文章

LangGraph Studio

文章目录 一、关于 LangGraph Studio下载 二、设置三、打开一个项目三、调用图开始新的运行配置图运行 四、创建和编辑线程1、创建一个线程2、选择一个线程3、编辑线程状态 五、如何向图表添加中断1、将中断添加到节点列表2、向特定节点添加中断 六、Human-in-the-loop七、编辑…

多模态大模型intern-vl 1.5 论文解读:How Far Are We to GPT-4V?

论文&#xff1a;https://arxiv.org/pdf/2404.16821 目录 1 介绍 3.1 整体架构 3.2 强大的视觉编码器 InternViT-6B-448px-V1.2 InternViT-6B-448px-V1.5 3.3 动态高分辨率 动态宽高比匹配 图像分割与缩略图 InternVL 1.5&#xff0c;这是一款开源的多模态大语言模型&…

Onenet服务器创建产品和设备

Onenet服务器创建产品和设备 (1)浏览器搜索 Onenet, 或者打开这个网址 OneNET - 中国移动物联网开放平台 (10086.cn) (2)登录注册, 密码特殊符号是 (3)进入此网址, 设备管理页面 设备列表 - OneNET物联网平台 (10086.cn) (4)点击产品开发,创建产品 (5)其他行业 (6)设备接…

功能管理之语录管理功能开发(八)

云风网 云风笔记 云风知识库 这里话不多说&#xff0c;直接上效果图,开发逻辑和专栏上篇用户管理大致相同

【JVM基础12】——垃圾回收-说一下JVM有哪些垃圾回收器?

目录 1- 引言&#xff1a;垃圾回收器2- ⭐核心&#xff1a;垃圾回收器详解2-1 串行垃圾回收器2-2 并行垃圾回收器2-3 CMS&#xff08;并发垃圾回收&#xff09;——主要作用在老年代 3- 小结3-1 说一下JVM有哪些垃圾回收器&#xff1f; 1- 引言&#xff1a;垃圾回收器 在 JVM …

人在职场,一半清醒,一半糊涂

职场如战场&#xff0c;同事之间&#xff0c;除了利益竞争&#xff0c;鲜有情谊。 想要扎根立足&#xff0c;学会清醒做事&#xff0c;糊涂做人&#xff0c;才有可能避免“踩坑”&#xff0c;行稳致远。 01 人在职场&#xff0c;清醒做事&#xff0c;才不会被排挤出局。 职…

Fluent Mybatis

官方文档&#xff1a;https://gitee.com/fluent-mybatis/fluent-mybatis/wikis 新的ORM框架&#xff0c;整个设计理念非常符合工程师思维。 Fluent Mybatis 介绍 何为 Fluent Mybatis&#xff1f; Fluent Mybatis, 是一款 Mybatis 语法增强框架, 综合了 Mybatis Plus, Dynam…

codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!!!

写在前面&#xff1a;此篇博客是以[双指针总结]博客为基础的针对性训练&#xff0c;题源是codetop标签双指针近一年&#xff0c;频率由高到低 1.无重复字符的最长子串2.三数之和3.环形链表4.合并两个有序数组5.接雨水6.环形链表II7.删除链表的倒数第N个节点8.训练计划II9.最小覆…

python爬虫代理ip多线程配置的详细教程

在网络爬虫的世界里&#xff0c;代理IP和多线程配置是两个非常重要的技巧。它们不仅能帮助我们提高爬虫的效率&#xff0c;还能有效地避免被目标网站封禁。今天&#xff0c;我就带大家一起探讨如何在Python中配置代理IP和多线程&#xff0c;实现高效的网络爬取。 代理IP的基本…

【vue3|第19期】vue3一般组件与路由组件的探讨

日期&#xff1a;2024年8月2日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

stm32cubemx生成驱动程序里面的变量,如何被main函数调用

用stm32cubemx生成了一个串口中断程序&#xff0c;功能实现了对不定长输入字符的统计和输出打印&#xff0c;在主函数写了回调函数void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 想重新排版&#xff0c;把回调函数放到UART.c里面&#xff0c; 考虑到main.c和uart…

使用Adobe Photoshop CS5给图片加水印

使用Adobe Photoshop CS5给图片加水印 前言1.我这里使用的是Adobe Photoshop CS52.新建空白画布3.写入水印内容4.按 Ctrl T 将其倾斜5.右键图层选择“混合选项”6.选择描边&#xff0c;颜色选择灰色7.效果如下8.填充选择0&#xff0c;不透明度选择75%9.打开编辑&#xff0c;选…

上海冷链配送新篇章 华鼎冷链科技以卓越服务餐饮品牌

在快速发展的上海餐饮连锁行业中&#xff0c;冷链运输作为保障食品安全与品质的关键环节&#xff0c;正迎来前所未有的发展机遇与挑战。华鼎冷链科技作为该领域的佼佼者&#xff0c;正引领着上海乃至全国冷链运输行业的新风尚。 华鼎冷链科技的成功并非一蹴而就。首先&#xff…

1990-2023年上市公司常用变量数据(1400+指标)

1990-2023年上市公司常用变量数据&#xff08;1400指标&#xff09; 1、时间&#xff1a;1990-2023年 2、范围&#xff1a;上市公司 3、格式&#xff1a;dta 4、来源&#xff1a;上市公司年报 5、指标&#xff1a;包括上市公司基本信息&#xff08;性质、行业、地址&#…

Linux智能控制器用于非标自动化印刷包装机械

科技的不断发展&#xff0c;印刷包装机械行业也在不断寻求创新和突破。Linux 智能控制器、非标自动化以及二次开发等技术的出现&#xff0c;为该行业的发展带来了新的机遇。本文将结合 BLIoTLink 协议软件&#xff0c;探讨这些技术如何加速印刷包装机械产业的升级。 Linux 智能…

C++STL专题 vector底层实现

目录 一&#xff0c; vector的手搓 1.构造函数 2. 拷贝构造的实现 3.析构函数 4.begin() end() 的实现 5.reserve的实现 6.size和capacity的实现 7.push_back的实现 8.pop_back的实现 9.empty的实现 10.insert的实现 11.erase的实现 12.resize的实现 13.clear的实…

Cadence23学习笔记(十七)

吴老师的网站里面有很多cadence的开源项目&#xff0c;可以用来学习&#xff1a; 全志 H3 SOC 官方参考设计 DD3 16bitX2 原理图及PCB – 吴川斌的博客 (mr-wu.cn) cadence设置显示实时的走线长度&#xff1a; 在allegro进行布线时可以实时显示当先布线的实际长度有助于pcb的…

Javascript——NaN有什么用法

简介 在 JavaScript 中&#xff0c;NaN&#xff08;Not a Number&#xff09;是一个特殊的值&#xff0c;用来表示非数字的结果&#xff0c;例如一个不合法的数学运算的结果。根据 IEEE 754 浮点数标准&#xff0c;NaN 不等于任何值&#xff0c;包括它自己。这意味着 NaN 是唯…

腾讯云服务器windows系统如何转linux系统

本人购买了腾讯云服务&#xff0c;进去后发现是windows系统的&#xff0c;有点郁闷&#xff08;使用不习惯&#xff09;&#xff0c;于是就去查查看看能不能将Windows系统转成linux系统&#xff0c;网上也有解决办法&#xff0c;但是貌似跟现在的腾讯云后台不一致&#xff0c;下…

dlid源码快速安装——百分百成功

前言 之前安装过一次dlib折腾了很久&#xff0c;最近子啊新的服务器上重新安装dlib这个包又遇到了一些问题&#xff0c;这里简单记录一下。 安装 我这里选择的是直接使用源码安装&#xff08;之前尝试过其他的安装方法&#xff0c;但是都失败了&#xff0c;索性这次就直接使用…