当前位置: 首页 > news >正文

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>登录密码:&nbsp&nbsp&nbsp&nbsp;<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"// 辅助宏&#xff0c;用于计算两个数中的较小值 #define MIN(a, b) ((a) < (b) ? (a) : (b))static const char *TAG "wifi web_server";c…...

git仓库修改ip,本地代码修改

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

轻便灵活,声学卓越,流动会场创新应用—轻空间

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

13 Midjourney从零到商用·进阶篇:灯光、角度与风格等精细控制方法

在前面我们了解了提示词的书写&#xff0c;那么如何利用提示词来精确控制生成画面的灯光、角度与风格 呢&#xff1f;在本篇文章中我么一起来探讨一下。 一、灯光 在摄影中&#xff0c;对灯光的要求都是非常高的。灯光能对人物、动物、物体、场景等进行修饰。每一种微小的的灯光…...

为什么要把raw转成yuv

将RAW图像数据转换为YUV格式在图像处理和视频编解码领域有多个重要的原因。以下是一些主要原因&#xff1a; 1. 标准化和兼容性 视频编解码标准&#xff1a;YUV格式是许多视频编解码标准&#xff08;如H.264、H.265等&#xff09;所使用的颜色空间。将RAW数据转换为YUV可以使…...

基于双向RRT算法的三维空间最优路线规划matlab仿真

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

若依-原理

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

台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程

一、前言 台球厅灯控系统如何布线 佳易王桌球计时计费管理系统操作教程 佳易王台球灯控系统可外接灯控设备&#xff0c;用软件来控制灯的开关 开始计时的时候灯点亮&#xff0c;结账后灯自动关闭 二、计时灯控电路图 佳易王计时计费软件配套的灯控设备布线图&#xff0c;如上…...

安卓将本地日志上传到服务器

在安卓开发中&#xff0c;将本地日志上传到服务器是一个常见的需求&#xff0c;特别是在开发需要远程监控或调试的应用时。以下是一个基本的步骤和示例&#xff0c;说明如何实现这一功能&#xff1a; 1 本地日志上传到服务器 1.1 准备服务器 首先&#xff0c;你需要在服务器…...

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“可信云大会”上&#xff0c;中国信通院正式发布了2024年上半年音视频领域最新评估结果。阿里云超低延时直播&#xff0c;以首批卓越级&#xff0c;通过中国信通院超低延时直播性能及服务质量分级测试。 标准发布&#xff0c;权威量化直播体验质量 从直播元年发…...

iOS 知识点记录

王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址:戴铭的博客 git地址:ming1016 (戴铭) GitHub 《i…...

C++系列-STL中搜索相关算法

STL中search相关算法 &#x1f4a2;search相关算法&#x1f4a2;&#x1f4a2;search算法举例&#x1f4a2;&#x1f4a2;search_n算法举例&#x1f4a2;&#x1f4a2;binary_search算法举例 &#x1f4a2; lower_bound&#x1f4a2; upper_bound&#x1f4a2; lower_bound和up…...

5.C++程序中的注释

我们来看上节所写的程序 #include <iostream> using namespace std;void prnt() //打印A {cout << "printA" << endl; }int main() {prnt();return 0; } 上面的程序中“//打印A”&#xff0c;表示说明当前函数是打印内容的函数&#xff0c;具体…...

com.kingbase8.util.KSQLException: ERROR: permission denied for table xxx

前言 在信创改造中&#xff0c;数据库替换为国产数据库是不可缺少的一部分。而可替换选项中多数选项无非是人大金仓和达梦数据库二选一。本文将介绍人大金仓在使用过程的问题以及解决办法。 问题 在使用人大金仓数据库后&#xff0c;程序运行报错 com.kingbase8.util.KSQLEx…...

开发小程序

由于之前购入的阿里云ECS放着落灰&#xff0c;碰巧又看到个有趣的项目&#xff0c;于是就做了个生成头像的小程序…由于第一次完整发布小程序&#xff0c;记录一下遇到的问题 小程序名称&#xff1a;靓仔创意头像 &#x1f602; 关于小程序 接口请求&#xff0c;在开发过程中…...

JS考核答案

1.请简述var, let, const的区别&#xff1f; &#xff08;1&#xff09;块级作用域&#xff1a;块作用域由 { }包括&#xff0c;let和const具有块级作用域&#xff0c;var不存在块级作用域。块级作用域解决了ES5中的两个问题&#xff1a; 内层变量可能覆盖外层变量 用来计数的…...

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 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+树作为索引

