ESP32利用WebServer进行设备配置

news2024/10/9 18:46:31

目标需求

利用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.coloradmin.cn/o/2199734.html

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

相关文章

前沿论文 M5Product 组会 PPT

对比学习&#xff08;Contrast learning&#xff09;&#xff1a;对比学习是一种自监督学习方法&#xff0c;用于在没有标签的情况下&#xff0c;通过让模型学习哪些数据点相似或不同来学习数据集的一般特征。假设一个试图理解世界的新生婴儿。在家里&#xff0c;假设有两只猫和…

PPT在线画SWOT分析图!这2个在线软件堪称办公必备!

swot分析ppt怎么做&#xff1f; swot分析是一个非常常用的战略分析框架&#xff0c;经常会在ppt中使用。想在ppt中绘制swot分析图&#xff0c;使用自带的形状工具可以制作出来&#xff0c;但绘制效率不够高&#xff0c;在需要大批量制作的场景下&#xff0c;会让人非常心累………

【WebGis开发 - Cesium】三维可视化项目教程---初始化场景

系列文章目录 【WebGis开发 - Cesium】三维可视化项目教程—视点管理 目录 系列文章目录引言一、Cesium引入项目1.1 下载资源1.2 项目引入Cesium 二、初始化地球2.1 创建基础文件2.1.1 创建Cesium工具方法文件2.1.2 创建主页面 2.2 看下效果 三、总结 引言 本教程主要是围绕Ce…

现场直击!2023望繁信科技产品发布会精彩回顾

2023望繁信科技产品发布会圆满结束。 感谢200余名企业代表、合作伙伴、媒体到场参会&#xff0c;感谢3万多位关注望繁信科技和流程挖掘的朋友在线观看直播。 在会上&#xff0c;我们正式分享了望繁信科技多年深耕流程挖掘领域的思考、积累和部署&#xff0c;发布了过去一年在…

Pyppeteer:如何在 Python 中使用 Puppeteer 和 Browserless?

Python 中的 Pyppeteer 是什么&#xff1f; Pyppeteer 是流行的 Node.js 库 Puppeteer 的 Python 移植版本&#xff0c;用于以编程方式控制无头 Chrome 或 Chromium 浏览器。 本质上&#xff0c;Pyppeteer 允许 Python 开发人员在 Web 浏览器中自动执行任务&#xff0c;例如抓…

webm格式怎么转换成mp4?值得给你推荐的几种简单方法

webm格式怎么转换成mp4&#xff1f;MP4支持多种音频和视频编解码器&#xff0c;如H.264和AAC&#xff0c;用户可以根据需要调整视频和音频质量&#xff0c;以满足不同需求。同时&#xff0c;许多视频编辑软件广泛支持MP4格式&#xff0c;使得剪辑、合成和特效处理变得更加便捷。…

人工智能、人机交互和机器人国际学术会议

第三届人工智能、人机交互和机器人国际学术会议 &#xff08;AIHCIR 2024&#xff09;组委会热忱地邀请您参与本届大会。本届大会旨在聚集领先的科学家、研究人员和学者&#xff0c;共同交流和分享在人工智能、人机交互和机器人各个方面的经验和研究成果&#xff0c;为研究人员…

【C++】模板(初识):函数模板、类模板

本篇主要介绍C中的模板初阶的一些知识。模板分为函数模板和类模板&#xff0c;我们一个一个来看。 1.函数模板 1.1函数模板概念 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实际的参数类型产生函数特定版本。…

LSTM时间序列模型实战——预测上证指数走势

LSTM时间序列模型实战——预测上证指数走势 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&#xff0c;姿态识别&#xff0c;…

五款软件助你秒变职场达人

✨ 每天忙碌于工作&#xff0c;却感觉事半功倍&#xff1f;别担心&#xff0c;今天就为大家揭秘5款高效工作软件&#xff0c;让你秒变职场达人&#xff0c;效率直线飙升&#xff01;&#x1f389; 1️⃣ 亿可达 &#x1f3d7;️ 软件连接神器 &#x1f3af; 特点&#xff1a…

Java后端面试很水的,7天就能搞定!

随着Java的越来越卷&#xff0c;面试也直接上难度了&#xff0c;从以前的八股文到场景题了&#xff0c;尤其是有经验的去面试&#xff0c;场景题都是会问的&#xff0c;近期面试过的应该都深有体会&#xff01; 场景题230道&#xff1a; 1.分布式锁加锁失败后的等待逻辑是如何…

项目管理全流程包括哪些环节,一文读懂项目管理全流程

项目管理全流程是一个系统性、阶段性的过程&#xff0c;旨在确保项目从启动到完成的高效运行。该流程包括以下几个关键阶段&#xff1a;项目管理全流程是确保项目从启动到完成顺利进行的一系列阶段和活动的总称。 以下是基于项目管理全流程对项目管理的描述&#xff1a; 一、…

单路测径仪的详细介绍

蓝鹏测控单路测径仪是一种高精度、高效率的在线检测设备&#xff0c;广泛应用于线缆、电缆、电线、胶管、塑料管、金属丝等行业的生产过程中。以下是对该产品的详细介绍&#xff1a; 一、核心技术与工作原理 蓝鹏测控单路测径仪以光电检测为核心&#xff0c;结合单片机、LED灯、…

Qt-QStatusBar窗口状态栏相关操作(48)

目录 描述 使用 设置临时消息 添加子控件 添加 Labe 添加 进度条 从右边添加 按钮 描述 状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部&#xff0c;⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中&#xff0c;状态栏是通过 QStatusBar类 来实现的。在状态…

Linux-处理用户输入

命令行参数 特殊参数变量 移动变量 处理选项-查找选项 处理选项-使用getopt命令 获得用户输入

讲座在线预约管理系统的设计与实现使用SpringBootSSM框架开发

目录 摘要 1 引言 2 系统需求分析 3 技术选型 4 系统架构设计 5 核心功能实现 5.1 用户管理 5.2 讲座管理 5.3 预约管理 5.4 评论系统 6 安全性考虑 7 测试 8 结论 摘要 本文旨在设计和实现一个基于Spring Boot SSM框架的讲座在线预约管理系统&#xff0c;并结合…

【Linux进程间通信】深入探索:Linux下的命名管道与System V共享内存

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux进程间通信 &#x1f4d2;1. 命名管道&#x1f4d9;2. 命名管道实现server&client通…

环境变量及命令行参数

目录 一、环境变量的概念和基本命令 二、环境变量的组织结构及获取环境变量的方式 &#xff08;1&#xff09;组织结构 &#xff08;2&#xff09;获取环境变量 命令行第三个参数 通过第三方变量environ获取 通过系统调用getenv获取 三、命令行参数 一、环境变量的概念和…

Go语言对接微信支付与退款全流程指南

在互联网技术日益发展的今天&#xff0c;线上支付已成为不可或缺的一部分。作为一门简洁高效的编程语言&#xff0c;Go&#xff08;又称Golang&#xff09;凭借其强大的并发处理能力和高效性能&#xff0c;在后端开发领域越来越受到开发者的青睐。本文将详细介绍如何使用Go语言…

学习干货IF=93.6!开发临床预测模型:分步指南

预测患者未来结果对临床实践至关重要&#xff0c;有助于医生做出明智决策。尽管每年发布大量预测模型&#xff0c;但许多研究存在方法学局限&#xff0c;如样本量不足和模型验证不充分&#xff0c;这削弱了模型的实际应用价值。因此&#xff0c;必须深入探讨并改进这些局限性&a…