arduino开发ESP8266学习笔记九---------ESP8266⽹络服务器(通过。
。。
  ⽹络服务器有很多种类型,它们的功能也⼗分丰富。通常承担⽹络服务器⼯作的设备都是运算能⼒⽐较强⼤的电脑。我们的ESP866-NodeMCU虽然也能实现⽹络服务器的⼀些功能,但是毕竟它的运算能⼒是⽆法与那些昂贵的服务器电脑相媲美的,因此ESP8266-NodeMCU只能实现⼀些基本的⽹络服务功能。不过这些基本的⽹络服务功能已经⾜够我们开发物联⽹项⽬了。在接下来的⼏节教程⾥,我们将⼀起来学习如何让ESP8266-NodeMCU来实现⽹络服务功能。
⽹络服务是⼀个很宽泛的概念,我们在这⾥即将给您介绍的是⽹络服务中的⽹页服务功能。所谓⽹页服务就是专门⽤于⽹页浏览的服务。
⼀、使⽤浏览器访问ESP8266服务器
  代码:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
ESP8266WiFiMulti WiFiMulti;//建⽴ESP8266WiFiMulti对象,对象名称为WiFiMulti
ESP8266WebServer esp8266_server(80);//建⽴ESP8266WebServer对象,对象名称是“esp8266_server”
//括号中的数字是⽹络服务器响应http请求的端⼝号
//⽹络服务器http端⼝号为80,因此这⾥使⽤80为端⼝号
int led=14;//设置指⽰灯
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(9600);
WiFiMulti.addAP("vivo","QiFei159874");//这条指令就是告诉ESP8266下⾯会告诉你多个WiFi⽹络名称和密码
WiFiMulti.addAP("vivo1","qifei159874");//注意这⾥的双引号要加上,没加报错
WiFiMulti.addAP("vivo2","QIFEI159874");//
digitalWrite(led,HIGH);//默认LED是熄灭的
//运⾏⾃定义函数,当未连接到路由器的过程中,闪烁LED,直到连接成功,点亮LED
//gotowifi();
Serial.println("WiFi正在连接中");
int i=0;
while(WiFiMulti.run()!=WL_CONNECTED)//WiFiMulti.run()和WiFi.Status()功能⼀样,都是⽤来表⽰当前WiFi连接的状态
{
delay(1000);
Serial.print(".");
}
Serial.println('\n');
Serial.print("连接到");
Serial.println(WiFi.SSID());
Serial.print("IP Address:  ");
Serial.println(WiFi.localIP());//ESP8266的IP地址
/*-------------”启动⽹络服务功能“程序部分开始------------*/
esp8266_server.begin();//启动⽹络服务器
("/",handleRoot);//on函数的作⽤就是提供页⾯服务,告诉MCU通过那个函数访问这个界⾯“/”页⾯,就是主页,通过handleRoot函数处理该页⾯
NotFound(handleNotFound);//当请求页⾯不存在时,通过该函数处理
//----启动⽹路服务功能部分结束
Serial.println("HTTP esp8266_server Started");//告知⽤户ESP8266⽹络服务功能已经启动
}
void loop()
{
esp8266_server.handleClient();//处理HTTP服务器访问
}
void handleRoot()
{              /*服务器响应状态码200(到信息了),text/plain,表⽰告诉浏览器接下来要返送信息内容的是⼀段纯⽂本信息,信息内容就是Hello from ESP8266                                    */    esp8266_server.send(200,"text/plain","Hello from ESP8266");//nodeMCU将调⽤
}
void handleNotFound()//当浏览器访问页⾯不存在时,通过该函数处理
{                      /*服务器响应状态码404(未到浏览器需要的信息),text/plain,表⽰告诉浏览器接下来要返送信息内容的是⼀段纯⽂本信息,信息内容就是404 Not found*/
esp8266_server.send(404,"text/plain","404 Not found");
}
将上述代码下载到ESP8266后,在复位之后,通过串⼝查看ESP8266⽹络服务器的IP地址如图1,将其复制到浏览器打开可以看到如图2的现象,这说明已经成功建⽴了⼀个⽹络服务器。
在IP地址后在加⼀些页⾯再次访问,因为在代码中我们没有写led的界⾯,也就是说我们访问的页⾯不存在,所以得到了如图3的结果,这也就是我们做的另⼀个页⾯了。
  图1
 图2
