ESP8266+httpServer+GET+POST实现网页验证密码
1. 代码
#include "esp_http_server.h"
#include "esp_log.h"
#include "web_server.h"// 辅助宏,用于计算两个数中的较小值
#define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG = "wifi web_server";const char login_page[] = {"\
<!DOCTYPE html>\
<html>\
<head>\
<meta charset='UTF-8'>\
<title>Sensor Configuration</title>\
</head>\
<body>\
<form method='POST' action='login.html'>\
<br>\
<P align=center style='color:#0066ff'><b>Sensor</b></P>\
<br><br>\
<P align=center>登录密码:    <input name=PASSWORD type=password size=18 maxlength=15></P>\
<br>\
<P align=center><input type=submit value='进入'></P>\
</form>\
</body>\
</html>\
"};const char str_password_ok[] = "Password validated successfully";
const char str_password_ng[] = "Invalid password";
const char str_password_lost[] = "Missing PASSWORD field";// HTTP服务器配置
esp_err_t http_get_handler(httpd_req_t *req)
{
// const char* resp_str = "<html><body><h1>Hello ESP8266!</h1></body></html>";const char* resp_str = login_page;ESP_LOGI(TAG, "send login html");httpd_resp_send(req, resp_str, strlen(resp_str));return ESP_OK;
}// 预期的密码
static const char *expected_password = "88888";// 用于存储从请求体中读取的数据(注意:这里使用了固定大小)
#define REQUEST_BODY_MAX_SIZE 1024
static char request_body[REQUEST_BODY_MAX_SIZE] = {0};
static size_t request_body_len = 0;// 辅助函数:从请求中读取数据(使用固定大小缓冲区)
static esp_err_t read_request_body(httpd_req_t *req) {//char buffer[128]; // 临时缓冲区,小于总缓冲区大小int len;// 循环读取请求体数据,直到没有更多数据可读或缓冲区满len = httpd_req_recv(req, request_body, REQUEST_BODY_MAX_SIZE - 1);if (len == HTTPD_SOCK_ERR_TIMEOUT) {// 超时错误处理ESP_LOGE("http_server", "Read timeout");return ESP_ERR_TIMEOUT;} else if (len < 0) {// 读取错误处理ESP_LOGE("http_server", "Error reading request body");return ESP_FAIL;}// 确保字符串以 null 结尾request_body[len] = '\0';request_body_len = len; // 更新请求体长度return ESP_OK;
}esp_err_t http_post_handler(httpd_req_t *req) {// 重置请求体缓冲区memset(request_body, 0, REQUEST_BODY_MAX_SIZE);request_body_len = 0;// 读取整个请求体if (read_request_body(req) != ESP_OK) {// 读取请求体时发生错误httpd_resp_send_500(req);return ESP_FAIL;}// 假设请求体是 URL 编码的,并且包含 PASSWORD=...char *password_start = strstr(request_body, "PASSWORD=");if (password_start != NULL) {password_start += strlen("PASSWORD=");char *password_end = strchr(password_start, '&'); // 查找下一个字段的开始或字符串末尾if (password_end == NULL) {password_end = password_start + strlen(password_start); // 如果没有 '&',则指向末尾}// 计算密码长度(注意:这里要防止越界)size_t password_len = MIN(password_end - password_start, strlen(expected_password));// 比较密码if (strncmp(password_start, expected_password, password_len) == 0 &&(password_len == strlen(expected_password) || *(password_end - 1) == '&')) {httpd_resp_send(req, str_password_ok,strlen(str_password_ok)); //HTTP_OK} else {httpd_resp_send(req, str_password_ng,strlen(str_password_ng)); //HTTP_UNAUTHORIZED,}} else {httpd_resp_send(req, str_password_lost,strlen(str_password_lost)); //HTTP_BAD_REQUEST,}return ESP_OK;
}httpd_handle_t start_webserver(void)
{httpd_handle_t server = NULL;httpd_config_t config = HTTPD_DEFAULT_CONFIG();// GET 请求处理httpd_uri_t get_uri = {.uri = "/",.method = HTTP_GET,.handler = http_get_handler,.user_ctx = NULL};// POST 请求处理(注意:这里假设表单提交到 /login)httpd_uri_t post_uri = {.uri = "/login.html",.method = HTTP_POST,.handler = http_post_handler,.user_ctx = NULL};// 启动HTTP服务器if (httpd_start(&server, &config) == ESP_OK) {ESP_LOGI(TAG, "Server started");if (httpd_register_uri_handler(server, &get_uri) != ESP_OK) {ESP_LOGE(TAG, "Failed to register GET URI handler");}if (httpd_register_uri_handler(server, &post_uri) != ESP_OK) {ESP_LOGE(TAG, "Failed to register POST URI handler");}} else {ESP_LOGE(TAG, "Failed to start server");}return server;
}
2 . 密码错误、正确的网页效果
相关文章:

