八、esp8266建立基本网络服务器

news2024/11/24 0:37:12

1、网络服务器

(1)网络服务器有很多类型,它们功能十分丰富。通常承担网络服务器工作的设备都是运算能力比较强大的电脑。

(2)ESP8266虽然也能实现网络服务器的一些功能,但是毕竟它的运算能力是无法与那些昂贵的服务器电脑相比较,因此ESP8266只能实现一些基本的网络服务功能。不过这些基本的网络服务功能已经足够我们开发物联网项目了。

(3)网络服务是一个很宽泛的概念,这里介绍网络服务中的网页服务功能。所谓网页服务就是专门用于网页浏览的服务。

(4)当我们访问某一个网页时,首先在浏览器地址栏输入域名并按下回车后,浏览器会通过DNS服务查询到该域名对应的IP地址。接下来浏览器会向该IP地址的服务器发送http请求。当网站服务器收到了请求后,会把被请求的网页信息传输给浏览器,然后浏览器就会把收到的网页信息转换成网页显示在浏览器中。

2、示例程序

#include <ESP8266WiFi.h>        // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h>   //  ESP8266WiFiMulti库
#include <ESP8266WebServer.h>   //  ESP8266WebServer库

ESP8266WiFiMulti wifiMulti;     // 建立ESP8266WiFiMulti对象,对象名称是'wifiMulti'
 
ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,对象名称为esp8266_server
                                    // 括号中的数字是网路服务器响应http请求的端口号
                                    // 网络服务器标准http端口号为80,因此这里使用80为端口号

void setup() {
  Serial.begin(115200);               // 启动串口通讯

  // 通过addAP函数存储 WiFi名,WiFi密码
  wifiMulti.addAP("zjd", "1233211234567");
  wifiMulti.addAP("SHHOO", "shhoo2018");

  Serial.print("\r\n Connecting ...");      // 通过串口监视器输出信息告知用户esp8266正在尝试连接WiFi                               
  while (wifiMulti.run() != WL_CONNECTED)        
  {
    delay(1000);                                            
    Serial.print('.');          
  }

  Serial.print("\r\n");                              // WiFi连接成功后
  Serial.print("Connection Successful\r\n");         // esp8266将通过串口监视器输出
  Serial.print("WiFi: " + WiFi.SSID() + "\r\n");     // 连接的WiFI名称
  Serial.print("IP address: ");                      //  esp8266的IP地址  
  Serial.println(WiFi.localIP());    

  /*"启动网络服务功能"程序部分开始*/
  esp8266_server.begin();
  esp8266_server.on("/",handleRoot);
  esp8266_server.onNotFound(handleNotFound); 
  /*"启动网络服务功能"程序部分结束*/ 
  Serial.println("HTTP esp8266_server started");     // ESP8266网络服务功能已经启动    

}

void loop() {
  esp8266_server.handleClient();    // 处理http服务器访问
}

/*处理网站根目录"/"的访问请求*/
void handleRoot()
{
  esp8266_server.send(200, "text/plain", "Hello from ESP8266");
} 

/*设置处理404情况的函数*/
void handleNotFound()
{
  esp8266_server.send(404, "text/plain", "404: Not found");
}

3、程序详解

3.1、esp8266_server.begin();

使用了ESP8266WebServer库中的begin函数。这个函数的作用是让esp8266启动网络服务功能,该函数无需任何参数。

3.2、esp8266_server.on("/", handleRoot);  

(1)使用了ESP8266WebServer库中的on函数,该函数的作用是指挥esp8266如何来处理浏览器的http请求。

(2)on函数一共有两个参数,第一个参数是字符串"/",第二个参数是一个函数名handleRoot。

"/"表示网站首页的名称。一般情况下,一个网站有很多页面,为了加以区分,这些页面都有各自的名称。handleRoot是函数名。handleRoot函数的作用是告诉esp8266如何生成和发送网站首页给浏览器。

(3)综上,当有浏览器请求网站首页时,执行handleRoot函数来生成网站首页内容然后发送给浏览器。

(4)补充: 当我们在地址栏只输入IP地址而没有任何附加地址信息,浏览器就会知道我们是要获取一个网站的首页信息。这是浏览器约定俗成的一种操作方法。

3.3、esp8266_server.onNotFound(handleNotFound);

(1)使用了ESP8266WebServer库中的onNotFound函数,该函数的作用是指挥esp8266在收到无法满足的http请求时该如何处理。

(2)假如要浏览网站不存在的页面,esp8266无法满足这一请求。这时就可以让esp8266答复一个“错误提示”页面给提出请求的浏览器。

(3)onNotFound函数有一个参数,这个参数的内容是函数handleNotFound的名字。onNotFound的作用就是告诉esp8266在遇到这种无法满足的http请求时,应该执行handleNotFound函数来生成并发送“错误提示”页面给浏览器。

3.4、esp8266_server.send(404, "text/plain", "404: Not found");  

/*处理404情况的函数*/
void handleNotFound()
{
  esp8266_server.send(404, "text/plain", "404: Not found");
}

