汽車(chē)門(mén)戶網(wǎng)站開(kāi)發(fā)推廣網(wǎng)站的文案
ESP32-HTTP
介紹
ESP32是一款功能強(qiáng)大的微控制器,具有豐富的網(wǎng)絡(luò)和通信功能。其中之一就是支持HTTP協(xié)議,這使得ESP32可以用于創(chuàng)建Web服務(wù)器。
HTTP是什么?
HTTP(Hyper Text Transfer Protocol),即超文本傳輸協(xié)議,是一種無(wú)狀態(tài)的、建立在TCP之上的連接。其基本的工作流程是:客戶端發(fā)送一個(gè)HTTP請(qǐng)求,說(shuō)明自己想要訪問(wèn)的資源以及請(qǐng)求的動(dòng)作;服務(wù)端在收到請(qǐng)求后,開(kāi)始處理請(qǐng)求,并根據(jù)請(qǐng)求的內(nèi)容做出響應(yīng)。
在ESP32上,我們可以使用其內(nèi)置的HTTP Server組件來(lái)運(yùn)行一個(gè)輕量級(jí)的Web服務(wù)器。這個(gè)服務(wù)器組件能夠根據(jù)具體的配置分配內(nèi)存和資源,并返回該服務(wù)器實(shí)例的句柄。通過(guò)這個(gè)句柄,我們可以控制服務(wù)器的各種行為,例如啟動(dòng)、停止等。
WebServer庫(kù)用來(lái)做什么?
總而言之HTTP 服務(wù)器組件提供 websocket 支持,而WebServer庫(kù)是一個(gè)專(zhuān)門(mén)用于HTTP協(xié)議通訊的庫(kù)。它為開(kāi)發(fā)者提供了一套簡(jiǎn)單易用的API,使得我們可以基于ESP32開(kāi)發(fā)板快速地建立網(wǎng)絡(luò)服務(wù)器。通過(guò)這個(gè)網(wǎng)絡(luò)服務(wù)器,其他網(wǎng)絡(luò)設(shè)備以及物聯(lián)網(wǎng)設(shè)備都能通過(guò)HTTP協(xié)議來(lái)訪問(wèn)并實(shí)現(xiàn)物聯(lián)網(wǎng)信息交流。
WebServer庫(kù)的主要功能可以被分為兩大部分:一部分是服務(wù)器運(yùn)行管理,另一部分是處理客戶端的HTTP請(qǐng)求。在服務(wù)器運(yùn)行管理中,我們可以通過(guò)調(diào)用begin()
函數(shù)來(lái)啟動(dòng)服務(wù)器,使用stop()
函數(shù)來(lái)停止服務(wù)器,以及使用close()
函數(shù)來(lái)關(guān)閉服務(wù)器。而在處理客戶端的HTTP請(qǐng)求方面,庫(kù)中包含了各種處理Get
請(qǐng)求和Post
請(qǐng)求的函數(shù),這些函數(shù)可以幫助我們解析請(qǐng)求數(shù)據(jù)包,并回發(fā)響應(yīng)數(shù)據(jù)包。
基本流程
以下使用WebServer庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的Web服務(wù)器的基本步驟
-
引入相應(yīng)庫(kù):
#include <WebServer.h>
通過(guò)引入
WebServer
庫(kù),你可以使用其中定義的類(lèi)和函數(shù)來(lái)輕松創(chuàng)建Web服務(wù)器。 -
聲明WebServer對(duì)象并設(shè)置端口號(hào):
WebServer server(80);
在這里,你創(chuàng)建了一個(gè)名為
server
的WebServer
對(duì)象,并設(shè)置端口號(hào)為80。Web服務(wù)器通常使用端口80來(lái)監(jiān)聽(tīng)HTTP請(qǐng)求。 -
使用on()方法注冊(cè)鏈接與回調(diào)函數(shù):
server.on("/", handleRoot); server.on("/haha", [](){server.send(200, "text/html", "Hello from /haha!"); });
使用
on()
方法注冊(cè)了兩個(gè)路徑的處理函數(shù)。當(dāng)訪問(wèn)根路徑(“/”)時(shí),會(huì)調(diào)用handleRoot
函數(shù)。而當(dāng)訪問(wèn)路徑"/haha"時(shí),使用Lambda函數(shù)直接發(fā)送一個(gè)包含"Hello from /haha!"的響應(yīng)。 -
使用begin()方法啟動(dòng)服務(wù)器進(jìn)行請(qǐng)求監(jiān)聽(tīng):
server.begin();
通過(guò)調(diào)用
begin()
方法,啟動(dòng)Web服務(wù)器開(kāi)始監(jiān)聽(tīng)請(qǐng)求。在這一步之前,你已經(jīng)注冊(cè)了路徑和相應(yīng)的處理函數(shù)。 -
使用handleClient()方法處理來(lái)自客戶端的請(qǐng)求:
void loop() {server.handleClient(); }
在
loop()
函數(shù)中,使用server.handleClient()
不斷處理來(lái)自客戶端的請(qǐng)求。這是一個(gè)循環(huán),確保服務(wù)器一直處于監(jiān)聽(tīng)狀態(tài)。
這個(gè)流程能夠創(chuàng)建一個(gè)簡(jiǎn)單的Web服務(wù)器,處理不同路徑的請(qǐng)求并發(fā)送相應(yīng)的響應(yīng)。確保你的ESP32正確連接到WiFi網(wǎng)絡(luò),然后你可以在瀏覽器中訪問(wèn)相應(yīng)的IP地址,查看服務(wù)器的響應(yīng)。
示例:
#include <Arduino.h>
#include <WiFi.h>
#include <WebServer.h>
const char *ssid = "**********";
const char *password = "**********";WebServer server(80);void handelRoot()
{String HTML=R"(<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Hello World</title></head><body><h1>Hello World</h1></body></html>)";server.send(200,"text/html",HTML);
}
void setup()
{Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.print("\nIP地址:");//獲取ip地址Serial.println(WiFi.localIP());//注冊(cè)鏈接與回調(diào)函數(shù)server.on("/", handelRoot);//用lambda函數(shù)server.on("/haha",[](){server.send(200,"text/html",R"(<!DOCTYPE html><html lang="zh"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Hello World</title></head><body><h1>你好世界</h1></body></html>)");});//沒(méi)有頁(yè)面server.onNotFound([](){server.send(200,"text/html;charset=utf-8","沒(méi)有找到");});server.begin();
}
void loop()
{server.handleClient();
}
在瀏覽器中訪問(wèn)IP地址得到的響應(yīng)
常用API
WebServer
常用的 API
-
on
方法:server.on(path, HTTP_METHOD, handlerFunction);
用于注冊(cè)路徑(
path
)和相應(yīng)的處理函數(shù)(handlerFunction
)以及HTTP方法(HTTP_METHOD
)。當(dāng)有請(qǐng)求匹配到指定路徑和方法時(shí),將調(diào)用對(duì)應(yīng)的處理函數(shù)。 -
send
方法:server.send(statusCode, contentType, content);
用于向客戶端發(fā)送 HTTP 響應(yīng)。你可以指定狀態(tài)碼 (
statusCode
)、內(nèi)容類(lèi)型 (contentType
) 和實(shí)際內(nèi)容 (content
)。 -
onNotFound
方法:server.onNotFound(handlerFunction);
用于注冊(cè)一個(gè)處理函數(shù),當(dāng)請(qǐng)求的路徑未找到時(shí)將調(diào)用該函數(shù)。
-
begin
方法:server.begin();
用于啟動(dòng)服務(wù)器,開(kāi)始監(jiān)聽(tīng)請(qǐng)求。
-
handleClient
方法:server.handleClient();
用于處理客戶端的請(qǐng)求。通常需要在
loop
函數(shù)中調(diào)用,以確保持續(xù)處理請(qǐng)求。 -
arg
方法:
用于獲取 HTTP 請(qǐng)求中的參數(shù)值的函數(shù)。查詢參數(shù)是通過(guò) URL 傳遞的鍵值對(duì),出現(xiàn)在 URL 的問(wèn)號(hào)?
后面。
不了解URL請(qǐng)點(diǎn)擊查看這篇文章:
https://editor.csdn.net/md/?articleId=135704158String value = server.arg("parameterName");
這個(gè)函數(shù)會(huì)返回指定參數(shù)名 (
parameterName
) 對(duì)應(yīng)的值。例如,如果請(qǐng)求的 URL 是:http://example.com/path?name=John&age=25
你可以使用
server.arg("name")
來(lái)獲取name
參數(shù)的值,這將返回一個(gè)String
對(duì)象,其值為 “John”。 -
pathArg
方法:server.pathArg();
用于從HTTP請(qǐng)求的路徑中提取參數(shù)值
常見(jiàn)的HTTP狀態(tài)碼
以下是一些常見(jiàn)的HTTP狀態(tài)碼及其簡(jiǎn)要說(shuō)明:
-
200 OK: 服務(wù)器成功處理了請(qǐng)求。
-
404 Not Found: 服務(wù)器無(wú)法找到請(qǐng)求的網(wǎng)頁(yè)。這是最常見(jiàn)的客戶端錯(cuò)誤之一。
-
301 Moved Permanently: 被請(qǐng)求的網(wǎng)頁(yè)已經(jīng)永久移動(dòng)到新的位置??蛻舳藨?yīng)該使用新的 URI 重新發(fā)起請(qǐng)求。
-
503 Service Unavailable: 服務(wù)器目前無(wú)法處理請(qǐng)求,通常是由于過(guò)載或維護(hù)??蛻舳丝梢陨院笤俅螄L試。
-
401 Unauthorized: 請(qǐng)求未經(jīng)授權(quán),需要提供有效的身份驗(yàn)證信息。通常,這要求用戶進(jìn)行登錄。