ESP8266--Arduino开发(搭建HTTP网络服务器)
生活随笔
收集整理的這篇文章主要介紹了
ESP8266--Arduino开发(搭建HTTP网络服务器)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、前言
- 二、搭建HTTP網絡服務器
- 三、添加一個簡單網頁進行交互
- 四、ESP8266WebServer庫
- 4.1、WebServer管理方法
- 1、創建Web Server
- 2、啟動Web Server
- 3、關閉Web Server
- 4.2、配置client請求處理方法
- 1、請求響應回調
- 2、配置無效url的handler
- 3、配置處理文件上傳的handler
- 4.3、獲取請求方法
- 1、獲取請求的url
- 2、獲取請求方法
- 3、獲取請求參數的值
- 4、獲取請求參數的名稱
- 5、獲取參數個數
- 6、是否存在某個參數
- 7、設置需要收集的請求頭
- 8、獲取請求頭參數
- 9、獲取請求頭名字
- 10、獲取請求頭個數
- 11、判斷是否存在某個請求頭
- 12、獲取請求頭Host的值
- 13、認證校驗
- 14、處理http請求
- 4.4、獲取client請求方法
- 1、處理文件上傳
- 2、設置響應頭
- 3、設置響應體長度
- 4、發送響應內容
- 5、發送響應文件流
- 6、發送響應數據
一、前言
超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)是一個簡單的請求-響應協議,它通常運行在TCP之上,它指定了客戶端可能發送給服務器什么樣的消息以及得到什么樣的響應,,我們使用瀏覽器打開的網頁使用的就是HTTP協議。
接下來我們會參數在ESP8266-NodeMCU上建立一個HTTP網絡服務器,然后通過瀏覽器來訪問它。
二、搭建HTTP網絡服務器
/*ESP8266-NodeMCU作為HttpServer服務器 */#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi庫 #include <ESP8266WebServer.h> // web服務器通信庫需要使用/* 1. 設置Wifi接入信息 */ const char* ssid = "LaiFu"; // 需要連接到的WiFi名 const char* password = "wangjichuan"; // 連接的WiFi密碼/* 2. 創建一個web服務器對象,使用80端口,HTTP網絡服務器標準端口號即為80 */ ESP8266WebServer esp8266_server(80);/* 3. 處理訪問網站根目錄“/”的訪問請求 */ void handleRoot() { esp8266_server.send(200, "text/plain", "Hello from ESP8266"); // NodeMCU將調用此函數。 }/* 4. 設置處理404情況的函數'handleNotFound' */ void handleNotFound(){ // 當瀏覽器請求的網絡資源無法在服務器找到時,esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調用此函數。 }void setup() {/* 1. 初始化串口通訊波特率為115200*/Serial.begin(115200);/* 2. 開啟wifi連接,連接成功后打印IP地址 */WiFi.mode(WIFI_STA); // 設置Wifi工作模式為STA,默認為AP+STA模式WiFi.begin(ssid, password); // 通過wifi名和密碼連接到WifiSerial.print("\r\nConnecting to "); // 串口監視器輸出網絡連接信息Serial.print(ssid); Serial.println(" ..."); // 顯示NodeMCU正在嘗試WiFi連接int i = 0; // 檢查WiFi是否連接成功while (WiFi.status() != WL_CONNECTED) // WiFi.status()函數的返回值是由NodeMCU的WiFi連接狀態所決定的。 { // 如果WiFi連接成功則返回值為WL_CONNECTEDdelay(1000); // 此處通過While循環讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數返回值Serial.print("waiting for "); Serial.print(i++); Serial.println("s..."); } Serial.println(""); // WiFi連接成功后Serial.println("WiFi connected!"); // NodeMCU將通過串口監視器輸出"連接成功"信息。Serial.print("IP address: "); // 同時還將輸出NodeMCU的IP地址。這一功能是通過調用Serial.println(WiFi.localIP()); // WiFi.localIP()函數來實現的。該函數的返回值即NodeMCU的IP地址。/* 3. 開啟http網絡服務器功能 */esp8266_server.begin(); // 啟動http網絡服務器esp8266_server.on("/", handleRoot); // 設置請求根目錄時的處理函數函數esp8266_server.onNotFound(handleNotFound); // 設置無法響應時的處理函數 Serial.println("HTTP esp8266_server started");// 告知用戶ESP8266網絡服務功能已經啟動 }void loop() {esp8266_server.handleClient(); // 處理http訪問,需要一直運行 }ESP8266連接手機熱點
打開手機瀏覽器,輸入ESP8266的IP
顯示Hello FROM esp8266字符串說明HTTP服務器訪問正常
三、添加一個簡單網頁進行交互
通過上面的步驟只是搭建好了HTTP網絡服務器的框架,現在嵌入一個簡單的網頁來試試。
這個網頁提供兩個按鈕:關燈、開燈
主要是要添加路徑響應函數,在函數中設置小燈的亮滅
esp8266_server.on()中的路徑對應于表單的提交按鈕action屬性的路徑
/*ESP8266-NodeMCU作為HttpServer服務器 */#include <ESP8266WiFi.h> // 本程序使用ESP8266WiFi庫 #include <ESP8266WebServer.h> // web服務器通信庫需要使用/* 1. 設置Wifi接入信息 */ const char* ssid = "LaiFu"; // 需要連接到的WiFi名 const char* password = "wangjichuan"; // 連接的WiFi密碼/* 2. 創建一個web服務器對象,使用80端口,HTTP網絡服務器標準端口號即為80 */ ESP8266WebServer esp8266_server(80);/* 3. 處理訪問網站根目錄“/”的訪問請求 */ void handleRoot() { String htmlCode = "<!DOCTYPE html>\n"; htmlCode += " <html>\n";htmlCode += " <head>\n";htmlCode += " <meta charset=\"UTF-8\"/>\n";htmlCode += " <title>ESP8266 Butoon Ctrl</title>\n";htmlCode += " </head>\n"; htmlCode += " <body>\n";htmlCode += " <h2 align=\"center\">esp8266控制開關</h2>";htmlCode += " <p><form action=\"/LED_OFF\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"關燈\"></form></p>\n";htmlCode += " <p><form action=\"/LED_ON\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"開燈\"></form></p>\n";htmlCode += " </body>\n";htmlCode += " </html>\n";esp8266_server.send(200, "text/html", htmlCode); // NodeMCU將調用此函數。 }/* 4. 設置處理404情況的函數'handleNotFound' */ void handleNotFound(){ // 當瀏覽器請求的網絡資源無法在服務器找到時,esp8266_server.send(404, "text/plain", "404: Not found"); // NodeMCU將調用此函數。 }void handle_LED_ON() {Serial.println("handle_LED_ON");digitalWrite(2, LOW); }void handle_LED_OFF() {Serial.println("handle_LED_OFF");digitalWrite(2, HIGH); }void setup() {/* 1. 初始化串口通訊波特率為115200*/Serial.begin(115200);//配置GPIO2為輸出模式pinMode(2, OUTPUT);digitalWrite(2, LOW);/* 2. 開啟wifi連接,連接成功后打印IP地址 */WiFi.mode(WIFI_STA); // 設置Wifi工作模式為STA,默認為AP+STA模式WiFi.begin(ssid, password); // 通過wifi名和密碼連接到WifiSerial.print("\r\nConnecting to "); // 串口監視器輸出網絡連接信息Serial.print(ssid); Serial.println(" ..."); // 顯示NodeMCU正在嘗試WiFi連接int i = 0; // 檢查WiFi是否連接成功while (WiFi.status() != WL_CONNECTED) // WiFi.status()函數的返回值是由NodeMCU的WiFi連接狀態所決定的。 { // 如果WiFi連接成功則返回值為WL_CONNECTEDdelay(1000); // 此處通過While循環讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數返回值Serial.print("waiting for "); Serial.print(i++); Serial.println("s..."); } Serial.println(""); // WiFi連接成功后Serial.println("WiFi connected!"); // NodeMCU將通過串口監視器輸出"連接成功"信息。Serial.print("IP address: "); // 同時還將輸出NodeMCU的IP地址。這一功能是通過調用Serial.println(WiFi.localIP()); // WiFi.localIP()函數來實現的。該函數的返回值即NodeMCU的IP地址。/* 3. 開啟http網絡服務器功能 */esp8266_server.begin(); // 啟動http網絡服務器esp8266_server.on("/", handleRoot); // 設置請求根目錄時的處理函數函數esp8266_server.onNotFound(handleNotFound); // 設置無法響應時的處理函數 esp8266_server.on("/LED_ON", handle_LED_ON); // 設置請求開燈目錄時的處理函數函數esp8266_server.on("/LED_OFF", handle_LED_OFF);// 設置請求關燈目錄時的處理函數函數Serial.println("HTTP esp8266_server started");// 告知用戶ESP8266網絡服務功能已經啟動 }void loop() {esp8266_server.handleClient(); // 處理http訪問,需要一直運行 }在處理根目錄訪問請求函數handleRoot()中添加了html字符串,所以打開ESP8266的IP就能看到解析的網頁:
- 點擊開燈可以看見開發板小燈打開;
- 點擊關燈可以看見開發板小燈關閉;
四、ESP8266WebServer庫
4.1、WebServer管理方法
1、創建Web Server
ESP8266WebServer(IPAddress addr, int port = 80); ESP8266WebServer(int port = 80);//例如:創建一個web服務器對象,使用80端口 ESP8266WebServer esp8266_server(80);- addr:IP地址
- port:端口號
2、啟動Web Server
void begin(); void begin(uint16_t port);//例如:啟動Web Server esp8266_server.begin();- port:端口號
- begin函數要在配置好各個請求后使用
3、關閉Web Server
close(); stop();//例如:關閉Web Server esp8266_server.close();4.2、配置client請求處理方法
1、請求響應回調
void on(const String &url, THandlerFunction handler);- url:路徑
- handler:對應url的處理函數
注意:這里的handler函數是Http_ANY,不區分GET、POST等
void on(const String &url, HTTPMethod method, THandlerFunction fn);- url:路徑
- method:Http請求方法(HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, TTP_DELETE, HTTP_OPTIONS)
- fn:對應url的處理函數
- url:路徑
- method:Http請求方法(HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, TTP_DELETE, HTTP_OPTIONS)
- fn:對應url的處理函數
- ufn:文件上傳處理函數
2、配置無效url的handler
void onNotFound(THandlerFunction fn);- fn:對應的處理函數
注意:當找不到相對于的http請求處理函數時會調用該函數配置的fn方法
3、配置處理文件上傳的handler
void onFileUpload(THandlerFunction fn);- fn:對應的處理函數
4.3、獲取請求方法
1、獲取請求的url
String url();2、獲取請求方法
HTTPMethod method()- 返回值: HTTP_ANY, HTTP_GET, HTTP_POST, HTTP_PUT, HTTP_PATCH, HTTP_DELETE, HTTP_OPTIONS
3、獲取請求參數的值
String arg(String name);- name:根據關鍵字name獲取請求參數的值
- i:獲取第i個請求參數的值
4、獲取請求參數的名稱
String arg(int i);- i:獲取第i個請求參數的名稱
5、獲取參數個數
int args();6、是否存在某個參數
bool hasArg(String name);- name:參數的名稱
7、設置需要收集的請求頭
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);- headerkeys[]:請求頭的名字
- headerkeysCount:請求頭的個數
8、獲取請求頭參數
String header(String name);- name:請求頭名稱
- i:獲取第i個請求頭參數
9、獲取請求頭名字
String headerName(int i);- i:獲取第i個請求頭名字
10、獲取請求頭個數
int headers();11、判斷是否存在某個請求頭
bool hasHeader(String name);12、獲取請求頭Host的值
String hostHeader();13、認證校驗
bool authenticate(const char * username, const char * password);- username: 用戶賬號
- password: 用戶密碼
14、處理http請求
void handleClient();4.4、獲取client請求方法
1、處理文件上傳
HTTPUpload& upload(); //實例說明 非完整代碼,無法直接運行,理解即可 /*** 處理文件上傳 HandlerFunction* 此方法會在文件上傳過程中多次回調,我們可以判斷上傳狀態*/ void handleFileUpload() {//判斷http requestUriif (server.uri() != "/edit") {return;}//獲得 Http上傳文件處理對象HTTPUpload& upload = server.upload();//文件開始上傳if (upload.status == UPLOAD_FILE_START) {String filename = upload.filename;if (!filename.startsWith("/")) {filename = "/" + filename;}DBG_OUTPUT_PORT.print("handleFileUpload Name: "); DBG_OUTPUT_PORT.println(filename);//本地文件系統創建一個文件用來保存內容fsUploadFile = SPIFFS.open(filename, "w");filename = String();} else if (upload.status == UPLOAD_FILE_WRITE) {//文件開始寫入文件//DBG_OUTPUT_PORT.print("handleFileUpload Data: "); DBG_OUTPUT_PORT.println(upload.currentSize);if (fsUploadFile) {//寫入文件fsUploadFile.write(upload.buf, upload.currentSize);}} else if (upload.status == UPLOAD_FILE_END) {//文件上傳結束if (fsUploadFile) {fsUploadFile.close();}DBG_OUTPUT_PORT.print("handleFileUpload Size: "); DBG_OUTPUT_PORT.println(upload.totalSize);} }//注冊文件上傳處理回調 server.on("/edit", HTTP_POST, []() {server.send(200, "text/plain", "");}, handleFileUpload);2、設置響應頭
void sendHeader(const String& name, const String& value, bool first = false);- name: 響應頭名
- value: 響應頭值
- first: 是否需要放在第一行
3、設置響應體長度
void setContentLength(const size_t contentLength);4、發送響應內容
void sendContent(const String& content); void sendContent_P(PGM_P content); void sendContent_P(PGM_P content, size_t size);5、發送響應文件流
size_t streamFile(T &file, const String& contentType);- file: 具體文件
- contentType: 響應類型
6、發送響應數據
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); void send_P(int code, PGM_P content_type, PGM_P content); void send_P(int code, PGM_P content_type, PGM_P content, size_t contentLength);- code: 響應狀態碼
- content_type: 響應內容類型
- content:具體響應內容
總結
以上是生活随笔為你收集整理的ESP8266--Arduino开发(搭建HTTP网络服务器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winscp用密钥连接linux服务器和
- 下一篇: 如何登录企业邮箱?