ESP32利用WebServer进行设备配置

目标需求

利用esp32的WebServer功能,展示一个网页,对里面的参数进行配置,并以json文本格式保存到flash里面。

1、定义HTML

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>采集器配置</title><link rel="stylesheet" href="http://www.kanzz.net/res/eve.css">
</head>
<body>
<form id="config-form" autocomplete="off"><div class="form-item"><label for="versioin">软件版本:</label><input type="text" id="versioin" name="versioin" value="%VERSION%" value="1.0"></div><div class="form-item"><label for="sn">编号:</label><input type="text" id="sn" name="sn" value="%SN%" required></div><div class="form-item"><label for="ip">IP 地址:</label><input type="text" id="ip" name="ip" value="%MYIP%" required></div><div class="form-item"><label for="mask">子网掩码:</label><input type="text" id="mask" name="mask" value="%MYMASK%" required></div><div class="form-item"><label for="gateway">网关:</label><input type="text" id="gateway" name="gateway" value="%GATEWAY%" required></div><div class="form-item"><label for="ssid">WiFi SSID:</label><input type="text" id="ssid" name="ssid" value="%SSID%" required></div><div class="form-item"><label for="wifipwd">WiFi Password:</label><input type="text" id="wifipwd" name="wifipwd" value="%WIFIPWD%"></div><div class="form-item"><label for="waittime">拉取时间(秒):</label><input type="text" id="waittime" name="waittime" value="%WAITTIME%"></div><div class="form-item"><label for="apiurl">推送接⼝:</label><input type="text" id="apiurl" name="apiurl" value="%APIURL%"></div><div class="form-item"><label for="appid">AppID:</label><input type="text" id="appid" name="appid" value="%APPID%"></div><div class="form-item"><label for="secret">Secret:</label><input type="text" id="secret" name="secret" value="%SECRET%"></div><div class="form-item"><button type="submit">保存配置</button></div></form>
</body>
</html>
)rawliteral";
const char info_html[] PROGMEM = R"rawliteral(<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"><title>采集器配置</title><link rel="stylesheet" href="http://www.kanzz.net/res/eve.css"></head><body><div style="margin:100px auto;width:400px;"><div style="color: #060;font-size: 16px;line-height: 30px;margin: 20px 0;">修改完成!</div><div class="button"><button id="back" style="width: 160px;height: 40px;line-height: 30px;border: 1px solid #999;color: #fff;background-color: #5cd6b2;border: none;border-radius: 4px;box-shadow: 4px 4px 4px #999;cursor: pointer;">返回</button></div></div><script>        document.getElementById('back').addEventListener('click', function(event) {location.href = '/';})</script></body></html>
)rawliteral";

其中定义了一些变量,展示页面的时候会用变量来替代,如:

<div class="form-item"><label for="ssid">WiFi SSID:</label><input type="text" id="ssid" name="ssid" value="%SSID%" required>
</div>

代码中的 value="%SSID%"

2、安装ESPAsyncWebServer

3、定义JSON字符串

String jsonStr = "{\"version\": \"1.1\", \"sn\":\"2021\", \"mask\":\"255.255.255.0\", \"gateway\":\"192.168.0.1\", \"waittime\":\"0.5\", \"apiurl\":\"https://\", \"appid\":\"appid12345\", \"secret\":\"secret\"}";

4、读取Flash中的JSON文件

String readJsonFile()
{File configFile = SPIFFS.open("/config.json", FILE_READ);if (!configFile) {Serial.println("Failed to open config file");return "";}if(configFile.available()){String line = configFile.readString();configFile.close();return line;}
}

5、保存JSON文件到Flash中

void saveJsonFile()
{File configFile = SPIFFS.open("/config.json", "w");if (!configFile) {Serial.println("Failed to open config file for writing");return;}configFile.println(jsonStr);configFile.close();Serial.println("Config file saved");
}

6、处理HTML模板中的变量

String processor(const String& var)
{jsonConfig config = transTojson();if (var == "VERSION"){return config.version;}if (var == "SN"){return config.sn;}if (var == "MYIP"){return ip;}if (var == "MYMASK"){return config.mask;}if (var == "GATEWAY"){return config.gateway;}if (var == "SSID"){return ssid;}if (var == "WIFIPWD"){return password;}if (var == "WAITTIME"){return config.waittime;}if (var == "APIURL"){return config.apiurl;}if (var == "APPID"){return config.appid;}if (var == "SECRET"){return config.secret;}return String();
}

