一、环境搭建
1、首先需要从官方网站下载安装Arduino IDE软件,并安装好ESP32板子相关的支持库。
#include
#include
WebServer server(80);
void handleRoot() {
server.send(200, "text/plain", "Hello from ESP32!");
}
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP Server started");
}
void loop() {
server.handleClient();
}
2、然后将ESP32与电脑连接,选择对应的开发板和端口后,即可进行编写代码。
3、将ESP32与网络连接起来。在WiFi.begin()中填入访问点名称和密码,即可连接。
4、开启WebServer并监听80端口,调用handleRoot函数处理根网页请求。处理完请求后调用server.send将文本“Hello from ESP32!”返回至客户端。
二、HTML展示
1、为WebServer添加网页文件
#include
#include
WebServer server(80);
void handleRoot() {
server.send(200, "text/html", "Hello from ESP32!
");
}
void handleNotFound(){
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET)?"GET":"POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i=0; i<server.args(); i++){
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.onNotFound(handleNotFound);
server.begin();
Serial.println("HTTP Server started");
}
void loop() {
server.handleClient();
}
2、将HTML文本添加至处理函数handleRoot中,使用text/html表示文本类型。
3、如果在根目录未找到对应文件,调用handleNotFound函数通知客户端,发送404状态码和提示信息。
三、表单处理
1、编写表单HTML代码及处理函数
#include
#include
WebServer server(80);
void handleRoot() {
server.send(200, "text/html", "
");
}
void handleForm() {
String message = server.arg("message");
server.send(200, "text/html", "Message Received
" + message + "");
}
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/form", HTTP_POST, handleForm);
server.begin();
Serial.println("HTTP Server started");
}
void loop() {
server.handleClient();
}
2、在handleRoot函数中添加表单HTML代码。form标签属性method和action分别为POST请求和/form路径,包含一个text类型的输入框和提交按钮。
3、在handleForm函数中将表单中的输入信息取出并组成回应HTML代码发送到客户端。
4、将/form路径注册为HTTP POST请求的处理函数。
四、服务器访问
1、使用WebClient访问ESP32的WebServer
#include
#include
WiFiClient wifiClient;
WebClient client(wifiClient);
void setup() {
Serial.begin(9600);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
client.begin("http://esp32-webserver.local");
client.addHeader("Content-Type", "text/plain");
if (client.GET("/")) {
Serial.println(client.getResponsePayload());
} else {
Serial.println("Request failed");
}
delay(5000);
}
2、初始化WebClient并连接WiFi。
3、循环调用client.GET方法请求ESP32的WebServer根路径,并接收响应信息。
4、判断请求是否成功,若成功则输出响应信息至串行监视器。
五、文件读写
1、文件上传和处理
#include
#include
#include
#include
WebServer server(80);
File fsUploadFile;
void handleUpload() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
fsUploadFile = SPIFFS.open("/" + upload.filename, "w");
} else if (upload.status == UPLOAD_FILE_WRITE) {
if (fsUploadFile) {
fsUploadFile.write(upload.buf, upload.currentSize);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (fsUploadFile) {
fsUploadFile.close();
}
}
server.send(200);
}
void handleOTA() {
HTTPUpload& upload = server.upload();
if (upload.status == UPLOAD_FILE_START) {
Serial.println("Start uploading");
Serial.flush();
esp_err_t err = esp_ota_begin(esp_ota_get_next_update_partition(NULL), OTA_WITH_SEQUENTIAL_WRITES, NULL);
if (err != ESP_OK) {
Serial.printf("OTA begin failed, error=%d\r\n", err);
} else {
Serial.println("OTA begin succeeded");
}
} else if (upload.status == UPLOAD_FILE_WRITE) {
esp_err_t err = esp_ota_write(upload.buf, upload.currentSize);
if (err != ESP_OK) {
Serial.printf("OTA write failed, error=%d\r\n", err);
}
} else if (upload.status == UPLOAD_FILE_END) {
if (esp_ota_end(esp_ota_get_running_partition()) == ESP_OK) {
esp_err_t err = esp_ota_set_boot_partition(esp_ota_get_next_update_partition(NULL));
if (err == ESP_OK) {
Serial.println("ESP32 will reboot now.");
delay(2000);
ESP.restart();
} else {
Serial.printf("OTA partition setting failed, error=%d\r\n", err);
}
} else {
Serial.println("OTA end failed");
}
}
server.send(200);
}
void handleRoot() {
server.send(200, "text/html", "\
ESP32 Web Server
\
\
\
\
\
\
\
\
\
");
}
void setup() {
Serial.begin(115200);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
SPIFFS.begin();
server.on("/", handleRoot);
server.on("/upload", HTTP_POST, [](){ server.send(200); }, handleUpload);
server.on("/ota", HTTP_POST, [](){ server.send(200); }, handleOTA);
server.begin();
Serial.println("HTTP Server started");
}
void loop() {
server.handleClient();
}
2、在handleUpload函数中接收上传的文件,将其存储到SPIFFS中。
3、在handleOTA函数中开始OTA程序,将上传文件写入FLASH并更新ESP32的boot分区,完成后重启ESP32。
4、在handleRoot函数中添加表单HTML代码,其中指定POST请求路径为/upload和/ota,并设置enctype属性为multipart/form-data表示表单数据包含文件信息。
5、声明SPIFFS文件对象fsUploadFile,用于在handleUpload函数中存储上传的文件。
6、在setup函数中初始化SPIFFS文件系统。
原创文章,作者:PBOU,如若转载,请注明出处:https://www.506064.com/n/135656.html
微信扫一扫
支付宝扫一扫