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

1、网络服务器

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

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

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

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

2、示例程序

#include         // 本程序使用 ESP8266WiFi库
#include    //  ESP8266WiFiMulti库
#include    //  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)串口打印

八、esp8266建立基本网络服务器_第1张图片

(2)访问网站服务首页

八、esp8266建立基本网络服务器_第2张图片

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

八、esp8266建立基本网络服务器_第3张图片

你可能感兴趣的:(服务器,运维)