首先&#xff0c;我们来想想为什么这么多数据结构&#xff0c;为什么要用树这种数据结构&#xff1f; 众多的数据结构在逻辑层面可分为&#xff1a;线性结构 和 非线性结构。 线性结构有&#xff1a;数组、链表&#xff0c;基于它们衍生出的有哈希表&#xff08;哈希表也称散…...

MATLAB系列05:自定义函数

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

别等宕机才后悔!UPS蓄电池定期巡检,这4点才是核心!

&#xff5c;机房里设备林立&#xff0c;大多数人把目光聚焦在服务器、精密空调上。但其实&#xff0c;潜伏在机房角落的“隐形杀手”&#xff0c;往往是看起来默默无闻的UPS蓄电池。今天我们不谈复杂的技术参数&#xff0c;只用大白话讲清楚&#xff1a;为什么蓄电池必须定期巡…...

电路原理与人生哲学的奇妙对应关系

1. 电路与人生的奇妙映射作为一名在电子行业摸爬滚打十多年的工程师&#xff0c;我常常惊叹于电路原理与人生百态之间的惊人相似。记得刚入行时&#xff0c;我的导师就说过&#xff1a;"读懂电路&#xff0c;就读懂了人生。"当时只觉得是句玩笑话&#xff0c;直到这些…...

Omni-Vision Sanctuary 企业级部署架构设计:高可用与弹性伸缩

Omni-Vision Sanctuary 企业级部署架构设计&#xff1a;高可用与弹性伸缩 1. 企业级AI部署面临的挑战 当企业决定在生产环境中部署Omni-Vision Sanctuary这类AI服务时&#xff0c;通常会遇到几个关键挑战。首先是服务可用性问题&#xff0c;任何计划外停机都可能直接影响业务…...

Monaco-Editor插件使用小坑

无法通过鼠标进行选中文本<div id"monacoEditor" class"monacoEditor"></div>外层添加了splinter拖拽组件&#xff0c;导致mousemove事件被拦截&#xff0c;给monaco-editor添加css&#xff1a;pointer-events&#xff1a;auto.monacoEditor .…...

STM32实战:sprintf格式化字符串在嵌入式LCD显示中的高效应用

1. sprintf函数在STM32开发中的基础应用 第一次在STM32上使用sprintf函数时&#xff0c;我被它的强大功能惊艳到了。这个看似简单的函数&#xff0c;却能帮我们把各种数据类型转换成整齐的字符串&#xff0c;这在嵌入式开发中简直是神器。记得当时我在调试一个温湿度传感器项目…...

投资分析太复杂?用TradingAgents-CN实现零代码智能分析的3个方案

投资分析太复杂&#xff1f;用TradingAgents-CN实现零代码智能分析的3个方案 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN TradingAgents-CN作…...

分子对接盒子参数智能生成:GetBox-PyMOL-Plugin蛋白质结构分析专业指南

分子对接盒子参数智能生成&#xff1a;GetBox-PyMOL-Plugin蛋白质结构分析专业指南 【免费下载链接】GetBox-PyMOL-Plugin A PyMOL Plugin for calculating docking box for LeDock, AutoDock and AutoDock Vina. 项目地址: https://gitcode.com/gh_mirrors/ge/GetBox-PyMOL-…...

思源宋体实战指南:7种字重构建与多语言字体优化技巧

思源宋体实战指南&#xff1a;7种字重构建与多语言字体优化技巧 【免费下载链接】source-han-serif Source Han Serif | 思源宋体 | 思源宋體 | 思源宋體 香港 | 源ノ明朝 | 본명조 项目地址: https://gitcode.com/gh_mirrors/sou/source-han-serif 思源宋体作为Adobe推…...

经验值|React 实时数据图表性能为什么会越来越卡?

在使用 React 和 Highcharts 创建实时图表时&#xff0c;性能下降通常与以下几个因素有关&#xff1a;频繁更新状态&#xff1a;如果你频繁更新图表的数据状态&#xff0c;React 可能会进行多次重渲染&#xff0c;导致性能下降。建议使用 useRef 来引用图表实例&#xff0c;避免…...

FSearch:Linux系统上如何用这款革命性工具实现毫秒级文件搜索

FSearch&#xff1a;Linux系统上如何用这款革命性工具实现毫秒级文件搜索 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 你是否曾在Linux系统中为寻找一个文件而花费…...