ESP32-Web-Server编程-HTML 基础
ESP32-Web-Server编程-HTML 基础
概述
HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html
文件中。
当浏览器向 web 服务器请求网页时,一个 HTML 文件被发送给浏览器,浏览器解释该文件的内容,呈现具体的图表、文字给用户。
HTML 文档包含了HTML 标签(包含标签和元素,其实他们是一样的)及文本内容,其中
-
HTML 标签是由尖括号包围的关键词,HTML 标签通常是成对出现的,基本格式是
<标签>内容</标签>
,示例:<h1>这是一个一级标题</h1> <h2>这是一个二级标题</h2> <p>这是一个段落。</p> <a href="https://www.iot-wang.com">这是一个链接</a>
-
文本内容,标签内的显示字符。
-
还有一些格式化标签(也称为元素)的定义以及注释风格:
<br> 换行 <hr> 在 HTML 页面中创建水平线 <!-- 这是一个注释 --> <b> 与<i> 定义粗体或斜体文本
我们暂时可以只了解这些,用到了新的内容是我们将进一步介绍它,学以致用,边学边用一直是我们的目标。
一个 HTML 的基础结构组成
示例中的 HTML 的基本组成如上所示。
- 声明为 HTML5 文档
- 元素是 HTML 页面的根元素
- 元素包含了文档的元(meta)数据,如 定义网页编码格式为 utf-8。
元素描述了文档的标题 - 元素包含了可见的页面内容
元素定义一个大标题
元素定义一个段落
**注意:**在浏览器的页面上使用键盘上的 F12 按键开启调试模式,就可以看到该网页的组成标签。
查看完整网页声明类型 DOCTYPE 参考手册。
**注意:**对于中文网页需要使用 声明编码,否则会出现乱码。有些浏览器(如 360 浏览器)会设置 GBK 为默认编码,则你需要设置为 。
更多HTML 的学习,你可以在网络上收集资料,或者参考 HTML 教程 | 菜鸟教程 (runoob.com)。
需求及功能解析
本节演示如何在 ESP32 上使用 wifi,并使用 html 文件,编译使用步骤参考:
示例在网页上的显示:
本系列博客并不是一门专门介绍 HTML 编程的课程,我们只需了解常用的技术就可以了。在 components/htmls 目录中还有一些 HTML 文件,你可以将其拷贝到 components/fs_image 中并重命名为 index.html,然后重新编译该工程,以查看不同 HTML 文件的效果。下面简单介绍各个 HTML 文件涉及的内容。
示例解析
目录结构
├── CMakeLists.txt
├── main
│ ├── CMakeLists.txt
│ └── main.c User application
├── components
│ └── fs_image└── index.html└── ...
| └── url_handlers└── url_handlers.c└── ...
└── README.md This is the file you are currently reading
-
目录结构主要包含主目录 main,以及组件目录 components.
-
其中组件目录components中包含了用于存储网页文件的 fs_image 目录(即前述前端文件),以及用于记录 ESP32 上接收来自服务器的请求,并作出响应的 url_handlers 目录(即后端文件)。如前所述,浏览器可以通过 URL 请求服务器端的资源(包括数据和文件),每个 URL 到来时都可以设计一个函数,来决定如何响应该 URL 请求,这便是 url_handlers 要完成的功能。
建立前后端代码
-
为了保存 html 文件以及图片文件到 ESP32 上,url_handlers 目录的 CMakeLists.txt 使用内嵌数据的方式将 fs_image目录的 index.html 和 favicon.ico 文件保存在 ESP32 中:(此外前端代码)
idf_component_register(SRCS "url_handlers.c"INCLUDE_DIRS "include"PRIV_REQUIRES esp_http_serverEMBED_FILES "../fs_image/favicon.ico" "../fs_image/index.html")
-
为了在打开网页时显示 index.html 中的内容,在 url_handlers.c 中实现了 一个处理函数
index_html_get_handler()
。这部分是后端代码。/* Handler to redirect incoming GET request for /index.html to /* This can be overridden by uploading file with same name */ static esp_err_t index_html_get_handler(httpd_req_t *req) {extern const char html_start[] asm("_binary_index_html_start");extern const char html_end[] asm("_binary_index_html_end");const size_t html_size = (html_end - html_start);httpd_resp_set_type(req, "text/html");/* Add file upload form and script which on execution sends a POST request to /upload */httpd_resp_send_chunk(req, (const char*) html_start, html_size);/* Respond with an empty chunk to signal HTTP response completion */return httpd_resp_send_chunk(req, NULL, 0); }
-
在实现了 html 文件以及 对应的 handles 后,可以在 main.c 中注册对应的 handler:
static httpd_handle_t start_webserver(void) {httpd_handle_t server = NULL;httpd_config_t config = HTTPD_DEFAULT_CONFIG();config.lru_purge_enable = true;// Start the httpd serverESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port);if (httpd_start(&server, &config) == ESP_OK) {// Set URI handlersESP_LOGI(TAG, "Registering URI handlers");for (int i = 0; i < sizeof(httpd_uri_array) / sizeof(httpd_uri_t); i++) {if (httpd_register_uri_handler(server, &httpd_uri_array[i]) != ESP_OK) {ESP_LOGE(TAG, "httpd register uri_array[%d] fail", i);}}ESP_LOGI(TAG, "Success starting server!");return server;}ESP_LOGI(TAG, "Error starting server!");return NULL; }
如此,当打开网页时,浏览器会自动请求名为 index.html 的文件,并显示其中的内容。
编译并烧录固件到设备中
1)在工程目录,打开配置菜单
idf.py menuconfig
主要是配置 wifi 连接的名称和密码:
2)编译烧录固件到设备中
idf.py -p PORT build flash monitor
(Replace PORT with the name of the serial port to use.)
(To exit the serial monitor, type Ctrl-]
.)
如果你是新手,请参考 Getting Started Guide 搭建编译环境。
3)网页显示
设备烧录固件后,启动该设备,从 log 中查看设备的 IP地址:
I (3288) app_wifi: got ip:192.168.47.100
I (3288) esp_netif_handlers: sta ip: 192.168.47.100, mask: 255.255.255.0, gw: 192.168.47.1
I (3288) example_main: Starting server on port: '80'
I (3298) example_main: Registering URI handlers
I (3298) example_main: Success starting server!
这里假设设备 IP 地址是 192.168.47.100.
让手机或者电脑与 ESP32 连接同一个路由器,然后打开手机或者电脑上电浏览器,输入上述IP地址,即可打开网页:
上述示例网页即是本例程 fs_images 目录的 index.html 文件在该浏览器中所程序的样子。
讨论
1)输入网址后,浏览器会自动请求 favicon.ico(即上述网页中第一行显示的图标)。
默认情况下,当请求一个网站的 “/” 目录内容时,会默认打开该目录的 index.html 文件。
同样的,默认情况下,浏览器会自动请求 "/"目录下的 favicon.ico 文件,用作网址栏的一个标识图像。
2)如何设计 index.html 文件中的内容,使之在网页上呈现合适的内容?
这正是本系列博客主要介绍的内容。以试验促进理解,在测试实践中学习,敬请参考后续章节。
总结
1)本节主要是介绍 HTML 的基础知识。HTML 描述了一个网页中的基本内容;
2)HTML 文档包含了HTML 标签(包含标签和元素,其实他们是一样的)及文本内容。其中 HTML 标签是由尖括号包围的关键词,HTML 标签通常是成对出现的。
3)在 ESP32 Web 编程中,通过在后端代码中建立一个发送 HTML 内容的 handler 函数,以及在前端代码中实现 HTML 文件来定义网页上的内容。
资源链接
1)ESP32-Web-Server ESP-IDF系列博客介绍
2)对应示例的 code 链接 (点击直达代码仓库)
3)下一篇:ESP32-Web-Server编程-CSS 基础1
(码字不易感谢点赞或收藏)
相关文章:

