ESP32网络开发实例-Web服务器显示图片

Web服务器显示图片

文章目录

  • Web服务器显示图片
    • 1、软件准备
    • 2、硬件准备
    • 3、代码实现
      • 3.1 在Web页面中嵌入图像链接
      • 3.2 在SPIFFS文件系统中储存图像

在本文中,将介绍在ESP32单片机中如何构建 Web 服务器以显示格式为 .png 或 .jpg 的图像。在示例中,我们将构建一个同时具有简单 HTTP 协议和异步 Web 服务器的 Web 服务器。 ESP32网络服务器将显示图像。简而言之,我们将学习使用不同的方法嵌入图像。

1、软件准备

  • Arduino IDE

在前面的文章中,如何搭建ESP32的Arduino IDE开环境,主参考:

  • ESP32-Arduino-开发实例-Arduino开发环境搭建

2、硬件准备

  • ESP32开发板
  • 5mm LED
  • 330欧姆电阻
  • 面包板
  • 杜邦线(连接线)

3、代码实现

本次实例将使用到如下开源库:

  • ESPAsyncWebServer
  • AsyncTCP

3.1 在Web页面中嵌入图像链接

要通过超链接插入图像,我们将在 HTML 代码中加入一些代码行。 首先创建一个带有 src 属性的 标签。

<img src="image_source">

现在可以将超链接插入到图像在 Internet 上的存储位置,如下所示:

<img src="https://insert_the_website/your_image_source_url.png">

在您的HTML 脚本中添加这两行代码将在您的 Web 服务器中包含特定图像。

这种方式的优点是,减少ESP32储存,但是要求客户端能够访问Web。

3.2 在SPIFFS文件系统中储存图像

SPIFFS 将帮助我们访问 ESP32/ESP8266 内核的闪存。 我们会将图像存储在 ESP 板的闪存中,并在我们的异步 Web 服务器中访问它们。

在前面的文章中,对如何将文件上传到SPIFFS文件系统做了详细的介绍,请参考:

  • 从SPIFFS加载Web页面文件

示例代码如下:

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>// Replace with your network credentials
const char* ssid = "Your_SSID";
const char* password = "Your_Password";// Create AsyncWebServer object 
AsyncWebServer server(80);const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head><meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body><h2>ESP Image Web Server</h2><img src="mango"><img src="apple"><img src="banana"><img src="grape"><img src="strawberry"><img src="orange"> </body>  
</html>)rawliteral";
void setup(){Serial.begin(115200);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi..");}if(!SPIFFS.begin()){Serial.println("An Error has occurred while mounting SPIFFS");return;}Serial.println(WiFi.localIP());server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/html", index_html);});server.on("/mango", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/mango.png", "image/png");});server.on("/apple", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/apple.png", "image/png");});server.on("/banana", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/banana.png", "image/png");});server.on("/grape", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/grape.png", "image/png");});server.on("/strawberry", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/strawberry.png", "image/png");});server.on("/orange", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/orange.png", "image/png");}); server.begin();
}void loop(){}

代码如何工作?

1)导入依赖库的头文件

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>

2)定义网络凭证

const char* ssid = "Your_SSID";
const char* password = "Your_Password";

3)创建Web服务器

AsyncWebServer 对象将用于设置 ESP Web 服务器。 我们将传递默认的 HTTP 端口 80 作为构造函数的输入。 这将是服务器侦听传入 HTTP 请求的端口。

AsyncWebServer server(80);

4)创建Web页面

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head><meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body><h2>ESP Image Web Server</h2><img src="mango"><img src="apple"><img src="banana"><img src="grape"><img src="strawberry"><img src="orange"> </body>  
</html>)rawliteral";

我们将创建 index_html 变量来存储 HTML 文本。 然后将创建一个元标记以确保我们的网络服务器可用于所有浏览器,例如智能手机、笔记本电脑、计算机等。

<meta name="viewport" content="width=device-width, initial-scale=1">

下一步将是定义 HTML 网页主体。 这将进入标记脚本开始和结束的 标签。 这部分将包括网页标题和图像。 我们将在

标签内包含我们网页的标题,并将其设置为 ESP Image Web Server。

<h2>ESP Image Web Server</h2>

在标题之后,我们将包含我们想要在网页上显示的图像。 在 标签内,我们将分别传递每张图片的图像源。 在这里,我们使用六张不同水果的图像。

 <img src="mango"><img src="apple"><img src="banana"><img src="grape"><img src="strawberry"><img src="orange"> 

