当ESP8266顺利连入WIFI网络后,就可以作为一个"微型服务器",开始处理接收到的请求信息
1 搭建网络服务
利用"接入点模式",搭建一个以ESP-8266为中心的"微型服务器"网络环境,用户可以像访问网站一样访问该服务器
#include <ESP8266WiFi.h> // 引入库
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象
ESP8266WebServer esp8266_server(80);// 建立ESP8266WebServer对象,访问默认的80端口
void setup(void){
Serial.begin(9600);
wifiMulti.addAP("WIFI1", "12345678");
wifiMulti.addAP("WIFI2", "12345678");
wifiMulti.addAP("WIFI3", "12345678");
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
Serial.println('\n'); // WiFi连接成功后,打印相关信息
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
//--------"启动网络服务功能"程序部分开始-------- //
esp8266_server.begin(); // 启动"网络服务器"
esp8266_server.on("/", handleRoot); // 即访问默认的80端口时,调用handleRoot函数返回响应信息
esp8266_server.onNotFound(handleNotFound); // 当用户访问一个不存在的页面时,调用handleNotFound函数
// 如果程序中没有on函数,则所有的请求都会走onNotFound
Serial.println("HTTP esp8266_server started");// 打印启动成功
}
void loop(void){
esp8266_server.handleClient(); // 处理http向服务器发来的请求,根据请求的访问路径,调用相应函数
}
void handleRoot() {
esp8266_server.send(200, "text/plain", "Hello from ESP8266"); //200位服务器响应状态码,text/plain表示返回纯文本信息(text/html表示返回网页信息)
}
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found");
}
String route = esp8266_server.uri()获取用户的请求路径
2 网络服务使用
访问开发板方式:
AP模式(设备连入开发板的热点网络),访问开发板自己IP(例:192.168.4.1)
WS模式(设备和开发板连入一个共同网络),访问分配给开发板的IP(例:192.168.0.123)
如果开发板同时开启了AP和WS模式,则2种访问方式都可以
2.1 通过网络服务控制ESP8266开发板LED灯亮灭
#include <ESP8266WiFi.h> // 引入库
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象
void setup(void){
Serial.begin(9600); // 启动串口通讯
pinMode(LED_BUILTIN, OUTPUT); // LED_BUILTIN(开发板内置LED引脚)/buttonPin(按键引脚)
// pinMode(pin,mode)设置引脚工作模式 pin指引脚,mode(INPUT输入模式(读取信号)/OUTPUT输出模式(输出信号))
// 为低电平0时LED亮,为高电平1时LED灭
wifiMulti.addAP("WIFI1", "12345678");
wifiMulti.addAP("WIFI2", "12345678");
wifiMulti.addAP("WIFI3", "12345678");
Serial.println("Connecting ...");
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
esp8266_server.begin(); // 启动网站服务
esp8266_server.on("/", HTTP_GET, handleRoot); // GET请求
esp8266_server.on("/LED", HTTP_POST, handleLED); // 请求该路径,并且是以POST请求,则调用函数'handleLED'
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started");
}
void loop(void){
esp8266_server.handleClient(); // 检查http服务器访问
}
void handleRoot() {
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"LED开关\"></form>");
}
void handleLED() {
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// digitalWrite(pin,status)改变引脚状态,digitalRead(pin)读取引脚状态
esp8266_server.sendHeader("Location","/"); // 设置请求头,location表示依然是该ip,并且地址是/
esp8266_server.send(303); // 告诉浏览器跳转其它页面(重定向)
}
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found");
}
引脚的3种模式:INPUT(输入模式); OUTPUT(输出模式); INPUT_PULLUP(输入上拉模式)
将引脚设置为"输入上拉模式",则引脚会使用开发板自带的内部上拉电阻,该引脚在开关打开时为高电平,在开关关闭时接地
2.2 通过网络服务显示开发板引脚状态
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WebServer.h>
#define buttonPin D3 // 给D3起一个别名"buttonPin"(D3本身和开发板FLASH按钮相连)
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer esp8266_server(80);
bool pinState; // 存储引脚状态用变量
void setup(){
Serial.begin(9600);
delay(10);
Serial.println("");
pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式
wifiMulti.addAP("WIFI1", "12345678");
wifiMulti.addAP("WIFI2", "12345678");
wifiMulti.addAP("WIFI3", "12345678");
Serial.println("Connecting ...");
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID());
Serial.print("IP address:\t");
Serial.println(WiFi.localIP());
esp8266_server.begin();
esp8266_server.on("/", handleRoot);
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started");
}
void loop(){
esp8266_server.handleClient();
pinState = digitalRead(buttonPin); // 获取引脚状态
}
void handleRoot() {
esp8266_server.send(200, "text/html", sendHTML(pinState));
}
String sendHTML(bool buttonState){
String htmlCode = "<!DOCTYPE html> <html>\n";
htmlCode +="<head><meta http-equiv='refresh' content='5'/>\n";
htmlCode +="<title>ESP8266 Butoon State</title>\n";
htmlCode +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
htmlCode +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n";
htmlCode +="</style>\n";
htmlCode +="</head>\n";
htmlCode +="<body>\n";
htmlCode +="<h1>ESP8266 BUTTON STATE</h1>\n";
if(buttonState)
{htmlCode +="<p>Button Status: HIGH</p>\n";}
else
{htmlCode +="<p>Button Status: LOW</p>\n";}
htmlCode +="</body>\n";
htmlCode +="</html>\n";
return htmlCode;
}
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found");
}