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 要完成的功能。

建立前后端代码

  1. 为了保存 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_server
                        EMBED_FILES "../fs_image/favicon.ico" "../fs_image/index.html")
    
  2. 为了在打开网页时显示 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);
    }
    
  3. 在实现了 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 server
        ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port);
        if (httpd_start(&server, &config) == ESP_OK) {
            // Set URI handlers
            ESP_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

(码字不易感谢点赞或收藏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/195908.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java核心知识点整理大全20-笔记

目录 17. 设计模式 17.1.1. 设计原则 17.1.24. 解释器模式 18. 负载均衡 18.1.1.1. 四层负载均衡&#xff08;目标地址和端口交换&#xff09; 18.1.1.2. 七层负载均衡&#xff08;内容交换&#xff09; 18.1.2. 负载均衡算法/策略 18.1.2.1. 轮循均衡&#xff08;Roun…

Nginx-进程

Nginx-相关问题_01 Windows关闭所有nginx服务 windows 系统下开发调试时不用每次频繁的 启动->任务管理器->查找进程->结束进程&#xff01; 查看nginx的进程占用情况 tasklist | find /i "nginx.exe" || exit关闭nginx的所有进程 taskkill /im nginx.…

iOS-打包上架构建版本一直不出现/正在处理/自动消失

iOS开发过程中&#xff0c;打包上架苹果审核是一个不可或缺的环节。说实话&#xff0c;这个问题我遇见两次了&#xff0c;为了让自己长点记性&#xff0c;决定写下来。首先&#xff0c;列举几种情况&#xff1a; 1.iPa包上传至App store后&#xff0c;一个小时内不显示构建版本…

[UGUI]Unity背包系统制作详细步骤

二、背包制作 1.创建空物体&#xff0c;然后创建UI-Image 制作背包整个背包所在的父UI的背景图 选中BG&#xff0c;找到他的锚点设置&#xff0c;按住Alt键&#xff0c;点击右下角的适配&#xff0c;让锚点和内容都匹配画布 PS&#xff1a;不按Alt键是设置一个元素的锚点位…

Go 数组

一、数组介绍 1、Array 介绍 数组是指一系列同一类型数据的集合数组中包含的咩个数据被成为数组元素&#xff08;element&#xff09;&#xff0c;这种类型可以是任意的原始类型&#xff0c;比如 int、string 等一个数组包含的元素格式被称为数组的长度在 Golang 中数组是一个…

基于可穿戴的健康监护终端--研究进展报告

基于可穿戴的健康监护终端--研究进展报告 1 引言2 传感器介绍2.1 呼吸速率传感器2.2 温度传感器2.3 心脏跳动传感器 3 论文介绍3.1 Effective Data Decision-Making and Transmission System Based on Mobile Health for Chronic Disease Management in the Elderly3.2 Design …

Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件&#xff0c;是用来代替原来的Android.mk文件的。在Android7.0以前&#xff0c;Android都是使用make来组织各模块的编译&#xff0c;对应的编译配置文件就是Android.mk。在Android7.0开始&#xff0c;Google引入了ninja和kat…

C# 实现微信退款及对帐

目录 需求 基础准备 关键代码 操作界面 ​编辑 退款订单类及方法 退款功能实现 对帐 支付商家后台相关要点 实时交易帐单查询 精确交易帐单查询 小结 需求 在招聘报名系统里&#xff0c;考务费支付是其中一个环节&#xff0c;支付方式很多种&#xff0c;比如银联、…

基于单片机的智能饮水机控制系统(论文+源码)

1. 系统设计 本次智能饮水机控制系统的设计研究一款以STC89C52单片机为核心的智能饮水机控制系统&#xff0c;其主要功能设计如下&#xff1a; 1.该饮水机利用DS18B20数字温度传感器实时采集饮水机内水的温度&#xff0c;其检测温度范围为0-100℃&#xff0c;精度0.1℃&#…

单片机薪资翻倍的学习方向

今天以一个案例&#xff0c;给大家分析下做单片机开发&#xff0c;薪资翻倍的底层逻辑和方法论&#xff0c;尽量做到有理有据。 我是2011年开始做单片机开发的&#xff0c;那几年&#xff0c;单片机的工资&#xff0c;可以说是惨不忍睹。 相关贴吧也是一片哀嚎&#xff0c;有些…

Flutter 桌面应用开发之读写Windows注册表

文章目录 需求来源Windows查询Windows版本号方法1. 如何查看Windows版本号2. Windows开发如何通过代码查询Windows版本号(1) 使用C#代码&#xff1a;(2) 使用VB.NET代码 3.通过注册表查看Windows版本信息 Flutter查询Windows版本号方法依赖库支持平台实现步骤1. 在pubspec.yaml…

android13(T) 客制化预置语言列表

效果图 需求分析 这个列表界面一般都是后来手动添加后才现实的&#xff0c;通过分析源码发现通过如下值可控 adb shell settings get system system_locales zh-CN,ja-JP,en-AT 所以只需查询出这个值&#xff0c;然后加在 SettingProvider 中即可 隐藏 bug 如果客户要求默…

Java学习路线第二篇:Java Web

这篇则分享Java学习路线第二part&#xff1a;Java Web 恭喜你已经成功追到第二章节啦&#xff0c;要被自己的努力感动到了吧&#xff0c;而这节将承担起学完Java web 的使命&#xff0c;本使命为单向契约&#xff0c;你可选择YES或者选择YES。 HTMLCSSJavaScript(JS) 【动…

使用Python进行帧提取及指定帧插入实现文本隐写(CTF杂项出题方向)

视频是由一系列连续的图像帧组成的&#xff0c;每一帧都是视频的静止画面。这些帧以一定的速率播放&#xff0c;就形成了运动的视频。以下是视频帧的一些基本概念&#xff1a; 帧率&#xff08;Frame Rate&#xff09;&#xff1a; 帧率表示每秒播放的图像帧数量。通常以“帧/秒…

文章采集器-免费的文章采集工具大全

在当今信息爆炸的时代&#xff0c;获取有效的信息变得尤为关键。随之而来的问题是&#xff0c;如何高效地从海量信息中筛选出我们所需的内容呢&#xff1f;文章采集器应运而生&#xff0c;它就像是信息世界中的一把神奇的筛子&#xff0c;能够帮助我们从大海一般的信息中捞取我…

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

免费四款国内AI写作工具,初涉自媒体的新手必备

许多初涉自媒体的新手在运营中时常感到困扰&#xff1a;每天都在不停地输出内容&#xff0c;却早已陷入了不知道写或拍什么的迷茫。如果你也面临着这样的烦恼&#xff0c;那么不妨尝试以下四款国内AI写作工具&#xff0c;它们不仅能助你轻松创作文章&#xff0c;仅需3分钟即可完…

asp.net mvc游戏门户网站

c#asp.net mvc 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net mvc架构和sql server数据库&#xff0c;并采用EF实体模型开发三层架构BLL DAL 功能模块&#xff1a; 前端展示首页 新闻公告 英雄档案 视频图片 管理…

同为科技(TOWE)模块化定制化让每条PDU实现专属供电解决方案

作为追求最高功率和空间效率的动态数据中心的理想产品&#xff0c;模块化、定制化PDU是追求最高功率和空间效率的动态数据中心的理想产品。同为科技&#xff08;TOWE&#xff09;是我国PDU行业的开创者和领导者&#xff0c;曾率先于中国电源分配单元http://www.pdu.com.cn网站上…