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)访问网站服务不存在的页面