这些图像源稍后将用于对该特定 URL 发出请求。 因此,可以方便、轻松地标记图像。

setup()函数

在 setup() 函数中,我们将以 11520 的波特率打开串行连接。

Serial.begin(115200);

下面的代码部分将我们的 ESP 板连接到本地网络,我们已经在上面指定了其网络凭据。 建立连接后,ESP 板的 IP 地址将打印在串口监视器上。 这将帮助我们向服务器发出请求。

WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi..");}Serial.println(WiFi.localIP());

这些代码行将初始化 SPIFFS。

 if(!SPIFFS.begin()){Serial.println("An Error has occurred while mounting SPIFFS");return;}

现在,我们将研究异步图像 Web 服务器如何处理从客户端收到的 HTTP 请求。 我们可以将异步 Web 服务器配置为根据配置的路由侦听特定的 HTTP 请求,并在该路由上收到 HTTP 请求时做出相应的响应。

我们将在服务器对象上使用 on() 方法来侦听传入的 HTTP 请求并相应地执行。

当在 /root URL 上收到请求时

send_P() 方法将响应请求。 该方法将接受三个参数。 第一个是 200,它是“ok”的 HTTP 状态代码。 第二个是“text/html”,它对应于响应的内容类型。 第三个输入是保存在 index_html 变量中的文本。 因此,保存在 index_html 变量中的 HTML 文本将作为响应发送。

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){request->send_P(200, "text/html", index_html);});

当在 /image_source URL 上发送请求时:(/mango、/apple、/banana …)

send() 方法将用于返回 HTTP 响应。
例如,当服务器将收到对“/mango”URL 的请求时,/mango.png 将被发送到客户端。

server.on("/mango", HTTP_GET, [](AsyncWebServerRequest *request){request->send(SPIFFS, "/mango.png", "image/png");});

同样,所有其他图像请求也将以类似方式处理。

要启动服务器,我们将在我们的服务器对象上调用 begin() 。

server.begin();

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】泛型编程 ⑪ ( 类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中 )

文章目录 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中1、分离代码 后的 友元函数报错信息 - 错误示例Student.h 头文件内容Student.cpp 代码文件内容Test.cpp 代码文件内容执行报错信息 2、问题分析 二、代码示例 - 函数实现 写在类外部的不…

docker小技能:部署mysql

文章目录 引言I Docker安装MySQL1.1 安装mysql1.2 配置容器自动重启参数1.3 查看版本II 配置MySQL2.1 设置为开机自启动2.2 执行MySQL安全性操作并设置密码2.3 配置文件2.4 创建数据库用户dmsTest,并授予远程连接权限。2.5 用户相关命令III 用户权限3.1 权限层级3.2 权限分类3.…

python运行hhsearch二进制命令的包装器类

hhsearch 是 HMM-HMM&#xff08;Hidden Markov Model to Hidden Markov Model&#xff09;比对方法的一部分&#xff0c;属于 HMMER 软件套件。它用于进行蛋白质序列的高效比对&#xff0c;特别适用于检测远缘同源性。 以下是 hhsearch 的一些主要特点和用途&#xff1a; HMM…

vue2.0中使用v-if/v-show切换后echarts不显示和宽高问题

vue2.0中使用v-if/v-show切换后echarts不显示和宽高问题 需求描述问题描述问题解析 解决方案使用v-show替代&#xff08;不推荐&#xff09;v-if使用$nextTick&#xff08;推荐&#xff09; 需求描述 使用ehcarts时&#xff0c;请求数据时加loading,请求结束后取消loading并显示…

redis之高可用

&#xff08;一&#xff09;redis之高可用 1、在集群当中有一个非常重要的指标&#xff0c;提供正常服务的时间的百分比&#xff08;365天&#xff09;99.9% 2、redis的高可用的含义更加广泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展、数据的安全性 3、在r…

项目架构的发展

项目架构的发展 1. 单体架构 单体架构指的是将整个应用程序构建为单一的、独立的单元。在软件开发中&#xff0c;单体架构通常指的是将一个应用程序作为一个整体来开发、部署和管理&#xff0c;所有的功能模块都打包在一起&#xff0c;共享同一个数据库和代码库。 在单体架构…

存储日志数据并满足安全要求