(1)handleNotFound函数只有一条语句,调用了ESP8266WebServer库中的send函数。该函数的作用是生成并且发送http响应信息。也就是说,电脑浏览器所收到的网页信息都是通过send函数生成并且发送的。

(2)参数404是一个服务器状态码,它的含义是“客户端的请求有错误”。也就是说,浏览器在收到了状态码404后就知道,它所请求的页面在服务器上是不存在的。这个服务器状态码是专门给浏览器用的。

(3)404我们是看不到它的,为了让我们也看到页面的出错信息,send函数的最后一个参数字符串”404: Not found”。这个字符串的内容才是真正显示在浏览器中供我们阅读的内容。可以任意的改变这个字符串的内容。

(4)send函数还有一个字符串参数“text/plain”。它的作用是说明http响应体的信息类型。“text/plain”是要告诉浏览器后面的”404: Not found”为一段纯文本信息。

(5)send函数一共有3个参数。第一个参数404是服务器状态码。第二个参数“text/plain”是说明http响应体信息类型。第三个参数“404: Not found”则是响应体的具体信息了。

3.5、esp8266_server.send(200, "text/plain", "Hello from ESP8266");

/*处理网站根目录"/"的访问请求*/
void handleRoot()
{
  esp8266_server.send(200, "text/plain", "Hello from ESP8266");
} 

(1)send函数的第一个参数200,它同样是一个服务器状态码,含义是“成功接收请求,并已完成整个处理过程”。

(2)第二个参数"text/plain"它的作用是说明http响应体的信息类型。“text/plain”是要告诉浏览器后面的”Hello from ESP8266”为一段纯文本信息。

(3)参数”Hello from ESP8266″正是我们在浏览器中看到的首页文字内容。

3.6、esp8266_server.handleClient();   

(1)这句程序调用了handleClient函数。它的主要作用之一是检查有没有设备通过网络向esp8266发送请求。函数handleClient每次被调用时,esp8266都会检查一下是否有人发送http请求。

(2)因此需要把它放在loop函数中,从而确保它能经常被调用。假如我们的loop函数里有类似delay一类的函数延迟程序运行,那么这时候就一定要注意了。如果handleClient函数长时间得不到调用,esp8266的网络服务会变得很不稳定。因此在使用esp8266执行网络服务功能的时候,一定要确保handleClient函数经常得以调用。

4、程序运行

(1)串口打印

(2)访问网站服务首页

(3)访问网站服务不存在的页面

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

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

相关文章

STM32的升级--ICP/ISP/IAP

ICP/ISP/IAP 区别 ICP(In-Circuit Programing): 通过J-Link/SWD等下载器烧写程序&#xff0c;上位机需要借助其他硬件的参与才能更新固件&#xff0c;可以更新MCU的所有存储区域&#xff1b; ISP(In-System Programing): 通过MCU出厂时固化的一个bootloader升级程序&#xff0…

第四节 空间参考类的属性说明

空间参考类&#xff1a;SpatialReference 说明 空间参考类是arcpy下面的一级类&#xff0c;用于定义空间参考的各类信息&#xff0c;主要是坐标信息。 空间参考Spatial Reference与坐标系最大的区别&#xff0c;在于空间参考除了定义坐标系以外&#xff0c;还要定义一系列地理…

Java BigDecimal总结

文章目录Java BigDecimal总结概述float 和 double的问题创建BigDecimal对象BigDecimal.valueOf()源码分析equals() 和 compareTo()BigDecimal设置精度和舍入模式舍入模式介绍BigDecimal转字符串DecimalFormat 格式化总结Java BigDecimal总结 概述 BigDecimal类在Java的java.m…

一个简单的数学问题

这个东西发提问没人看就发在这里了 一个球体的体积V_Sphere是容易求的&#xff1a; 则我们很容易求出半径为1的圆球的体积为. 众所周知方程【】在三维笛卡尔坐标系中的图像为一个半径为R的圆&#xff0c; 则R取1时这个方程的图像就成了一个半径为1的圆。 那么我们就能推出f(x…

飞行机器人专栏(九)-- 多传感器固定端口分配

目录 ​编辑 1 /dev/设备列表 2 ttyUSB*端口ID 3 端口别名rules动态绑定 4 launch文件配置 1 /dev/设备列表 lsusblsusb -t 2 ttyUSB*端口ID 查看/dev/ttyUSB* 设备端口ID &#xff1a;0403&#xff1a;6014 找到对应USB的设备ID&#xff0c;这里是 0403&#xff1a;…

测试新风向|视频 AI 转流程图初体验

前言&#xff1a; &#x1f604;作者简介&#xff1a;小曾同学.com,小伙伴们也可以叫我小曾&#xff0c;一个致力于测试开发的博主⛽️ 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;…

极狐GitLab include 语法减少 CI/CD Pipeline 代码冗余,提升构建效率