ESP8266+httpServer+GET+POST实现网页验证密码
1. 代码 #include "esp_http_server.h" #include "esp_log.h" #include "web_server.h"// 辅助宏,用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…...

git仓库修改ip,本地代码修改
只需求修改本地项目下面的.git文件夹下的config 替换ip即可...

轻便灵活,声学卓越,流动会场创新应用—轻空间
随着现代社会对高效、灵活场地需求的日益增加,传统建筑场馆的局限性逐渐显现。无论是大型会议、临时展览,还是文化活动,企业与组织往往需要一个既能快速搭建,又具备顶级声学效果的多功能场所。由轻空间打造的流动会场应运而生&…...

13 Midjourney从零到商用·进阶篇:灯光、角度与风格等精细控制方法
在前面我们了解了提示词的书写,那么如何利用提示词来精确控制生成画面的灯光、角度与风格 呢?在本篇文章中我么一起来探讨一下。 一、灯光 在摄影中,对灯光的要求都是非常高的。灯光能对人物、动物、物体、场景等进行修饰。每一种微小的的灯光…...
为什么要把raw转成yuv
将RAW图像数据转换为YUV格式在图像处理和视频编解码领域有多个重要的原因。以下是一些主要原因: 1. 标准化和兼容性 视频编解码标准:YUV格式是许多视频编解码标准(如H.264、H.265等)所使用的颜色空间。将RAW数据转换为YUV可以使…...

基于双向RRT算法的三维空间最优路线规划matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 单向RRT算法 4.2 双向RRT算法 5.完整程序 1.程序功能描述 基于双向RRT(Randomly Exploring Random Trees, 随机探索随机树)算法的三维空间最优路径规划是一种解…...

若依-原理
1.代码生成器 1.1源码分析 代码生成器分为两个部分: 第一部分涉及将业务表结构导入到系统中 第二部分是点击生成按钮,系统将根据表结构生成相应的前后端代码,并提供下载。 1.表结构说明 gen_table:存储业务表的基本信息 &am…...

台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程
一、前言 台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程 佳易王台球灯控系统可外接灯控设备,用软件来控制灯的开关 开始计时的时候灯点亮,结账后灯自动关闭 二、计时灯控电路图 佳易王计时计费软件配套的灯控设备布线图,如上…...
安卓将本地日志上传到服务器
在安卓开发中,将本地日志上传到服务器是一个常见的需求,特别是在开发需要远程监控或调试的应用时。以下是一个基本的步骤和示例,说明如何实现这一功能: 1 本地日志上传到服务器 1.1 准备服务器 首先,你需要在服务器…...

FloodFill(洪水灌溉)算法专题——DFS深搜篇
目录 1、图像渲染 1.1 算法原理 1.2 算法代码 2、岛屿数量 2.1 算法原理 2.2 算法代码 3、岛屿的最大面积 3.1 算法原理 3.2 算法代码 4、被围绕的区域 4.1 算法原理 4.2 算法代码 5、太平洋大西洋水流问题 5.1 算法原理 5.2 算法代码 6、扫雷游戏 6.1 算法原理…...