日志数据是包含有关网络中发生的事件的记录的重要信息&#xff0c;日志数据对于监控网络和了解网络活动、用户操作及其动机至关重要。 由于网络中的每个设备都会生成日志&#xff0c;因此收集的数据量巨大&#xff0c;管理和存储所有这些数据成为一项挑战&#xff0c;日志归档…

python基本语法

基本的 Python 语法&#xff1a; 变量和数据类型&#xff1a; # 定义变量 x 5# 不需要显式声明数据类型&#xff0c;Python 会自动推断 name "John"# 常见的数据类型包括整数、浮点数、字符串、列表、字典等 my_list [1, 2, 3] my_dict {key: value}条件语句&…

【C语言】数据结构——栈和队列实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;一、 栈1. 栈的概念及结构2. 栈的实现3. 实现代码3.1 定义结构体3.2 初始化栈3.3 销毁栈3.4 入栈3.5 出栈…

【Java 进阶篇】深入理解 Jackson:Java 对象转 JSON 的艺术

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇关于 Jackson JSON 解析器中 Java 对象转 JSON 的详细解析指南。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;而 Jackson 作为一个强大的 JSON 解析库&#xff0c;能够帮…

贪心:leetcode2216 美化数组的最少删除数

2216. 美化数组的最少删除数 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果满足下述条件&#xff0c;则认为数组 nums 是一个 美丽数组 &#xff1a; nums.length 为偶数对所有满足 i % 2 0 的下标 i &#xff0c;nums[i] ! nums[i 1] 均成立 注意&#xff0c;空…

Unity PlayerPrefs相关应用

PlayerPrefs是Unity游戏引擎中的一个类&#xff0c;用于在游戏中存储和访问玩家的偏好设置和数据。它可以用来保存玩家的游戏进度、设置选项、最高分数等信息。PlayerPrefs将数据存储在本地文件中&#xff0c;因此可以在游戏重新启动时保持数据的持久性。 //PlayerPrefs的数据…

基于SVM的车牌识别算法

基于SVM的车牌识别系统&#xff08;Python代码实现&#xff09; 车牌识别系统是智能交通系统的重要组成部分&#xff0c;有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成&#xff0c;本文的研究重点是车牌字符识别这部分&#xff0c;本文提出了一种…

RT-Thread Hoist_Motor PID

本节介绍的是一个举升电机&#xff0c;顾名思义&#xff0c;通过转轴控制物体升降&#xff0c;为双通道磁性译码器&#xff0c;利用电调进行操控&#xff0c;具体驱动类似于大学期间最大众的SG180舵机&#xff0c;在一定的频率下&#xff0c;通过调制脉宽进行控制。 设备介绍…

数据结构 图

树是无环连通图&#xff0c;是一种特殊的图。 分类 图分为有向图[边是有方向的]和无向图[边是无方向的]。 无向图(a—b)&#xff0c;建立两条有向图(a—>b&#xff0c;b—>a)&#xff0c;无向图是一种特殊的有向图。 存储有向图 邻接矩阵 ——用于存储比较稠密的图【…

MyBatis的xml实现

1.下载插件MyBatisX 2.添加依赖 <!--Mybatis 依赖包--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.1</version></dependency><!--…

Rust错误处理机制:优雅地管理错误

大家好&#xff01;我是lincyang。 今天&#xff0c;我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言&#xff0c;对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中&#xff0…

Pandas-pd.to_numeric函数知识点总结

前言 本文是该专栏的第38篇,后面会持续分享python数据分析的干货知识,记得关注。 我们在处理数据分析项目的时候,通常会需要处理各种类型的数据,比如说“时间日期,字符串,布尔值”等等类型。有的时候,恰巧需要用Pandas将这些数据转换为数值类型,以便于后期进行统计或计…

JavaScript中的假值对象是什么?

JavaScript是一种非常灵活且强大的编程语言&#xff0c;但有时候它的一些特性可能会让人感到困惑。其中一个常见的问题就是假值对象。在本文中&#xff0c;我们将探讨什么是假值对象&#xff0c;并通过代码示例来解释这个概念。 什么是假值对象&#xff1f; 在JavaScript中&am…

Java 类之 java.lang.reflect.Field

Java 类之 java.lang.reflect.Field 文章目录 Java 类之 java.lang.reflect.Field一、概述1、java.lang.Class 类获取字段的方法获取全部公有字段&#xff08;含继承的&#xff0c;不含私有的&#xff09;获取本类的所有字段&#xff08;不含继承的&#xff0c;含私有的&#x…