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