ESP32应用开发-Webserver

server/2024/10/22 18:30:13/

文章目录

    • 库调用
    • 实例
    • 实现思路
    • 技术要点
      • 1. 前端涉及的文件需要包装再发送
      • 2. http-GET路由
      • 3. http-POST路由

库调用

#include <WebServer.h>
#include <ArduinoJson.h>	//IDE没有自带,需自行安装

实例


WebServer server(80);static const char index_html[] PROGMEM = R"==(  <!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="styleLoading.css"> <title>沃进DTU配置系统</title><style></style>
</head>
<body><div class="content"><div><div class="casePage"><div class="disflex" style="justify-content: space-between;"><div class="titltInfo disflex"><div class="title_wayos" style="margin-bottom: 10px;"><a href="https://vollgo.cn/">沃进科技</a></div></div></div></div></div></div>
</body>
<script>
</script>
</html>)==";  void setup() {Serial.begin(115200);Serial.println("system start");IPAddress apIP({192, 168, 4, 1});    //设置AP的IP地址WiFi.mode(WIFI_AP_STA);WiFi.softAPConfig(apIP, apIP, IPAddress({255, 255, 255, 0}));server.on("/", [=]() {server.send(200, "text/html", FPSTR(index_html));});server.on("/index.html", [=]() {server.send(200, "text/html", FPSTR(index_html));});server.on("/wifi_params", HTTP_GET, [=]() {StaticJsonDocument<1024> doc;doc["code"] = 200;doc["message"]["ssid"] = "12345";String jsonString;serializeJson(doc, jsonString);Serial.println(jsonString);server.send(200, "text/json", jsonString.c_str());});server.onNotFound([](){String message = "File Not Found\n\n";message += "URI: ";message += server.uri();message += "\nMethod: ";message += (server.method() == HTTP_GET) ? "GET" : "POST";message += "\nArguments: ";message += server.args();message += "\n";for (uint8_t i = 0; i < server.args(); i++) {message += " " + server.argName(i) + ": " + server.arg(i) + "\n";}server.send(404, "text/plain", message);// digitalWrite(led, 0);});server.begin();
}
void loop() {delay(1);server.handleClient();
}

实现思路

ESP32作为AP模式,终端连接该AP,通过地址即可访问该web服务器了,前端界面文件通过http GET方式获取,包括css文件,图片,js文件等。

技术要点

1. 前端涉及的文件需要包装再发送

static const char index_html[] PROGMEM = R"==(  
)==";  

把整个前端文件的内容放在()括号里。

2. http-GET路由

访问路径/upd_pwd,操作方式GETArduino的编译链为c++,是支持lambda函数的,锁直接把函数传参直接写在调用处,是不是很方便。

  • serializeJson把json对象格式化成String
  • c_str()String转换成char *
  • server.arg("username")获取前端传递的路径中的参数username
  server.on("/upd_pwd", HTTP_GET, []() {String username = server.arg("username");StaticJsonDocument<512> doc;doc["code"] = 201;String jsonString;serializeJson(doc, jsonString);server.send(200, "text/json", jsonString.c_str());});

3. http-POST路由

访问路径/upd_pwd,操作方式POSTArduino的编译链为c++,是支持lambda函数的,锁直接把函数传参直接写在调用处,是不是很方便。
post消息体的body数据放在plain字段中,以json字符串的形式存放。

  • serializeJson把json对象格式化成String
  • c_str()String转换成char *
  • server.arg("username")获取前端传递的路径中的参数username
  • const char *ip = doc["server"];获取json对象的server字段的值
  server.on("/upd_pwd", HTTP_POST, []() {String body= server.arg("plain");StaticJsonDocument<512> doc;  DeserializationError error = deserializeJson(doc, body.c_str());if(error){server.send(400, "text/json", "{\"success\": 400, \"message\":\"json error\"}");}else{const char *ip = doc["server"];StaticJsonDocument<512> doc_ret;doc_ret["code"] = 201;String jsonString;serializeJson(doc_ret, jsonString);server.send(200, "text/json", jsonString.c_str());}});

http://www.ppmy.cn/server/110519.html

相关文章

每天一个数据分析题(五百零六)- 装袋方法

装袋方法(bagging)也叫做bootstrap aggregating,是在原始 数据集有放回地重采样S次后得到新数据集的一种技术&#xff0c;其代表算法有&#xff1f; A. Adaboost B. GBDT C. XGBOOST D. 随机森林 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此…

LeetCode1732.找到最高海拔

有一个自行车手打算进行一场公路骑行&#xff0c;这条路线总共由 n 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。 给你一个长度为 n 的整数数组 gain &#xff0c;其中 gain[i] 是点 i 和点 i 1 的 净海拔高度差&#xff08;0 < i < n&#xff09;。请…

STM32H750+CubeIDE+FreeRTOS+ETH(LAN8720A)+LWIP

文章目录 STM32H750CubeIDEFreeRTOSETH(LAN8720A)LWIPCubeIDE配置RCC时钟树SYSETH串口MPUFreeRTOSLWIPGPIO然后就可以点击生成代码了&#xff01; 代码修改printf重定向补充硬件复位更改补充链接文件然后就可以编译下载ping成功了&#xff01; socket网络编程 STM32H750CubeIDE…

云计算概述

云计算的产生以及发展 分布式计算&#xff1a;包含了云计算和网格计算 云计算&#xff1a;以数据为中心进行的计算 网格计算&#xff1a;以计算为中心进行的计算 诞生-1999 初期的发展-2007-2008 加速发展-2009-2014 日渐成熟阶段-2015-目前 云计算的种类 公有云-第三方提供…

C语言 | Leetcode C语言题解之第387题字符串中的第一个唯一字符

题目&#xff1a; 题解&#xff1a; struct hashTable {int key;int val;UT_hash_handle hh; };int firstUniqChar(char* s) {struct hashTable* position NULL;int que[26][2], left 0, right 0;int n strlen(s);for (int i 0; i < n; i) {int ikey s[i];struct has…

WHAT - 一个 IP 地址与地理信息的关联

目录 全球范围内的地理信息管理和映射1. 大洲&#xff08;Continent&#xff09;2. 国家&#xff08;Country&#xff09;3. 省/州&#xff08;Province/State&#xff09;&#xff0c;又称一级行政单位4. 市&#xff08;City&#xff09;5. 街道/邮政编码&#xff08;Street/P…

DFS解决floodfill算法

文章目录 1. 图像渲染2. 岛屿数量3. 岛屿的最大面积4. 被围绕的区域5. 太平洋大西洋水流问题6. 扫雷游戏7. 机器人的运动范围 1. 图像渲染 算法原理&#xff1a; 这题不需要创建visit数组去记录使用过的节点&#xff0c;因为我每次dfs都尝试修改image数组的值&#xff0c;当下…

IO共享内存

特点 1&#xff09;共享内存是一种最为高效的进程间通信方式&#xff0c;进程可以直接读写内存&#xff0c;而不需要任何数据的拷贝。 2&#xff09;为了在多个进程间交换信息&#xff0c;内核专门留出了一块内存区&#xff0c;可以由需要访问的进程 将其映射到自己的私有地址空…