直播标准权威发布,阿里云RTS获首批卓越级评估认证
近期举办的2024“可信云大会”上,中国信通院正式发布了2024年上半年音视频领域最新评估结果。阿里云超低延时直播,以首批卓越级,通过中国信通院超低延时直播性能及服务质量分级测试。 标准发布,权威量化直播体验质量 从直播元年发…...

iOS 知识点记录
王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址:戴铭的博客 git地址:ming1016 (戴铭) GitHub 《i…...
C++系列-STL中搜索相关算法
STL中search相关算法 💢search相关算法💢💢search算法举例💢💢search_n算法举例💢💢binary_search算法举例 💢 lower_bound💢 upper_bound💢 lower_bound和up…...
5.C++程序中的注释
我们来看上节所写的程序 #include <iostream> using namespace std;void prnt() //打印A {cout << "printA" << endl; }int main() {prnt();return 0; } 上面的程序中“//打印A”,表示说明当前函数是打印内容的函数,具体…...
com.kingbase8.util.KSQLException: ERROR: permission denied for table xxx
前言 在信创改造中,数据库替换为国产数据库是不可缺少的一部分。而可替换选项中多数选项无非是人大金仓和达梦数据库二选一。本文将介绍人大金仓在使用过程的问题以及解决办法。 问题 在使用人大金仓数据库后,程序运行报错 com.kingbase8.util.KSQLEx…...

开发小程序
由于之前购入的阿里云ECS放着落灰,碰巧又看到个有趣的项目,于是就做了个生成头像的小程序…由于第一次完整发布小程序,记录一下遇到的问题 小程序名称:靓仔创意头像 😂 关于小程序 接口请求,在开发过程中…...
JS考核答案
1.请简述var, let, const的区别? (1)块级作用域:块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题: 内层变量可能覆盖外层变量 用来计数的…...

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)
1. 安装 npm i amap/amap-jsapi-loader --save移步:官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…...

MySQL底层为什么选择用B+树作为索引
首先,我们来想想为什么这么多数据结构,为什么要用树这种数据结构? 众多的数据结构在逻辑层面可分为:线性结构 和 非线性结构。 线性结构有:数组、链表,基于它们衍生出的有哈希表(哈希表也称散…...

MATLAB系列05:自定义函数
MATLAB系列05:自定义函数 5. 自定义函数5.1 MATLAB函数简介5.2 在MATLAB中传递变量:按值传递机制5.3 选择性参数5.4 用全局内存分享数据5.5 在函数两次调用之间本地数据的存储5.6 函数的函数(function functions)5.7 子函数和私有函数5.8 总结 5. 自定义…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
Java中栈的多种实现类详解
Java中栈的多种实现类详解:Stack、LinkedList与ArrayDeque全方位对比 前言一、Stack类——Java最早的栈实现1.1 Stack类简介1.2 常用方法1.3 优缺点分析 二、LinkedList类——灵活的双端链表2.1 LinkedList类简介2.2 常用方法2.3 优缺点分析 三、ArrayDeque类——高…...

MAZANOKE结合内网穿透技术实现跨地域图像优化服务的远程访问过程
文章目录 前言1. 关于MAZANOKE2. Docker部署3. 简单使用MAZANOKE4. 安装cpolar内网穿透5. 配置公网地址6. 配置固定公网地址总结 前言 在数字世界高速发展的今天,您是否察觉到那些静默增长的视觉数据正在悄然蚕食存储空间?随着影像记录成为日常习惯&…...

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题
2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题 (二)模块 A:安全事件响应、网络安全数据取证、应用安全、系统安全任务一:漏洞扫描与利用:任务二:Windows 操作系统渗透测试 :任务三&…...
【AI教我写网站-ECG datacenter】
阶段性总结:后端用户管理基础 在项目管理和协作中,清晰地阐述“为什么做”比“怎么做”更能凝聚共识和提供方向。我们不仅要理解技术实现,更要明白其背后的动机和意义。 让我们重新回顾并总结我们到目前为止的工作,这次会更侧重…...