ESP32 HTTP Client接口使用
前言
記錄下ESP32自帶的HTTP接口的使用, ESP HTTP模塊提供了豐富的API支持HTTP/HTTPS的請求,模塊位于esp-idf\components\esp_http_client中,其中Kconfig可修改默認使能HTTPS和身份驗證,在menuconfig也可以進行配置
如有異議,請指正
HTTP簡介
HTTP協議是Hyper Text Transfer Protocol超文本傳輸協議的縮寫,基于TCP傳輸層協議進行通信,采用客戶端-服務器模型(C/S架構),屬于應用層協議
HTTP數據傳輸是透明的,明文傳輸涉及到通信安全時,傳輸層上可套接TLS/SSL協議進行加密,也就是HTTPS
特點
- HTTP默認使用80端口,HTTPS默認使用443端口
- 無狀態,協議對于事務處理沒有記憶能力,每次都是一個新的連接,服務端不會記錄前后的請求信息(針對這個問題,引入Cookie將記錄加密存儲到客戶端中)
- 無連接,限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接;(HTTP1.1版本支持持久連接的方法)
- 媒體獨立,允許傳輸任意類型的數據對象,傳輸類型由Content-Type定義
API
接口可參考頭文件 esp-idf\components/esp_http_client/include/esp_http_client.h
esp_http_client_init
原型esp_http_client_handle_t esp_http_client_init(const esp_http_client_config_t *config)
- 配置http客戶端參數,分配需要的資源,返回esp_http_client_handle_t數據結構句柄,必須優先調用
- 傳遞配置形參,url成員必填,如果跳過證書可將元素skip_cert_common_name_check改為TRUE
esp_http_client_perform
原型esp_err_t esp_http_client_perform(esp_http_client_handle_t client)
- 進行鏈路的連接與數據的傳輸,內部包含完整的收發斷連的API調用
需要在配置esp_http_client_init后調用運行
esp_err_t err = esp_http_client_perform(client);esp_http_client_set_post_field/esp_http_client_get_post_field
原型esp_err_t esp_http_client_set_post_field(esp_http_client_handle_t client, const char *data, int len)
-通過post方式請求的數據,傳入發送數據的緩存地址與長度,必須在esp_http_client_perform之前調用
esp_http_client_get_post_field:為獲取當前當前post指向的數據緩存地址
esp_http_client_set_header/esp_http_client_get_header/esp_http_client_delete_header
- 設置、獲取、刪除請求頭,可新增、刪除或根據應用發送的數據類型來自定義請求文件類型來修改請求頭
esp_http_client_set_method
- 設置HTTP請求方式;
esp_http_client_open
原型esp_err_t esp_http_client_open(esp_http_client_handle_t client, int write_len)
- 打開連接,發送http請求頭,形參write_len為發送內容數據長度
esp_http_client_write
- 寫數據,調取esp_http_client_open成功后,可通過該接口進行數據內容的發送
esp_http_client_fetch_headers
- 讀取數據,自動處理掉響應頭并返回接收包長度
esp_http_client_read
- 讀取http接收的數據流,返回實際讀取長度;返回-1發生錯誤
esp_http_client_close
- 關閉http連接鏈路,會保留所有http請求資源
esp_http_client_cleanup
- 通過句柄esp_http_client關閉連接,釋放資源,必須在esp_http_client_init初始化后使用
esp_http_client_set_redirection
- 設置重定向URL。當從服務器接收到30x代碼時,客戶端存儲服務器提供的重定向URL。該函數將當前的網址設置為重定向,使客戶端能夠執行重定向請求。
esp_http_client_add_auth
- 在接收到HTTP狀態代碼401時,可以調用該應用編程接口來添加授權信息,調取前需清除下接收緩存;認證方式有 BASIC 認證(基本認證);DIGEST 認證(摘要認證);SSL 客戶端認證;FormBase 認證(基于表單認證)
struct esp_http_client_event
- Http事件數據結構,在esp_http_client_config_t中配置對應的回調函數
事件Id
typedef enum {HTTP_EVENT_ERROR = 0, //當執行期間出現任何錯誤時,會發生此事件 /*!< This event occurs when there are any errors during execution */HTTP_EVENT_ON_CONNECTED, //HTTP連接到服務器 /*!< Once the HTTP has been connected to the server, no data exchange has been performed */HTTP_EVENT_HEADERS_SENT, //發送請求頭 /*!< After sending all the headers to the server */HTTP_EVENT_HEADER_SENT = HTTP_EVENT_HEADERS_SENT, /*!< This header has been kept for backward compatabilityand will be deprecated in future versions esp-idf */HTTP_EVENT_ON_HEADER, //接收到響應頭 /*!< Occurs when receiving each header sent from the server */HTTP_EVENT_ON_DATA, //接收到數據 /*!< Occurs when receiving data from the server, possibly multiple portions of the packet */HTTP_EVENT_ON_FINISH, //http會話完成 /*!< Occurs when finish a HTTP session */HTTP_EVENT_DISCONNECTED, //http斷開事件 /*!< The connection has been disconnected */ } esp_http_client_event_id_t;代碼實例
可參考idf目錄下的test_http_client.c,路徑esp-idf\components\esp_http_client\test
實例
//事件回調 static esp_err_t _http_event_handle(esp_http_client_event_t *evt) {switch(evt->event_id) {case HTTP_EVENT_ERROR://錯誤事件ESP_LOGI(TAG, "HTTP_EVENT_ERROR");break;case HTTP_EVENT_ON_CONNECTED://連接成功事件ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED");break;case HTTP_EVENT_HEADER_SENT://發送頭事件ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT");break;case HTTP_EVENT_ON_HEADER://接收頭事件ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER");printf("%.*s", evt->data_len, (char*)evt->data);break;case HTTP_EVENT_ON_DATA://接收數據事件ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);if (!esp_http_client_is_chunked_response(evt->client)) {printf("%.*s", evt->data_len, (char*)evt->data);}break;case HTTP_EVENT_ON_FINISH://會話完成事件ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH");break;case HTTP_EVENT_DISCONNECTED://斷開事件ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");break;}return ESP_OK; }//http client配置 esp_http_client_config_t config = {.method = HTTP_METHOD_GET, //get請求.url = "https://www.baidu.com/", //請求url.event_handler = _http_event_handle,//注冊時間回調 };//測試入口 void http_client_test(void) {esp_http_client_handle_t client = esp_http_client_init(&config);//初始化配置esp_err_t err = esp_http_client_perform(client);//執行請求if(err == ESP_OK){ESP_LOGI(TAG, "Status = %d, content_length = %d",esp_http_client_get_status_code(client),//狀態碼esp_http_client_get_content_length(client));//數據長度ret = esp_http_client_read(client, pReadBuf, 512);//讀取512數據內容if(ret > 0){ESP_LOGI(TAG, "recv data = %d %s", ret, pReadBuf);//打印數據}}esp_http_client_cleanup(client);//斷開并釋放資源 }請求響應頭,內容即為百度的Html的頁面
總結
樂鑫提高的接口比較完整,從服務器獲取數據可直接使用上面的例程,如果是其他請求方式,如POST可以通過接口esp_http_client_set_post_field設置發送的內容數據,可使用esp_http_client_perform自動來完成收發的工作,通過事件回調可清晰跟蹤當前的狀態,有助于問題的調試
官方文檔
總結
以上是生活随笔為你收集整理的ESP32 HTTP Client接口使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么打开unity tweak tool
- 下一篇: mysql的max_allowed_pa