7、WebServer的监听

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/html", index_html, processor);});
server.on("/save", HTTP_POST, [](AsyncWebServerRequest *request){String version, sn, mask, gateway, waittime, apiurl, appid, secret;if (request->hasParam("version", true)) {version = request->getParam("version", true)->value();} else {version = "-";}if (request->hasParam("sn", true)) {sn = request->getParam("sn", true)->value();} else {sn = "-";}if (request->hasParam("mask", true)) {mask = request->getParam("mask", true)->value();} else {mask = "-";}if (request->hasParam("gateway", true)) {gateway = request->getParam("gateway", true)->value();} else {gateway = "-";}if (request->hasParam("waittime", true)) {waittime = request->getParam("waittime", true)->value();} else {waittime = "-";}if (request->hasParam("apiurl", true)) {apiurl = request->getParam("apiurl", true)->value();} else {apiurl = "-";}if (request->hasParam("appid", true)) {appid = request->getParam("appid", true)->value();} else {appid = "-";}if (request->hasParam("secret", true)) {secret = request->getParam("secret", true)->value();} else {secret = "-";}jsonStr = "{\"version\": \"" + version + "\", \"sn\":\"" + sn + "\", \"mask\":\"" + mask + "\", \"gateway\":\"" + gateway + "\", \"waittime\":\"" + waittime + "\", \"apiurl\":\"" + apiurl + "\", \"appid\":\"" + appid + "\", \"secret\":\"" + secret + "\"}";saveJsonFile();delay(100);request->send_P(200, "text/html", info_html);});

根据逻辑整合起来后,测试成功!

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

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

相关文章

使用SpringMVC搭建WEB项目时报错404的问题排查解决以及web.xml配置文件init-param行标红问题

一、使用SpringMVC搭建WEB项目时报错404的问题排查解决 很早前&#xff08;4年前&#xff09;就把这个搭建过&#xff0c;但今天运行的时候就是报404错误&#xff0c;见文章&#xff1a; JAVA开发中SpringMVC框架的使用及常见的404问题原因以及SpringMVC框架基于注解的开发实例…

Apache SeaTunnel 9月份社区发展记录

各位热爱 SeaTunnel 的小伙伴们&#xff0c;9月份社区月报来啦&#xff01;这里将定期更新SeaTunnel社区每个月的重大进展&#xff0c;欢迎关注&#xff01; 月度Merge Stars 感谢以下小伙伴上个月为 Apache SeaTunnel 做的精彩贡献&#xff08;排名不分先后&#xff09;&…

【网络安全】CVE-2024-46990: Directus环回IP过滤器绕过实现SSRF

未经许可,不得转载。 文章目录 背景漏洞详情受影响版本解决方案背景 Directus 是一款开源 CMS,提供强大的内容管理 API,使开发人员能够轻松创建自定义应用程序,凭借其灵活的数据模型和用户友好的界面备受欢迎。然而,Directus 存在一个漏洞,允许攻击者绕过默认的环回 IP …

问卷调查毕设计算机毕业设计投票系统SpringBootSSM框架

目录 一、引言‌ ‌二、需求分析‌ 用户角色‌&#xff1a; ‌功能需求‌&#xff1a; ‌非功能需求‌&#xff1a; ‌三、系统设计‌ ‌技术选型‌&#xff1a; ‌数据库设计‌&#xff1a; ‌界面设计‌&#xff1a; ‌四、实现步骤‌ ‌后端实现‌&#xff1a; …

UM981最小系统推荐设计

L1&#xff1a;推荐使用 0603 封装的 68nH 射频电感 C1&#xff1a;推荐使用 100nF 100pF 两个电容并联 C2&#xff1a;推荐使用 100pF 电容 C3&#xff1a;推荐使用 n*10μF1*100nF 电容并联&#xff0c;总容值不小于 30μF R1&#xff1a;推荐使用 10kΩ电阻 注&#x…

dbt doc 生成文档命令示例应用

DBT提供了强大的命令行工具&#xff0c;它使数据分析师和工程师能够更有效地转换仓库中的数据。dbt的一个关键特性是能够为数据模型生成文档&#xff0c;这就是dbt docs命令发挥作用的地方。本教程将指导您完成使用dbt生成和提供项目文档的过程。 dbt doc 命令 dbt docs命令有…

【C++】map和set的介绍以及用法

个人主页 文章目录 ⭐一、系列式容器和关联式容器&#x1f680;二、set的使用1. set类的介绍2. set的构造3. set的迭代器4. set的常用函数 &#x1f3a1;三、multiset&#x1f384;四、map类的使用1. map类的介绍2. map的构造3. map的迭代器4. map的operator[]5. map的常用函数…

git删除错误的commit

文章目录 1、git删除错误的commit2、.gitignore配置文件不生效的问题 1、git删除错误的commit git的流程如图&#xff1a; 当某次失误造成commit的版本有问题&#xff0c;需要回退到正常的版本修改后重新add。 首先通过git log查看commit提交记录&#xff0c;可以看到HEAD-…