ESP32-Web-Server编程-HTML 基础
ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时,一个 HTML 文件被发送给浏览器,浏览器解释该文件的内容,…...

【docker】docker安装与优化
目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…...

https到底把什么加密了?
首先直接说结论, https安全通信模式,是使用TLS加密传输所有的http协议。再重复一遍,是所有! 通常将TLS加密传输http这个通信过程称为https,如果使用协议封装的逻辑结构来表达就是: IP TCP TLS 【 HTTP 】…...
python爬虫防乱码方案
python爬虫防乱码方案 一、chardet库 自动检测编码:使用 Python 库 chardet 可以自动检测文本的编码,然后使用检测到的编码来解码文本。你可以尝试使用 chardet 库来检测编码,然后解码网页内容。 案例 import requests import chardet…...
Java 语言的入门级教程有哪些?
1、Java SE 1.1、Java基础 基础概念/语法:面向对象(继承、封装、多态)基础、包、类、接口、方法、对象、属性、第一个 Java 程序。 数据类型: 1)基本数据类型8种:byte、short、int、long、float、doubl…...
STM32算法
1.通过编码器对返回的错误速度进行滤波 #define MOTOR_BUFF_CIRCLE_SIZE 4 #define STATIC_ENCODER_VALUE 6int32_t LMotor_Encoder_buff[MOTOR_BUFF_CIRCLE_SIZE] {0}; uint8_t LEindex 0; int32_t LMotor_Encoder_last 0; int32_t L_Encoder_change 0;int32_t RMotor_…...
论文阅读 (106):Decoupling maxlogit for out-of-distribution detection (2023 CVPR)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 预备知识3 方法3.1 MaxLogit3.2 改进MaxCosine和MaxNorm3.3 DML 1 概述 1.1 要点 题目:解耦最大logit分布外检测 (Decoupling maxlogit for out-of-distribution detection) 方法: 提出了一种心机基于log…...