图3
⼆、通过浏览器访问ESP8266服务器进⾏简单的操作(点亮和熄灭LED)。
实验代码
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
ESP8266WiFiMulti WiFiMulti;//建⽴ESP8266WiFiMulti对象,对象名称为WiFiMulti
ESP8266WebServer esp8266_server(80);//建⽴ESP8266WebServer对象,对象名称是“esp8266_server”
//括号中的数字是⽹络服务器响应http请求的端⼝号
//⽹络服务器http端⼝号为80,因此这⾥使⽤80为端⼝号
int LED=D5;//设置指⽰灯
void setup()
{
pinMode(LED,OUTPUT);
Serial.begin(9600);
WiFiMulti.addAP("vivo","QiFei159874");//这条指令就是告诉ESP8266下⾯会告诉你多个WiFi⽹络名称和密码
WiFiMulti.addAP("vivo1","qifei159874");//注意这⾥的双引号要加上,没加报错
WiFiMulti.addAP("vivo2","QIFEI159874");//
digitalWrite(LED,HIGH);//默认LED是熄灭的
//运⾏⾃定义函数,当未连接到路由器的过程中,闪烁LED,直到连接成功,点亮LED
//gotowifi();
Serial.println("WiFi正在连接中");
int i=0;
while(WiFiMulti.run()!=WL_CONNECTED)//WiFiMulti.run()和WiFi.Status()功能⼀样,都是⽤来表⽰当前WiFi连接的状态
{
delay(1000);
Serial.print(".");
}
Serial.println('\n');
Serial.print("连接到");
Serial.println(WiFi.SSID());
Serial.print("IP Address:  ");
Serial.println(WiFi.localIP());//ESP8266的IP地址
/*-------------”启动⽹络服务功能“程序部分开始------------*/
esp8266_server.begin();//启动⽹络服务器
("/",HTTP_GET,handleRoot);//on函数的作⽤就是提供页⾯服务,告诉MCU通过那个函数访问这个界⾯“/”页⾯,就是主页,通过handleRoot函数处理该页⾯
("/LED",HTTP_POST,handleLED);//设置处理LED控制请求的函数“handleLED”
NotFound(handleNotFound);//当请求页⾯不存在时,通过该函数处理
//----启动⽹路服务功能部分结束
Serial.println("HTTP esp8266_server Started");//告知⽤户ESP8266⽹络服务功能已经启动
}
void loop()
{
esp8266_server.handleClient();//处理HTTP服务器访问
}
void handleRoot()
{              /*服务器响应状态码200(到信息了),text/plain,表⽰告诉浏览器接下来要返送信息内容
的是⼀段纯⽂本信息,信息内容就是Hello from ESP8266                                    */    esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");//nodeMCU将调⽤html内容,这是⼀个按钮    //啊啊啊啊啊,这⾥犯了⼀个巨蠢的错误,由于 input type 拼写错误,没报错,可以上传,就是不显⽰界⾯:<>:
// esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}
void handleLED()
{
digitalWrite(LED,!digitalRead(LED));//改变LED的状态
esp8266_server.sendHeader("Location","/");//跳转回页⾯根⽬录
esp8266_server.send(303);//发送HTTP相应代码303 跳转到另⼀个界⾯}
}
void handleNotFound()//当浏览器访问页⾯不存在时,通过该函数处理
{                      /*服务器响应状态码404(未到浏览器需要的信息),text/plain,表⽰告诉浏览器接下来要返送信息内容的是⼀段纯⽂本信息,信息内容就是404 Not found*/
esp8266_server.send(404,"text/plain","404 Not found");
}
 通过串⼝打印的信息如图4,将IP地址输⼊到浏览器中,点击显⽰图标,就可以观测到现象。
图4
⽹页显⽰如图5
      图5s
三、通过⽹络服务将ESP8266的引脚状态显⽰在⽹页上(⼿动刷新)。
webserver接口开发
如图6所显⽰的是实时刷新的按键状态,按键设置为上拉输⼊模式,所以当按键按下后检测为低电平。松开后⼜变成⾼电平。这个代码有个缺点就是需要刷新页⾯才可以显⽰当前的状态。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。