【在Linux世界中追寻伟大的One Piece】信号捕捉|阻塞信号

目录 1 -> 信号捕捉初识 2 -> 阻塞信号 2.1 -> 信号其他相关常见概念 2.2 -> 在内核中的表示 2.3 -> sigset_t 2.4 -> 信号集操作函数 2.5 -> sigprocmask 2.6 -> sigpending 3 -> 捕捉信号 3.1 -> 内核如何实现信号的捕捉 3.2 ->…

在Spring Boot中具有多个实现的接口正确注入的六种方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 在Spring Boot中&#xff0c;当一个接口具有多个实现时&#xff0c;正确地将这些实现注入到需要使用它们的地方是一个常见的需求。以下是在Spring Boot中实现这一目标的六种方式&#xff1a; 1. 使用Autowir…

Apple A18 和 A18 Pro 的裸晶照揭示出兩款處理器有著不同的設計

向來蘋果在發布使用新晶片的設備後&#xff0c;就會有人為新晶片進行詳細剖析&#xff0c;看看蘋果在新處理器上面又使用了什麼新技術。如今 iPhone 16 系列已經推出&#xff0c; Apple A18 和A18 Pro 兩款處理器自然也成為了研究對象。最近就有機構將 Apple A18 和 A18 Pro 兩…

雷池社区版本SYSlog使用教程

雷池会对恶意攻击进行拦截&#xff0c;但是日志都在雷池机器上显示 如何把日志都同步到相关设备进行统一的管理和分析呢&#xff1f; 如需将雷池攻击日志实时同步到第三方服务器, 可使用雷池的 Syslog 外发 功能 启用 Syslog 外发 进入雷池 系统设置 页面, 配置 Syslog 设置…

Miniconda更改虚拟环境创建路径

Miniconda更改虚拟环境创建路径 文章目录 Miniconda更改虚拟环境创建路径前言步骤一 修改配置文件步骤二 提升路径访问权限步骤三 测试配置修改是否生效 前言 在我使用 conda 命令创建新的虚拟环境时&#xff0c;发现创建好的虚拟环境存放路径是在 ../miniconda3/pkgs/ 路径下…

Python 在Excel中添加数据条

在Excel中添加数据条是一种数据可视化技巧&#xff0c;它通过条形图的形式在单元格内直观展示数值的大小&#xff0c;尤其适合比较同一列或行中各个单元格的数值。这种表示方式可以让大量的数字信息一目了然。本文将介绍如何使用Python在Excel中的指定单元格区域添加数据条。 …

Android:记录一个打包发布版的release包以后闪退的问题

个人感觉其实release闪退的问题挺难排查的&#xff0c;因为release包运行起来as捕获不到相应的应用程序进程&#xff0c;从而不易查看到日志&#xff0c;也是我玩得不溜&#xff0c;大家有不同的方法可以评论区探讨&#xff0c;我也定期回复一些评论一起讨论。以下是我遇到的情…

计算机毕业设计 基于Hadoop的智慧校园数据共享平台的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

出海电商新怎样用海外云手机引流?

随着互联网行业的迅猛发展&#xff0c;出海电商、海外社交媒体营销以及游戏产业等领域对技术工具的需求不断增加。在这种趋势下&#xff0c;海外云手机作为一种新型解决方案&#xff0c;正在受到广泛关注。 特别是在出海电商中&#xff0c;平台如亚马逊、速卖通、eBay等通过结合…

MLCC贴片电容不同材质区别:【及电容工作原理】

贴片电容的材质常规有&#xff1a;NPO&#xff08;COG&#xff09;&#xff0c;X7R&#xff0c;X5R&#xff0c;Y5V 等&#xff0c;主要区别是它们的填充介质不同。在相同的体积下由于填充介质不同所组成的电容器的容量就不同&#xff0c;随之带来的电容器的介质损耗、容量稳定…

GS-LRM: Large Reconstruction Modelfor 3D Gaussian Splatting 论文解读

目录 一、概述 二、相关工作 1、多视图的三维重建 2、前馈重建 三、LRM 1、编码器 2、解码器 3、NeRF渲染 四、GS-LRM 1、输入处理 2、Transformer 3、损失函数 五、实验 六、局限 一、概述 该论文提出了一种利用稀疏输入图像高效预测3D高斯原语的方法&#xff…

鸿蒙--WaterFlow 实现商城首页

目录结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ ├──constants │ │ │ └──CommonConstants.ets // 公共常量类 │ │ └──utils │ │ └──Logger.ets // 日志打印类 │ ├──entryability │ │ └──EntryAbility.ets // 程序入口…