毅速丨3D打印随形水路为何受到模具制造追捧
在模具制造行业中,随形水路镶件正逐渐成为一种革命性的技术,其提高冷却效率、优化产品设计、降低成本等优点,为模具制造带来了巨大的创新价值。 随形水路是一种根据产品形状定制的冷却水路,其镶件可以均匀地分布在模具的表面或内部…...

【LeetCode:1670. 设计前中后队列 | 数据结构设计】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
OpenCV将两张图片拼接成一张图片
OpenCV将两张图片拼接成一张图片 示例代码1示例代码2代码示例3示例代码4 可以用opencv或者numpy的拼接函数,直接将两张图拼接到一起,很简单方便,参考代码2,推荐此方式。新建图片,将两张图片的像素值填充到新图片对应位…...

4G5G智能执法记录仪在保险公司车辆保险远程定损中的应用
4G智能执法记录仪:汽车保险定损的**利器 随着科技的不断进步,越来越多的智能设备应用到日常生活中。而在车辆保险定损领域,4G智能执法记录仪的出现无疑是一大**。它不仅可以实现远程定损,还能实现可视化操作、打印保单以及数据融…...

二十七、RestClient查询文档
目录 一、MatchALL查询 二、Match查询 三、bool查询 四、排序和分页 五、高亮 一、MatchALL查询 Testvoid testMatchAll() throws IOException { // 准备Request对象SearchRequest request new SearchRequest("hotel"); // 准备DSLrequest.source().q…...
百度云Ubuntu22.04
1. download 百度云 2. sudo dpkg -i ***.deb...
解除word文档限制,快速轻松,seo优化。
文章解密、找回和去除word文档密码的安全、简单、高效方法 具体步骤如下:1. 百度搜索【密码帝官网】,2. 点击“立即开始”在用户中心上传需要解密的文件,稍等片刻即可找回密码。这是最简单的办法,无需下载软件,适用于手…...
【音频】Glitch相关
背景 因为要判断低码率下,MOS分值为啥下降,从几个方面调查。其中提及到Glitch、缓冲buffer等,慢慢积累名次概念以及经验。 “Glitch” 在音频领域通常指的是非预期的、短暂的干扰或失真。这些问题可能由于信号传输错误、设备问题、软件错误等…...

【开源】基于Vue+SpringBoot的大学生相亲网站
项目编号: S 048 ,文末获取源码。 \color{red}{项目编号:S048,文末获取源码。} 项目编号:S048,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4…...

5种主流API网关技术选型,yyds!
API网关是微服务项目的重要组成部分,今天来聊聊API网关的技术选型,有理论,有实战。 不 BB,上文章目录: 1 API网关基础 1.1 什么是API网关 API网关是一个服务器,是系统的唯一入口。 从面向对象设计的角度…...
请求pdf文件流并进行预览
最近做了一个需求就是预览pdf等文件,不过后端返回的是一个文件流,需要前端做一定地处理才行。 我们来看一下具体的实现方式。预览pdf的插件使用的是pdf.js,具体请看这篇文章:pdf.js插件怎么控制工具栏的显示与隐藏 1、请求pdf文件…...

【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...

虹科Pico汽车示波器 | 汽车免拆检修 | 2016款东风悦达起亚K5车发动机怠速抖动严重、加速无力
一、故障现象 一辆2016款东风悦达起亚K5车,搭载G4FJ发动机,累计行驶里程约为8.2万km。该车发动机怠速抖动严重、加速无力,同时发动机故障灯异常点亮,为此在其他维修厂更换了所有点火线圈和火花塞,故障依旧,…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...