一、wifi 相關(guān)配置
?
1.1 無(wú)線終端 wifi 模式
此模式中,esp8266 會(huì)連接到指定 wifi 進(jìn)行工作。
#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi庫(kù)
const char* ssid = "home"; // 連接WiFi名(此處使用home為示例)
const char* password = "12345678"; // 連接WiFi密碼(此處使用12345678為示例)
void setup() {
Serial.begin(9600); // 啟動(dòng)串口通訊
WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
Serial.print("Connecting to "); // 串口監(jiān)視器輸出網(wǎng)絡(luò)連接信息
Serial.print(ssid); Serial.println(" ..."); // 告知用戶NodeMCU正在嘗試WiFi連接
int i = 0; // 這一段程序語(yǔ)句用于檢查WiFi是否連接成功
while (WiFi.status() != WL_CONNECTED) { // WiFi.status()函數(shù)的返回值是由NodeMCU的WiFi連接狀態(tài)所決定的。
delay(1000); // 如果WiFi連接成功則返回值為WL_CONNECTED
Serial.print(i++); Serial.print(' '); // 此處通過(guò)While循環(huán)讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數(shù)返回值
} // 同時(shí)NodeMCU將通過(guò)串口監(jiān)視器輸出連接時(shí)長(zhǎng)讀秒。
// 這個(gè)讀秒是通過(guò)變量i每隔一秒自加1來(lái)實(shí)現(xiàn)的。
Serial.println(""); // WiFi連接成功后
Serial.println("Connection established!"); // NodeMCU將通過(guò)串口監(jiān)視器輸出"連接成功"信息。
Serial.print("IP address: "); // 同時(shí)還將輸出NodeMCU的IP地址。這一功能是通過(guò)調(diào)用
Serial.println(WiFi.localIP()); // WiFi.localIP()函數(shù)來(lái)實(shí)現(xiàn)的。該函數(shù)的返回值即NodeMCU的IP地址。
}
void loop() {
}
?
?wifi 連接成功,esp8266 通過(guò)串口返回當(dāng)前局域網(wǎng) IP
1.2 接入點(diǎn)模式(熱點(diǎn)模式 AP)
此模式中,esp8266 會(huì)開啟一個(gè)指定名稱和密碼的熱點(diǎn)進(jìn)行工作。
#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi庫(kù)
const char *ssid = "taichi-maker"; // 這里定義將要建立的WiFi名稱。此處以"taichi-maker"為示例
const char *password = "12345678"; // 這里定義將要建立的WiFi密碼。此處以12345678為示例
void setup() {
Serial.begin(9600); // 啟動(dòng)串口通訊
WiFi.softAP(ssid, password); // 此語(yǔ)句是重點(diǎn)。WiFi.softAP用于啟動(dòng)NodeMCU的AP模式。
Serial.print("Access Point: "); // 通過(guò)串口監(jiān)視器輸出信息
Serial.println(ssid); // 告知用戶NodeMCU所建立的WiFi名
Serial.print("IP address: "); // 以及NodeMCU的IP地址
Serial.println(WiFi.softAPIP()); // 通過(guò)調(diào)用WiFi.softAPIP()可以得到NodeMCU的IP地址
}
void loop() {
}
二、搭建HTTP網(wǎng)絡(luò)服務(wù)器
2.1 hello world 程序
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi庫(kù)
#include <ESP8266WebServer.h> // ESP8266WebServer庫(kù)
ESP8266WebServer esp8266_server(80); // 建立ESP8266WebServer對(duì)象,對(duì)象名稱為esp8266_server
const char* ssid = "home"; // 連接WiFi名(此處使用home為示例)
const char* password = "123456"; // 連接WiFi密碼(此處使用12345678為示例)
void setup(void){
Serial.begin(9600); // 啟動(dòng)串口通訊
WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
// WiFi連接成功后將通過(guò)串口監(jiān)視器輸出連接成功信息
Serial.println('\n'); // WiFi連接成功后
Serial.print("Connected to "); // NodeMCU將通過(guò)串口監(jiān)視器輸出。
Serial.println(WiFi.SSID()); // 連接的WiFI名稱
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
esp8266_server.begin(); // 開啟web服務(wù)器
esp8266_server.on("/", handleRoot); // 訪問(wèn)根路由即調(diào)用 handlerRoot 函數(shù)處理
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started"); // 告知用戶ESP8266網(wǎng)絡(luò)服務(wù)功能已經(jīng)啟動(dòng)
}
void loop(void){
esp8266_server.handleClient(); // 處理http服務(wù)器訪問(wèn)
}
void handleRoot() { //處理網(wǎng)站根目錄“/”的訪問(wèn)請(qǐng)求
esp8266_server.send(200, "text/plain", "Hello from ESP8266"); // 狀態(tài)碼 頭報(bào)文 正文
}
// 設(shè)置處理404情況的函數(shù)'handleNotFound'
void handleNotFound(){ // 當(dāng)瀏覽器請(qǐng)求的網(wǎng)絡(luò)資源無(wú)法在服務(wù)器找到時(shí),
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調(diào)用此函數(shù)。
}
?
?
2.2 web LED 點(diǎn)燈案例
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi庫(kù)
#include <ESP8266WebServer.h> // ESP8266WebServer庫(kù)
ESP8266WebServer esp8266_server(80); // 建立ESP8266WebServer對(duì)象,對(duì)象名稱為esp8266_server
const char* ssid = "home"; // 連接WiFi名(此處使用home為示例)
const char* password = "123456"; // 連接WiFi密碼(此處使用12345678為示例)
void setup(void){
Serial.begin(9600); // 啟動(dòng)串口通訊
pinMode(LED_BUILTIN, OUTPUT); //設(shè)置內(nèi)置LED引腳為輸出模式以便控制LED
digitalWrite(LED_BUILTIN,1);// 改變LED的點(diǎn)亮或者熄滅狀態(tài)
WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
// WiFi連接成功后將通過(guò)串口監(jiān)視器輸出連接成功信息
Serial.println('\n'); // WiFi連接成功后
Serial.print("Connected to "); // NodeMCU將通過(guò)串口監(jiān)視器輸出。
Serial.println(WiFi.SSID()); // 連接的WiFI名稱
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
esp8266_server.begin(); // 開啟web服務(wù)器
esp8266_server.on("/", handleRoot); // 訪問(wèn)根路由即調(diào)用 handlerRoot 函數(shù)處理
esp8266_server.on("/LED", HTTP_POST, handleLED); // 設(shè)置處理LED控制請(qǐng)求的函數(shù)'handleLED'
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started"); // 告知用戶ESP8266網(wǎng)絡(luò)服務(wù)功能已經(jīng)啟動(dòng)
}
void loop(void){
esp8266_server.handleClient(); // 處理http服務(wù)器訪問(wèn)
}
void handleLED(){
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
esp8266_server.sendHeader("Location","/");
esp8266_server.send(303);
}
void handleRoot() { //處理網(wǎng)站根目錄“/”的訪問(wèn)請(qǐng)求
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}
// 設(shè)置處理404情況的函數(shù)'handleNotFound'
void handleNotFound(){ // 當(dāng)瀏覽器請(qǐng)求的網(wǎng)絡(luò)資源無(wú)法在服務(wù)器找到時(shí),
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調(diào)用此函數(shù)。
}
?在這里改寫了根目錄,他會(huì)向客戶端發(fā)送一個(gè)按鈕的頁(yè)面,點(diǎn)擊即向 "/LED" 路由下發(fā)送 POST 請(qǐng)求。
void handleRoot() { //處理網(wǎng)站根目錄“/”的訪問(wèn)請(qǐng)求
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"Toggle LED\"></form>");
}
由于我們之前綁定了這個(gè)相應(yīng),即會(huì)觸發(fā):
void handleLED(){
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
esp8266_server.sendHeader("Location","/");
esp8266_server.send(303);
}
他在給 LED 取反后又重定向到根目錄,即可實(shí)現(xiàn)我們的效果。
?
三、ESP8266WebServer 庫(kù)
在之前我們基本使用了?ESP8266WebServer 庫(kù)的功能,下面我們來(lái)配合案例詳細(xì)了解這個(gè)庫(kù)的 API。
3.1 創(chuàng)建并啟動(dòng) Web Server
#include <ESP8266WebServer.h> // ESP8266WebServer庫(kù)
ESP8266WebServer esp8266_server(80); // 建立ESP8266WebServer對(duì)象,對(duì)象名稱為esp8266_server
此時(shí)實(shí)例化了一個(gè)名為?esp8266_server 的webServer 的對(duì)象。當(dāng)實(shí)例化完成后即自動(dòng)啟動(dòng)這個(gè)服務(wù)。當(dāng)然,此時(shí)我們的 8266 需要已經(jīng)配置好 wifi 才能被外部訪問(wèn)。
3.2 配置路由處理
esp8266_server.on("/LED", handleLED); // 無(wú)論GET 或POST請(qǐng)求都會(huì)觸發(fā)
esp8266_server.on("/LED", HTTP_POST, handleLED); // 無(wú)論GET 或POST請(qǐng)求都會(huì)觸發(fā)
void onNotFound(THandlerFunction fn); //配置無(wú)效的路由 用于404
void onFileUpload(THandlerFunction fn); //配置處理文件上傳的handler
3.3?獲取請(qǐng)求類型與參數(shù)案例
先用一個(gè)案例來(lái)演示:
#include <ESP8266WiFi.h> // 本程序使用 ESP8266WiFi庫(kù)
#include <ESP8266WebServer.h> // ESP8266WebServer庫(kù)
ESP8266WebServer esp8266_server(80); // 建立ESP8266WebServer對(duì)象,對(duì)象名稱為esp8266_server
const char* ssid = "home"; // 連接WiFi名(此處使用home為示例)
const char* password = "123456"; // 連接WiFi密碼(此處使用12345678為示例)
void setup(void){
Serial.begin(9600); // 啟動(dòng)串口通訊
pinMode(LED_BUILTIN, OUTPUT); //設(shè)置內(nèi)置LED引腳為輸出模式以便控制LED
digitalWrite(LED_BUILTIN,1);// 改變LED的點(diǎn)亮或者熄滅狀態(tài)
WiFi.begin(ssid, password); // 啟動(dòng)網(wǎng)絡(luò)連接
int i = 0;
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(i++); Serial.print(' ');
}
// WiFi連接成功后將通過(guò)串口監(jiān)視器輸出連接成功信息
Serial.println('\n'); // WiFi連接成功后
Serial.print("Connected to "); // NodeMCU將通過(guò)串口監(jiān)視器輸出。
Serial.println(WiFi.SSID()); // 連接的WiFI名稱
Serial.print("IP address:\t"); // 以及
Serial.println(WiFi.localIP()); // NodeMCU的IP地址
esp8266_server.begin(); // 開啟web服務(wù)器
esp8266_server.onNotFound(handleNotFound);
Serial.println("HTTP esp8266_server started"); // 告知用戶ESP8266網(wǎng)絡(luò)服務(wù)功能已經(jīng)啟動(dòng)
Serial.println("---------------------------------------");
}
void loop(void){
esp8266_server.handleClient(); // 處理http服務(wù)器訪問(wèn)
}
// 設(shè)置處理404情況的函數(shù)'handleNotFound'
void handleNotFound(){
Serial.print("url:");
Serial.println(esp8266_server.uri());
Serial.print("method:");
Serial.println(esp8266_server.method());
Serial.print("arg count:");
Serial.println(esp8266_server.args());
Serial.print("request host:");
Serial.println(esp8266_server.hostHeader());
Serial.print("auth:");
Serial.println(esp8266_server.authenticate("123", "456"));
Serial.println("---------------------------------------");
esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調(diào)用此函數(shù)。
}
使用 postman 工具發(fā)送消息
192.168.0.105/123、POST 請(qǐng)求、無(wú)參數(shù)、填入 authorization 賬號(hào):123 密碼:456
串口即收到信息。對(duì)于這個(gè)庫(kù)來(lái)說(shuō),POST 請(qǐng)求枚舉類型是 3,所以返回了method:3,auth 也驗(yàn)證通過(guò)。
如果用瀏覽器訪問(wèn) 192.168.0.105 也會(huì)給出相應(yīng)的返回值。
3.4?獲取請(qǐng)求類型方法和參數(shù)合集
以下函數(shù)均是?ESP8266WebServer 的實(shí)例方法
ESP8266WebServer esp8266_server(80);
esp8266_server.url(); //這樣調(diào)用即可
String url(); //獲取請(qǐng)求的url
HTTPMethod method(); //獲取請(qǐng)求方法
String arg(String name); //獲取請(qǐng)求參數(shù)的值 name:根據(jù)關(guān)鍵字name獲取請(qǐng)求參數(shù)的值
String arg(int i); //i:獲取第i個(gè)請(qǐng)求參數(shù)的值
int args(); //獲取參數(shù)個(gè)數(shù)
bool hasArg(String name); //是否存在某個(gè)參數(shù)
//設(shè)置需要收集的請(qǐng)求頭 headerkeys[]:請(qǐng)求頭的名字 headerkeysCount:請(qǐng)求頭的個(gè)數(shù)
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
String header(String name); //獲取請(qǐng)求頭參數(shù) name:請(qǐng)求頭名稱
String header(int i); //i:獲取第i個(gè)請(qǐng)求頭參數(shù)
String headerName(int i); //獲取請(qǐng)求頭名字 i:獲取第i個(gè)請(qǐng)求頭名字
int headers(); //獲取請(qǐng)求頭個(gè)數(shù)
bool hasHeader(String name); //判斷是否存在某個(gè)請(qǐng)求頭
String hostHeader(); //獲取請(qǐng)求頭Host的值
bool authenticate(const char * username, const char * password); //認(rèn)證校驗(yàn)
四、響應(yīng)客戶端請(qǐng)求
4.1 響應(yīng)案例
在?2.2 的點(diǎn)燈案例中,我們編寫了 handleLED 函數(shù)。在這里我們使用了 sendHeader 和 send 兩個(gè)客戶端響應(yīng)類函數(shù)。
其功能是設(shè)置響應(yīng)頭,并且設(shè)置為 303 狀態(tài)碼提示瀏覽器進(jìn)行刷新。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-761734.html
void handleLED(){
digitalWrite(LED_BUILTIN,!digitalRead(LED_BUILTIN));
esp8266_server.sendHeader("Location","/");
esp8266_server.send(303);
}
4.2?響應(yīng)客戶端方法和參數(shù)合集
以下函數(shù)均是?ESP8266WebServer 的實(shí)例方法文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-761734.html
ESP8266WebServer esp8266_server(80);
esp8266_server.esp8266_server.send(200); //這樣調(diào)用即可
//設(shè)置響應(yīng)頭
//name: 響應(yīng)頭名
//value: 響應(yīng)頭值
//first: 是否需要放在第一行
void sendHeader(const String& name, const String& value, bool first = false);
//設(shè)置響應(yīng)體長(zhǎng)度
void setContentLength(const size_t contentLength);
//發(fā)送響應(yīng)內(nèi)容
void sendContent(const String& content);
//發(fā)送響應(yīng)數(shù)據(jù)
void send(int code, const char* content_type = NULL, const String& content = String(""));
void send(int code, char* content_type, const String& content);
void send(int code, const String& content_type, const String& content);
到了這里,關(guān)于ESP8266 ArduinoIDE 搭建web服務(wù)器與客戶端開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!