ESP32-Web-Server编程- 通过文本框向 Web 提交数据
ESP32-Web-Server编程- 通过文本框向 Web 提交数据
概述
前述章节我们通过简单 HTML、AJAX、Websocket、SSE 在网页上显示数据,通过网页上的按钮控制 ESP32 的行为。从本节开始,我们将进一步了解通过网页与 ESP32 进行交互的方法。
实现更复杂的交互功能,从通过网页向 ESP32 发送字符串、数字开始。ESP32 在接收到这些字符串时可以识别其含义,实现对 ESP32 的灵活的控制。这就是物联网的简单的项目原型了。
需求及功能解析
本节演示如何在 ESP32 上部署一个 Web 服务器,并在访问该 web 服务器时在网页端提供一个字符串输入框、数字输入框。可以在网页输入对应的字符、数字到 ESP32 的 Web 服务器。
示例解析
目录结构
├── CMakeLists.txt
├── main
│ ├── CMakeLists.txt
│ └── main.c User application
├── components
│ └── fs_image
└── README.md This is the file you are currently reading
- 目录结构主要包含主目录 main,以及组件目录 components.
- 其中组件目录components中包含了用于存储网页文件的 fs_image 目录(即前述前端文件)。
前端代码
前端代码的 HTML 部分在 components/fs_image/web_image/index.html 中,创建了两个 input 输入框,类型分别是 Text Field、Text Field,它们分别用于输入字符串、数字。
<div class="card">
<form action="/" method="POST"><p class="card-title">Text Field</p><p><label for="input1">Input 1</label><input type="text" id ="input1" name="input1"><input type ="submit" value ="Submit"></p>
</form>
</div>
<div class="card">
<form action="/" method="POST"><p class="card-title">Number Field</p><p><label for="input2">Input 2</label><input type="number" id ="input2" name="input2"><input type ="submit" value ="Submit"></p>
</form>
此外,在网页上还增加了实时显示当前值的两个显示文本,分别显示当前 ESP32 上字符串、数字的值:
<div class="card"><p class="card-title">Text Value</p><p class="value">Current value: <span id="textFieldValue"></span></p>
</div>
<div class="card"><p class="card-title">Number Value</p><p class="value">Current value: <span id="numberFieldValue"></span></p>
</div>
它们通过 components/fs_image/web_image/js/script.js 中的 getValues() 来获得更新:
// Function to get current readings on the webpage when it loads/refreshes
function getValues(){var xhr = new XMLHttpRequest();xhr.onreadystatechange = function() {if (this.readyState == 4 && this.status == 200) {var myObj = JSON.parse(this.responseText);console.log(myObj);document.getElementById("textFieldValue").innerHTML = myObj.textValue;document.getElementById("numberFieldValue").innerHTML = myObj.numberValue;}}; xhr.open("GET", "/values", true);xhr.send();
}
后端代码
后端代码主要是增加了浏览器通过网页向服务器推送数据时的处理函数update_values_post_handler():
{"/", HTTP_POST, update_values_post_handler, rest_context},
在该函数中,接收推动数据,并解析推送数据中的字符串和数字:
/* Simple handler for uart_info_post handler */
static esp_err_t update_values_post_handler(httpd_req_t* req)
{ESP_LOGD(TAG, "in / post handler");char filepath[FILE_PATH_MAX];rest_server_context_t* rest_context = (rest_server_context_t*) req->user_ctx;char* buf = ((rest_server_context_t*) (req->user_ctx))->scratch;int str_len = 0;char temp_str[128] = {0};if (recv_post_data(req, buf) != ESP_OK) {// modbus_dtu_web_response_error(req, HTTPD_500);ESP_LOGE(TAG, "recv post data error");return ESP_FAIL;}str_len = httpd_find_arg(buf, my_para1, temp_str, sizeof(temp_str));if ((str_len != -1) && (strlen((char *)temp_str) != 0)) {memcpy(my_str, temp_str, strlen(temp_str)+1);ESP_LOGI(TAG, "updates:str=%s", my_str);}memset(temp_str, '\0', sizeof(temp_str));str_len = httpd_find_arg(buf, my_para2, temp_str, sizeof(temp_str));if ((str_len != -1) && (strlen((char *)temp_str) != 0)) {my_num = atoi(temp_str);ESP_LOGI(TAG, "updates:num=%d", my_num);}// return index html filestrlcpy(filepath, rest_context->base_path, sizeof(filepath));strlcat(filepath, "/index.html", sizeof(filepath));if(custom_send_file_chunk(req, filepath) != ESP_OK) {ESP_LOGE(TAG, "rest common send err");return ESP_FAIL;}return ESP_OK;
}
注意,每次更新值,我们都重新返回整个 html 文件,以便于可以触发components/fs_image/web_image/js/script.js 中的 getValues() ,在网页上更新当前下发数据的值。
示例效果

讨论
1)这是我们首次使用 HTTP 的 POST 方法,可以参考 A 回顾 HTTP 的基本方法。我们将在后续的章节掌握更多有趣且使用的开发技能。
总结
1)本节主要是介绍在 ESP32 Web 上部署带输入文本框的网页,通过网页向 ESP32 发送字符串和数字。通过这种机制,我们可以实现对 ESP32 简单的数据通信。
资源链接
1)ESP32-Web-Server ESP-IDF系列博客介绍
2)对应示例的 code 链接 (点击直达代码仓库)
3)下一篇:ESP32-Web-Server编程- 通过滑动条向 Web 提交数据
(码字不易感谢点赞或收藏)
相关文章:
ESP32-Web-Server编程- 通过文本框向 Web 提交数据
ESP32-Web-Server编程- 通过文本框向 Web 提交数据 概述 前述章节我们通过简单 HTML、AJAX、Websocket、SSE 在网页上显示数据,通过网页上的按钮控制 ESP32 的行为。从本节开始,我们将进一步了解通过网页与 ESP32 进行交互的方法。 实现更复杂的交互功…...
NAT网络地址转换
目录 什么是nat nat 实验如何使用SNAT 和 DNAT 实验环境 内网连接外网 1.给网关服务器添加网卡(两张网卡) 2.查看新添加的网卡名 编辑网卡配置 3.开启路由转发 4.打开内网服务器 5.切换到外网服务器(192.168.17.30࿰…...
PyTorch模型训练过程内存泄漏问题解决
近日,在模型训练过程中,发现过一段时间后进程会被kill,观察发现是由于内存泄漏问题造成的。通过逐行代码注释,发现问题在于数据集中的此行代码: info self.data_list[index]这里,self.data_list是dataset…...
【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据
【matlab程序】matlab利用工具包nctool读取grib2、nc、opendaf、hdf5、hdf4等格式数据 引用: B. Schlining, R. Signell, A. Crosby, nctoolbox (2009), Github repository, https://github.com/nctoolbox/nctoolbox Brief summary: nctoolbox is a Matlab toolbox…...
pytorch训练模板
来源:http://worthpen.top/#/home/blog?blogpot-blog36.md 引言 本项目实现了基于PyTorch Lightning的神经网络训练和测试管道。项目除了实现PyTorch Lightning的工作流外,还实现了通过任务池在训练过程中添加任务、k折交叉验证、将训练结果保存在.cv…...
代码随想录二刷 |字符串 |反转字符串
代码随想录二刷 |字符串 |反转字符串 题目描述解题思路 & 代码实现 题目描述 344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须…...
Rust语言入门教程(九) - 结构体
格式及语法 在其他很多编程语言中,有类(Class)的存在,在Rust中,我们没有类(Class)的概念,我们使用结构体(Struct)。 与一个结构体相关的有以下几个部分: 数据字段方法关联函数 声明一个结构体及其字段的格式如下&am…...
如何使用Qchan搭建更好保护个人隐私的本地图床并在公网可访问
文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景,在大量开发人员的努力下,已经开发出大…...
AI伪原创软件-AI伪原创工具下载
在当今数字化时代,创作者们在追求独特创意的同时,也面临着时间和灵感的双重挑战。AI伪原创技术应运而生,为创作者提供了一种快捷而便利的解决方案。本文将专心分享两款备受瞩目的AI伪原创工具,147SEO伪原创、百度文心一言伪原创&a…...
【python脚本】获取OneNET数据写入本地文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # pip install prettytable import time import urllib.request as req import json import os# 设备ID、Key # ESP-12F deviceId "1047311396" APIKey "z0Yq8d3P16l2SbEwuZcXZuCidM"# 上传函数 def OneN…...
5 存储器映射和寄存器
文章目录 5.3 芯片内核5.3.1 ICache5.3.2 DCache5.3.3 FlexRAM 5.4 存储器映射5.4.1 存储器功能划分5.4.1.1 存储器 Block0 内部区域功能划分5.4.1.2 储存器 Block1 内部区域功能划分5.4.1.3 储存器 Block2 内部区域功能划分 5.5 寄存器映射5.5.1 GPIO1的输出数据寄存器 5.3 芯…...
决策树学习
1. 背景 DT决策树是一种基本的分类与回归方法,其学习时,利用训练数据,根据损失函数最小化原则建立DT模型。 分类DT主要优点:模型具有可读性,分类速度快。 由DT树的根结点到叶结点的每一条路径构建一条规则&…...
如何在Ubuntu系统上安装Git
简单介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具CVS,Subversion 等不同,它采用了分布式版…...
Leetcode.974 和可被 K 整除的子数组
题目链接 Leetcode.974 和可被 K 整除的子数组 rating : 1676 题目描述 给定一个整数数组 n u m s nums nums 和一个整数 k k k ,返回其中元素之和可被 k k k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&…...
Vue打包错误UnhandledPromiseRejectionWarning: CssSyntaxError
错误详情如下: building for production...Error processing file: static/css/app.3d5caae7aaba719754d7d5c30b864551.css (node:33011) UnhandledPromiseRejectionWarning: CssSyntaxError: /Users/yt/Documents/BM/sims-plus/sims-website/static/css/app.3d5caa…...
鸿蒙系统扫盲(三):鸿蒙开发用什么语言?
1.两种开发方向 我们常说鸿蒙开发,但是其实鸿蒙开发分为两个方向: 一个是系统级别的开发,比如驱动,内核和框架层的开发,这种开发以C/C为主 还有一个是应用级别的开发,在API7以及以下,还是支持…...
linux 中vmalloc实现简述
vmalloc 用途 vmalloc只用于内核模块的逻辑地址分配,也就是说它的逻辑地址是挂在init_mm的pgd页表上的。它可将几段不连续物理区域合并分配一个连续逻辑区域。主要用于内核和驱动。 vmalloc 实现 入口在__vmalloc_node_range。 首先分配一个vm_struct,…...
homeassistant 随笔
1.使用mushroom-strategy自动生成ui,隐藏中文ares,名字为区域的拼音,例如显示厨房则真实名字为chu_fang 隐藏图片中的工作室 代码为:...
带大家做一个,易上手的家常炒鸡蛋
想做这道菜 先准备五个鸡蛋 然后将鸡蛋打到碗里面 然后 加小半勺盐 这个看个人喜好 放多少都没问题 不要太咸就好 将鸡蛋搅拌均匀 起锅烧油 油温热了之后 放三个干辣椒进去炒 干辣椒烧黑后 捞出来 味道就留在油里了 然后 倒入鸡蛋液 翻炒 注意翻炒 不要粘锅底 或者 一面糊…...
芒格传奇落幕!生前最后一次谈论比特币,说了什么?
当地时间11月28日,知名投资公司伯克希尔哈撒韦发布声明,公司董事会副主席查理芒格(Charlie Munger)于当天早上在美国加利福尼亚州的一家医院去世,终年99岁,距离其百岁生日仅剩1个月。 巴菲特在一份声明中表示:“没有查…...
固件逆向实战指南:从熵值分析到函数重建的七步法
1. 这不是“刷机教程”,而是一份固件逆向的实战切片很多人第一次听说“固件逆向”,脑子里浮现的是路由器刷OpenWrt、智能摄像头换壳跑Home Assistant,或者某款老式NAS突然不支持新硬盘,只好翻出U-Boot命令硬怼。这些确实是固件逆向…...
深度揭秘:如何在Mac上无痛备份微信聊天记录
深度揭秘:如何在Mac上无痛备份微信聊天记录 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因微信聊天记录丢失而懊恼?那些珍贵的对话、重…...
为什么顶尖团队禁用Claude自动生成微服务?(内部泄露的5条红线规则与替代性增强方案)
更多请点击: https://intelliparadigm.com 第一章:为什么顶尖团队禁用Claude自动生成微服务?(内部泄露的5条红线规则与替代性增强方案) 顶尖工程团队在微服务架构演进中,普遍将大语言模型(LLM&…...
RMSNorm:LLM 里的归一化为什么换成了这个
本文基于昇腾CANN和昇腾NPU,围绕 ops-transformer 仓库的相关技术展开。 LayerNorm 在大模型里被 RMSNorm 替换了。LayerNorm 做了减均值再除方差,RMSNorm 只除均方根——去掉了减均值那一步。少一次 Reduce 操作,在量产推理里省掉 15-20% 的…...
从实战出发:聊聊Serial口静态路由在老旧网络设备迁移中的那些事儿
从实战出发:聊聊Serial口静态路由在老旧网络设备迁移中的那些事儿 第一次在机房里见到那台积满灰尘的Cisco 1841时,我差点以为这是个博物馆展品。但客户坚持说这台服役超过15年的老伙计承载着他们最重要的生产线控制数据,任何闪失都可能造成六…...
Insomnia终极指南:构建高效API测试与协作的完整工作流
Insomnia终极指南:构建高效API测试与协作的完整工作流 【免费下载链接】insomnia The open-source, cross-platform API client for GraphQL, REST, WebSockets, SSE and gRPC. With Cloud, Local and Git storage. 项目地址: https://gitcode.com/gh_mirrors/in/…...
GQA:多查少算的 Attention 头组合
本文基于昇腾CANN和昇腾NPU,围绕 ops-transformer 仓库的相关技术展开。 MHA(Multi-Head Attention)每个 Head 一套 QKV——8 个 Head 就是 8 组。MQA 省过头了——8 个 Head 共享 K、V。GQA(Grouped Query Attention)…...
Anthropic 万亿估值启示录:战略聚焦如何击败全面扩张
【摘要】深入分析 Anthropic 从初创到估值破万亿的爆发式增长路径,揭示其在 AI 行业后来居上的核心密码。从战略聚焦与组织文化两个维度,拆解技术路线选择、人才管理、治理结构等关键决策,为 AI 时代的技术团队与企业管理者提供可借鉴的实践框…...
嘎嘎降AI和率零深度对比:2026年同为低价工具效果差距完整评测报告
嘎嘎降AI和率零深度对比:2026年同为低价工具效果差距完整评测报告 选工具之前做了一周功课,试用了三款,最后定了嘎嘎降AI(www.aigcleaner.com)。 4.8元,知网AI率从61%降到了5.3%,达标率99.26%…...
Kafka 2.8.0到3.4.0滚动升级实录:单副本Topic的可用性挑战与ISR列表监控
Kafka集群升级中的单副本Topic风险治理:ISR监控与高可用实践 引言 在分布式消息系统的世界里,Kafka凭借其高吞吐、低延迟的特性成为企业级数据管道的首选。但当运维团队面临版本升级时,那些隐藏在配置细节中的"定时炸弹"往往成为…...
