1.1ESP8266:基本网络服务器_入门
- 实现功能:
- 基于Arduino IDE开发环境
- 源码讲解:
- 1.2通过网络服务实现NodeMCU开发板基本控制
- 实现功能:
- 基于Arduino IDE开发环境
- void handleRoot
注意事项:
- 配置好环境:代码直接copy就可使用
- 采用:太极创客ESP8266开发板
- WiFi 频段为2.4G
1.1ESP8266:基本网络服务器_入门
实现功能:
- 程序上传给NodeMCU以后,请启动NodeMCU并且确保它已经成功连接WiFi。
- 请打开浏览器,并且在地址栏中输入NodeMCU的IP地址并按下回车。
- 假如将在浏览器中看到“Hello from ESP8266”(如下所示)
- 串口打印调试信息
成功的让NodeMCU实现了网络服务功能,因为您所看到的这条文字信息正是来自于NodeMCU。
NodeMCU为您建立了一个超级迷你的小网站。这个网站只有一个网页。这个网页只有一行文字“Hello from ESP8266”。
基于Arduino IDE开发环境
源码讲解:
#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(void){
Serial.begin(9600); // 启动串口通讯_9600为串口的波特率 需要和上位机对应
/**
*此处添加自己的WiFi密码和WiFi名词
*这三条语句通过调用函数addAP来记录3个不同的WiFi网络信息
*这里只存储了3个WiFi信息,您可以存储更多的WiFi信息在此处。
*/
//通过addAp函数存储 WiFi名称 WiFi密码
wifiMulti.addAP("hello_Sir1", "13572468");
wifiMulti.addAP("hello_Sir2", "87654321");
wifiMulti.addAP("hello_Sir", "13572468");
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n'); // WiFi连接成功后
Serial.print("Connected to "); // NodeMCU将通过串口监视器输出。
Serial.println(WiFi.SSID()); // 连接的WiFI名称
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
//--------"启动网络服务功能"程序部分开始-------- //
esp8266_server.begin(); // ESP8266-NodeMCU来启动网络服务功能
/**
*esp8266_server.on("/", handleRoot);
*作用:告诉NodeMCU,当有浏览器请求网站首页时,请执行handlRoot函数来生成网站首页内容然后发送给浏览器
* "/"访问根目录 根目录为网站首页
*/
esp8266_server.on("/", handleRoot);
/**
*esp8266_server.onNotFound(handleNotFound);
*告诉NodeMCU在遇到这种无法满足的http请求时,应该执行handleNotFound函数来生成并发送“错误提示”页面给浏览器
*/
esp8266_server.onNotFound(handleNotFound);
//--------"启动网络服务功能"程序部分结束--------
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(void){
esp8266_server.handleClient();
// 处理http服务器访问
//检查有没有设备通过网络向NodeMCU发送请求
}
void handleRoot() { //处理网站根目录“/”的访问请求
esp8266_server.send(200, "text/plain", "Hello from ESP8266"); // NodeMCU将调用此函数。
//参数200,它同样是一个服务器状态码,含义是“成功接收请求,并已完成整个处理过程”
//字符串参数“text/plain”。它的作用是说明http响应体的信息类型为文本
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){ // 当浏览器请求的网络资源无法在服务器找到时,
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU将调用此函数。
}
1.2通过网络服务实现NodeMCU开发板基本控制
实现功能:
- 程序上传给NodeMCU以后,请启动NodeMCU并且确保它已经成功连接WiFi。
- 请打开浏览器,并且在地址栏中输入NodeMCU的IP地址并按下回车。
- 假如将在浏览器中看到“Toggle LED”(如下所示)并按下可以控制LED亮灭
- 串口打印调试信息
基于Arduino IDE开发环境
程序源码:
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // ESP8266WebServer库
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)
void setup(void){
Serial.begin(9600); // 启动串口通讯且波特率为9600
pinMode(LED_BUILTIN, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
wifiMulti.addAP("hello_Sir", "17674011013"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),NodeMCU将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么NodeMCU
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
esp8266_server.begin(); // 启动网站服务
esp8266_server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'
//当有浏览器请求首页且收到GET请求后就会运行handleRoot函数
//HTTP_GET:当使用浏览器访问首页时:如果按下回车,会往开发板发送GET请求
esp8266_server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'
//当有浏览器请求:/LED页面 且收到POST请求后就会运行handleLED函数
esp8266_server.onNotFound(handleNotFound); // 设置处理404情况的函数'handleNotFound'
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(void){
esp8266_server.handleClient(); // 检查http服务器访问
}
/*设置服务器根目录即'/'的函数'handleRoot'
该函数的作用是每当有客户端访问NodeMCU服务器根目录时,
NodeMCU都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。
同时NodeMCU还会向浏览器发送HTML代码,以下示例中send函数中第三个参数,
也就是双引号中的内容就是NodeMCU发送的HTML代码。该代码可在网页中产生LED控制按钮。
当用户按下按钮时,浏览器将会向NodeMCU的/LED页面发送HTTP请求,请求方式为POST。
NodeMCU接收到此请求后将会执行handleLED函数内容*/
void handleRoot() {
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
//加\的原因是指明哪些是html代码 简单来说 "到哪里结束及 \"表明没有结束 第二次单独出现" 表明结束了
/*
* html格式的含义:
*
* "<form action=\"/LED\" method=\"POST\">
* action="/LED":当用户按下Toggle LED这个按钮时跳转到"/LED"这个页面
* method="POST"请求方法为POST
*
* <input type="submit" value="Toggle LED">
*
* input type="submit :定义一个按钮
* value="Toggle LED":按钮显示的内容为Toggle LED
*
* </form>"
*/
}
//处理LED控制请求的函数'handleLED'
void handleLED() {
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));// 改变LED的点亮或者熄灭状态
//digitalRead:读取当前状态
//跳转回页面根目录
esp8266_server.sendHeader("Location","/");
esp8266_server.send(303); // 发送Http相应代码303 跳转
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
void handleRoot
html格式的含义:
void handleRoot() {
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}
/*
* html格式的含义:
*
* "<form action=\"/LED\" method=\"POST\">
**********************
* action="/LED":当用户按下Toggle LED这个按钮时跳转到"/LED"这个页面
* method="POST"请求方法为POST
*********************
* <input type="submit" value="Toggle LED">
**********************
* input type="submit :定义一个按钮
* value="Toggle LED":按钮显示的内容为Toggle LED
*
* </form>"
*/