十四、【ESP32全棧開發指南:搭建輕量級HTTP服務器】

一、HTTP協議基礎

HTTP(Hyper Text Transfer Protocol)作為互聯網基礎協議,采用請求-響應模型工作:

1.1 HTTP請求組成

GET /uri?query1=value1 HTTP/1.1      // 請求行(方法+URI+協議版本)
Host: example.com                   // 請求頭(鍵值對)
User-Agent: curl/7.68.0
Accept: */*// 空行分隔
body_data...                        // 請求體(POST/PUT時存在)

1.2 HTTP響應結構

HTTP/1.1 200 OK                     // 狀態行(版本+狀態碼+原因短語)
Content-Type: text/html             // 響應頭
Content-Length: 123// 空行分隔
<html>...</html>                    // 響應體

常見狀態碼含義

狀態碼含義典型場景
200OK請求成功
301永久重定向網站改版
404Not FoundURI不存在
500服務器內部錯誤程序崩潰

二、ESP-HTTP-Server核心API

ESP-IDF提供輕量級HTTP服務器組件,核心接口如下:

2.1 服務器初始化

// 創建默認配置
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.server_port = 80;  // 設置監聽端口// 啟動HTTP服務器
httpd_handle_t server;
esp_err_t ret = httpd_start(&server, &config);

2.2 URI處理器注冊

typedef struct {const char *uri;httpd_method_t method;esp_err_t (*handler)(httpd_req_t *r);void *user_ctx;
} httpd_uri_t;// 示例:注冊GET處理器
httpd_register_uri_handler(server, &(httpd_uri_t){.uri = "/api/data",.method = HTTP_GET,.handler = data_get_handler,.user_ctx = NULL
});

2.3 請求解析關鍵API

函數功能描述
httpd_req_get_url_query_len()獲取查詢字符串長度
httpd_req_get_url_query_str()獲取完整查詢字符串
httpd_query_key_value()解析特定鍵值參數
httpd_req_recv()接收請求體數據

三、核心實現代碼

3.1 GET請求處理

esp_err_t get_handler(httpd_req_t *req) {// 構造響應const char resp[] = "{\"status\":\"OK\",\"value\":25}";// 設置JSON類型響應頭httpd_resp_set_type(req, "application/json");// 發送響應httpd_resp_send(req, resp, HTTPD_RESP_USE_STRLEN);return ESP_OK;
}

3.2 POST請求處理

esp_err_t post_handler(httpd_req_t *req) {char content[100];int recv_size = MIN(req->content_len, sizeof(content)-1);// 接收數據int ret = httpd_req_recv(req, content, recv_size);if (ret <= 0) {if (ret == HTTPD_SOCK_ERR_TIMEOUT) {httpd_resp_send_408(req);}return ESP_FAIL;}content[ret] = '\0';  // 添加字符串終止符// 處理接收的數據(示例:控制LED)if (strstr(content, "led=on")) {gpio_set_level(LED_GPIO, 1);}// 發送響應httpd_resp_send(req, "CMD_EXECUTED", 12);return ESP_OK;
}

3.3 URI處理器綁定

// GET端點配置
httpd_uri_t get_endpoint = {.uri = "/control",.method = HTTP_GET,.handler = get_handler,.user_ctx = NULL
};// POST端點配置
httpd_uri_t post_endpoint = {.uri = "/control",.method = HTTP_POST,.handler = post_handler,.user_ctx = NULL
};// 注冊處理器
void register_handlers(httpd_handle_t server) {httpd_register_uri_handler(server, &get_endpoint);httpd_register_uri_handler(server, &post_endpoint);
}

四、實戰應用示例

4.1 創建WiFi熱點提供HTTP服務

void app_main() {// 初始化NVSnvs_flash_init();// 創建AP模式熱點wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();esp_wifi_init(&cfg);wifi_config_t wifi_config = {.ap = {.ssid = "ESP32_AP",.password = "12345678",.max_connection = 4,.authmode = WIFI_AUTH_WPA_WPA2_PSK}};esp_wifi_set_mode(WIFI_MODE_AP);esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config);esp_wifi_start();// 啟動HTTP服務器httpd_handle_t server = start_webserver();
}

4.2 關鍵功能測試方法

測試GET請求
curl "http://192.168.4.1/control?led=on"

響應示例:

{"status":"OK","value":1}
測試POST請求
curl -X POST -d "brightness=80" http://192.168.4.1/control

響應示例:

CMD_EXECUTED
實時調試輸出
I (1254) HTTP_SERVER: Received 12 bytes: brightness=80
I (1256) GPIO: LED brightness set to 80%

4.3 動態URI管理

// 動態注銷URI
httpd_unregister_uri(server, "/old_api");// 注冊新URI
httpd_register_uri_handler(server, &(httpd_uri_t){.uri = "/new_api",.method = HTTP_GET,.handler = new_api_handler
});// 自定義錯誤處理
httpd_register_err_handler(server, HTTPD_404_NOT_FOUND, custom_404_handler);

五、進階技巧

5.1 分塊傳輸大文件

FILE *file = fopen("/spiffs/image.jpg", "rb");
const size_t CHUNK_SIZE = 1024;
uint8_t chunk[CHUNK_SIZE];while (fread(chunk, 1, CHUNK_SIZE, file) > 0) {httpd_resp_send_chunk(req, (char*)chunk, CHUNK_SIZE);
}
httpd_resp_send_chunk(req, NULL, 0);  // 結束傳輸
fclose(file);

5.2 安全增強方案

// Basic身份驗證
char auth_header[150];
size_t auth_len = httpd_req_get_hdr_value_len(req, "Authorization");if (auth_len > 0) {httpd_req_get_hdr_value_str(req, "Authorization", auth_header, sizeof(auth_header));if (strstr(auth_header, "Basic dXNlcjpwYXNz") == NULL) {  // user:pass的base64httpd_resp_set_status(req, "401 Unauthorized");httpd_resp_set_hdr(req, "WWW-Authenticate", "Basic realm=\"ESP32\"");httpd_resp_send(req, NULL, 0);return ESP_OK;}
}

5.3 性能優化參數

httpd_config_t config = HTTPD_DEFAULT_CONFIG();
config.uri_match_fn = httpd_uri_match_wildcard;  // 啟用通配符匹配
config.max_open_sockets = 6;       // 最大并發連接數
config.stack_size = 10240;         // 任務堆棧大小
config.lru_purge_enable = true;    // 啟用LRU連接清理

六、常見問題排查

6.1 典型錯誤解決方案

錯誤現象可能原因解決方案
啟動失敗 (ESP_ERR_INVALID_ARG)端口被占用更換端口或重啟設備
接收數據不完整緩沖區太小增大接收緩沖區
響應時間過長處理器阻塞優化處理邏輯或啟用分塊傳輸
OTA升級失敗分區表配置錯誤檢查分區表設置

6.2 調試技巧

// 啟用詳細日志
esp_log_level_set("httpd", ESP_LOG_VERBOSE);// 查看內存使用情況
ESP_LOGI(TAG, "Free heap: %d", esp_get_free_heap_size());// 網絡抓包分析
// 使用Wireshark監聽端口80流量

實測數據參考

  • 最小內存占用:~20KB RAM
  • 最大并發連接:6-8個(根據配置)
  • 請求處理延遲:<50ms(簡單請求)

完整工程代碼:GitHub倉庫鏈接

參考資料

  1. ESP-IDF HTTP Server官方文檔
  2. HTTP狀態碼詳解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84965.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84965.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java中LinkedList和ArrayList的區別和聯系?

我們被要求解釋Java中LinkedList和ArrayList的區別和聯系。下面將分別從實現原理、性能特點、使用場景等方面進行詳細說明&#xff0c;并總結它們的相同點和不同點。 # 一、聯系&#xff08;共同點&#xff09; 1. 都實現了List接口&#xff0c;因此具有List接口的所有方法&…

明遠智睿SD2351核心板:邊緣計算時代的工業級核心引擎深度解析

在工業4.0與物聯網深度融合的背景下&#xff0c;邊緣計算設備正從單一功能模塊向高集成度、智能化平臺演進。明遠智睿推出的SD2351核心板&#xff0c;憑借其異構計算架構、工業級接口資源和全棧技術生態&#xff0c;重新定義了邊緣計算設備的性能邊界。本文將從技術架構、場景適…

Flask 動態模塊注冊

目錄 1. 項目概述2. 項目結構3. 核心組件解析3.1 動態模塊注冊系統 (api/__init__.py)3.2 應用程序入口 (setup_demo.py) 4. 模塊開發指南4.1 標準模塊 (*_app.py)4.2 SDK模塊 (sdk/*.py) 5. URL路徑規則6. 如何使用6.1 啟動應用6.2 添加新模塊 7. 工作原理 1. 項目概述 這個項…

JVM 內存、JMM內存與集群機器節點內存的聯系

目錄 1、JVM 內存 1.1、分配機制 1.2、jvm模型位置 1.3、字節碼內存塊 2、JMM內存 2.1、JMM模型 2.2、工作流程圖 1、工作內存與主內存的交互 2. 多線程下的主內存與堆內存交互 2.3、 主內存與工作內存的同步方案 1、volatile 2、synchronized 3、final 3、內存使…

學習昇騰開發的第一天--環境配置

1、昇騰社區官網&#xff1a;昇騰社區官網-昇騰萬里 讓智能無所不及 2、產品-->選擇開發者套件-->點擊制卡工具的下載&#xff1a;資源-Atlas 200I DK A2-昇騰社區 3、如果制卡工具不能使用在線制卡&#xff0c;可以下載鏡像到本地使用本地制卡&#xff1a;Linux系統制…

Android WebView 深色模式適配方案總結

Android WebView 深色模式適配方案總結 在 Android WebView 中適配深色模式&#xff08;Dark Mode&#xff09;是一個常見的需求&#xff0c;尤其是當加載的網頁沒有原生支持 prefers-color-scheme 時。本文將介紹 3 種主流方案&#xff0c;并分析它們的優缺點&#xff0c;幫助…

項目練習:使用mybatis的foreach標簽,實現union all的拼接語句

文章目錄 一、需求說明二、需求分析三、代碼實現四、報表效果 一、需求說明 在sql查詢數據后&#xff0c;對數據分組統計。并最后進行總計。 二、需求分析 最終&#xff0c;我想用sql來實現這個統計和查詢的功能。 那么&#xff0c;怎么又查詢&#xff0c;又統計了&#xf…

7.7 Extracting and saving responses

Chapter 7-Fine-tuning to follow instructions 7.7 Extracting and saving responses 在本節中&#xff0c;我們保存測試集響應以便在下一節中評分&#xff0c;除此之外保存模型的副本以供將來使用。 ? 首先&#xff0c;讓我們簡單看看finetuned模型生成的響應 torch.manu…

計算機網絡第3章(上):數據鏈路層全解析——組幀、差錯控制與信道效率

目錄 一、數據鏈路層的功能二、組幀2.1 字符計數法&#xff08;Character Count&#xff09;2.2 字符填充法&#xff08;Character Stuffing&#xff09;2.3 零比特填充法2.4 違規編碼法 三、差錯控制3.1 檢錯編碼&#xff08;奇偶校驗碼&#xff09;3.2 循環冗余校驗&#xff…

鑄鐵試驗平臺的重要性及應用前景

鑄鐵作為一種重要的金屬材料&#xff0c;在工業生產中扮演著舉足輕重的角色。為了確保鑄鐵制品的質量和性能&#xff0c;鑄鐵材料的試驗是必不可少的環節。而鑄鐵試驗平臺則是進行鑄鐵試驗的關鍵設備之一&#xff0c;它為鑄鐵材料的研究和開發提供了重要的技術支持。本文將探討…

std::shared_ptr引起內存泄漏的例子

目錄 一、循環引用&#xff08;最常見場景&#xff09; 示例代碼 內存泄漏原因 二、共享指針管理的對象包含自身的 shared_ptr 示例代碼 內存泄漏&#xff08;或雙重釋放&#xff09;原因 三、解決方案 1. 循環引用&#xff1a;使用 std::weak_ptr 2. 對象獲取自身的 …

AI 知識數據庫搭建方案:從需求分析到落地實施

AI 知識數據庫的搭建需結合業務場景、數據特性與技術架構&#xff0c;形成系統化解決方案。以下是一套完整的搭建框架&#xff0c;涵蓋規劃、設計、實施及優化全流程&#xff1a; 一、前期規劃&#xff1a;需求分析與目標定義 1. 明確業務場景與知識需求 場景導向&#xff1a…

Tensorflow 基礎知識:變量、常量、占位符、Session 詳解

在深度學習領域,TensorFlow 是一個廣泛使用的開源機器學習框架。想要熟練使用 TensorFlow 進行模型開發,掌握變量、常量、占位符和 Session 這些基礎知識是必不可少的。接下來,我們就深入了解一下它們的概念、用處,并通過代碼示例進行演示。 一、常量(Constant) 常量,顧…

linux 常見問題之如何清除大文件的內容

linux 常見問題之如何清除大文件的內容 在 Linux 系統中&#xff0c;我們有時會遇到文件隨著時間增長變得巨大&#xff0c;最常見的就是服務器的日志文件&#xff0c;隨著時間的推移占用大量的磁盤空間&#xff0c;下面介紹如何清楚大文件的內容&#xff0c;當然避免文件內容過…

薛定諤的貓思想實驗如何推演到量子計算

前言 這是我的選修課作業&#xff0c;但是我并不喜歡小論文方式的寫法&#xff0c;死板又老套。先在這打一份底稿。 薛定諤的貓 可能一說到量子這個關鍵詞&#xff0c;大家第一時間都會想到的是“薛定諤的貓”。 實驗介紹 薛定諤的貓是一個著名的思想實驗&#xff0c;由奧…

嵌入式開發中fmacro-prefix-map選項解析

在嵌入式開發中&#xff0c;-fmacro-prefix-map 是 GCC 和 Clang 等編譯器提供的一個路徑映射選項&#xff0c;主要用于在預處理階段重寫宏定義中出現的絕對路徑。它的核心目的是解決以下問題&#xff1a; 核心作用 構建可重現性 消除編譯輸出&#xff08;如 .o、.d 文件&…

Javaweb學習——day3(Servlet 中處理表單數據)

文章目錄 一、概念學習1. GET vs POST 請求方式的區別2. HttpServletRequest 獲取表單數據 二、代碼講解與練習第 1 步&#xff1a;在 webapp 下創建 login.html第 2 步&#xff1a;在 com.example 包下創建 LoginServlet第 3 步&#xff1a;修改 web.xml 注冊 LoginServlet第 …

在 iOS 開發中單獨解析域名為 IP

1 為什么要自己解析? 典型場景說明劫持/污染檢測比較 系統解析 與 自建 DNS 的差異QoS / CDN 選路對每個候選 IP 做 RT/丟包測速系統 API(NSURLSession / Network.framework)在「真正建立連接之前」不會把解析結果暴露出來,因此需要主動解析一步。 2 API 選型概覽 API是否過…

YOLOv1 技術詳解:正負樣本劃分與置信度設計

&#x1f50d; YOLOv1 技術詳解&#xff1a;正負樣本劃分與置信度設計 一、前言 YOLOv1 是目標檢測領域中具有劃時代意義的算法之一&#xff0c;它將檢測任務統一為一個回歸問題&#xff0c;實現了“You Only Look Once”的端到端實時檢測。其中&#xff0c;正負樣本的劃分機…

為 Nginx 配置 HTTPS(以 n8n 為例)完整教程【CentOS 7】

在部署如 n8n 這類自動化平臺時&#xff0c;為了保障數據傳輸安全&#xff0c;我們通常會使用 HTTPS 訪問。本文將以 n8n.example.com 為例&#xff0c;介紹如何在 CentOS 7 系統中通過 Nginx 為本地運行在端口 5678 的 n8n 服務配置免費 SSL 證書&#xff08;Let’s Encrypt&a…