项目经理&#xff1a;我们有个 Java 的新项目要开始了&#xff0c;需要你帮忙设置调试一下 CI/CD Pipeline DevOps 工程师&#xff1a;好的&#xff0c;没问题 ONE WEEK LATER... 项目经理&#xff1a;新项目的 CI/CD Pipeline 咋样了啊&#xff0c;我看研发还是手动人肉编译…

基于Vue+SpringBoot的在线考试系统,支持多种题型,含数据库文件

spring-boot-online-exam 完整代码下载地址&#xff1a;基于VueSpringBoot的在线考试系统 快速体验 在安装了docker的机器上执行如下命令&#xff1a; 安装mysql: docker run --name exam-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDaA111111 -d mysql:5.7.15然后用doc/sql…

freeswitch的gateway实现出中继的主备方案

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 某些呼叫场景中&#xff0c;我们有2条出中继线路可选&#xff0c;2条出中继需要按照主备模式来配置&#xff0c;优先使用主中继呼叫&#xff0c;当主中继出现问题时&#xff0c;呼叫自动转移到备用中继呼叫。 本节中&a…

正大国际期货:恒指操作技巧之交易中五种绝佳的开仓思路分析

很多人总是亏损&#xff0c;其实最重要的原因之一是没有一个优势的概率系统&#xff0c;正大IxxxuanI经过了解之后&#xff0c;对目前市面上概率系统进行总结&#xff0c;现将以下几种优势的概率系统归纳罗列如下&#xff0c;有缘者定可举一反三&#xff0c;或可为你细化和改良…

Android中GRPC的使用-拦截器

在构建GRPC应用程序时&#xff0c;无论是客户端应用程序&#xff0c;还是服务端应用程序&#xff0c;在远程方法执行之前后之后&#xff0c;都可能需要执行一些通用逻辑。在GRPC中可以拦截RPC的执行&#xff0c;来满足特定的需求&#xff0c;如日志、认证、性能度量指标等&…

基于Amlogic 安卓9.0, 驱动简说(四):Platform平台驱动,驱动与设备的分离

一、篇头 本文介绍Platform平台驱动框架&#xff0c;使用此框架&#xff0c;将可以用上DTS设备树文件&#xff0c;实现设备的静态枚举&#xff0c;实现设备与驱动的分离。 本文基于Amlogic T972 &#xff0c; Android 9.0&#xff0c; 内核版本 4.9.113 二、系列文章 第1篇&a…

【Docker基础篇】一文完成快速使用

Docker基础篇前言Docker是什么&#xff1f;Docker与传统虚拟机技术区别Docker作用、为什么用docker原理Docker常用命令案例展示redis各种软件安装打包到本地、上传到远程仓库打包到本地推送到远程仓库前言 所有的权威均来自与官方&#xff0c;如有疑问请参考官网文献。人非圣贤…

网络厂商 Aruba 2022 年业绩成倍增长的经验是什么

转眼&#xff0c;2022 年马上就要结束了。 在多重不确定的经济环境之下&#xff0c;网络厂商 Aruba 中国在 2022 年的业绩&#xff0c;与上一财年相比仍然实现了成倍的增长。今年初&#xff0c;CSDN 曾采访过 Aruba 中国区的管理者 Aruba 中国区总经理谢建国与 Aruba 北中国区大…

alpine的介绍与使用

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版&#xff0c;它不同于通常的Linux发行版&#xff0c;Alpine采用了musl …

【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CryptoJS加密解密

1.CryptoJS CryptoJS库是前端js写的一个加密解密的工具&#xff0c;使用场景就是对于像账户密码等重要信息要显示在页面上时&#xff0c;需要加密&#xff0c;这样才能保证安全&#xff0c;CryptoJS提供了许多加密的方法&#xff0c; 请参考&#xff1a; cryptojs-JavaScrip…

OSPF的汇总实验

目录 1.拓扑图 2.实验要求 3.实验思路 4.主要配置 5.测试 6.实验总结 1.拓扑图 2.实验要求 R4为ISP&#xff0c;其上只能配置ip&#xff0c;R4与其他所有直连设备间使用公有ip&#xff1b;解决ospf不规则区域&#xff1b;整个ospf环境ip地址为172.16.0.0/16&#xff0c;…

pure pursuit纯跟踪

Pure Pursuit是一种几何追踪方法,速度越小,performance越好; :汽车前轮转角 L:前后轮轴距(车长) R:转弯半径 将车辆模型简化为自行车模型(这里默认左轮和右轮的旋转是一致的)!!! bicycle model: pure pursuit建立于自行车模型和阿克曼小车模型的基础上,goal point为距离后…

2022年用于Web开发的15种最佳编程语言

Web 开发是一个常青的领域&#xff0c;机会总是很多。自 90 年代初出现以来&#xff0c;开发行业在各种方式和领域中发展并蓬勃发展。今天&#xff0c;在 21 世纪&#xff0c;Web 开发仍然是最受欢迎的技能之一。要在这个领域开始职业生涯&#xff0c;掌握Web 开发语言是必不可…