日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ESP32 HTTP Client接口使用

發布時間:2023/12/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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數據結構句柄,必須優先調用
esp_http_client_config_t config = {.url = "https://www.howsmyssl.com", // url.cert_pem = howsmyssl_com_root_cert_pem_start,//證書};esp_http_client_handle_t client = esp_http_client_init(&config);
  • 傳遞配置形參,url成員必填,如果跳過證書可將元素skip_cert_common_name_check改為TRUE
/*** @brief HTTP configuration*/ typedef struct {const char *url; //url請求接口必須配置 /*!< HTTP URL, the information on the URL is most important, it overrides the other fields below, if any */const char *host; //服務器域名或ip地址 /*!< Domain or IP as string */int port; //端口 http默認80 https 默認443 /*!< Port to connect, default depend on esp_http_client_transport_t (80 or 443) */const char *username; //用戶名,認證使用 /*!< Using for Http authentication */const char *password; //用戶密碼,認證使用 /*!< Using for Http authentication */esp_http_client_auth_type_t auth_type; //認證方式 /*!< Http authentication type, see `esp_http_client_auth_type_t` */const char *path; //路徑 /*!< HTTP Path, if not set, default is `/` */const char *query; //請求參數 /*!< HTTP query */const char *cert_pem; //證書 /*!< SSL server certification, PEM format as string, if the client requires to verify server */const char *client_cert_pem; /*!< SSL client certification, PEM format as string, if the server requires to verify client */const char *client_key_pem; /*!< SSL client key, PEM format as string, if the server requires to verify client */esp_http_client_method_t method; //請求方式 post get /*!< HTTP Method */int timeout_ms; //請求超時 /*!< Network timeout in milliseconds */bool disable_auto_redirect; /*!< Disable HTTP automatic redirects */int max_redirection_count; /*!< Max number of redirections on receiving HTTP redirect status code, using default value if zero*/int max_authorization_retries; /*!< Max connection retries on receiving HTTP unauthorized status code, using default value if zero. Disables authorization retry if -1*/http_event_handle_cb event_handler; //可注冊回調 /*!< HTTP Event Handle */esp_http_client_transport_t transport_type; // 傳輸方式 tcp ssl /*!< HTTP transport type, see `esp_http_client_transport_t` */int buffer_size; //接收緩存大小 /*!< HTTP receive buffer size */int buffer_size_tx; //發送緩存大小 /*!< HTTP transmit buffer size */void *user_data; //http用戶數據 /*!< HTTP user_data context */bool is_async; //同步模式 /*!< Set asynchronous mode, only supported with HTTPS for now */bool use_global_ca_store; /*!< Use a global ca_store for all the connections in which this bool is set. */bool skip_cert_common_name_check; //跳過證書 /*!< Skip any validation of server certificate CN field */ } esp_http_client_config_t;
esp_http_client_perform

原型esp_err_t esp_http_client_perform(esp_http_client_handle_t client)

  • 進行鏈路的連接與數據的傳輸,內部包含完整的收發斷連的API調用
esp_http_client_open -> esp_http_client_write -> esp_http_client_fetch_headers -> esp_http_client_read (and option) esp_http_client_close

需要在配置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_header(client, "HeaderKey", "HeaderValue");
esp_http_client_set_method
  • 設置HTTP請求方式;
//請求方式枚舉 typedef enum {HTTP_METHOD_GET = 0, /*!< HTTP GET Method */HTTP_METHOD_POST, /*!< HTTP POST Method */HTTP_METHOD_PUT, /*!< HTTP PUT Method */HTTP_METHOD_PATCH, /*!< HTTP PATCH Method */HTTP_METHOD_DELETE, /*!< HTTP DELETE Method */HTTP_METHOD_HEAD, /*!< HTTP HEAD Method */HTTP_METHOD_NOTIFY, /*!< HTTP NOTIFY Method */HTTP_METHOD_SUBSCRIBE, /*!< HTTP SUBSCRIBE Method */HTTP_METHOD_UNSUBSCRIBE,/*!< HTTP UNSUBSCRIBE Method */HTTP_METHOD_OPTIONS, /*!< HTTP OPTIONS Method */HTTP_METHOD_COPY, /*!< HTTP COPY Method */HTTP_METHOD_MOVE, /*!< HTTP MOVE Method */HTTP_METHOD_LOCK, /*!< HTTP LOCK Method */HTTP_METHOD_UNLOCK, /*!< HTTP UNLOCK Method */HTTP_METHOD_PROPFIND, /*!< HTTP PROPFIND Method */HTTP_METHOD_PROPPATCH, /*!< HTTP PROPPATCH Method */HTTP_METHOD_MKCOL, /*!< HTTP MKCOL Method */HTTP_METHOD_MAX, } esp_http_client_method_t;esp_http_client_set_method(client, HTTP_METHOD_GET);//GET請求
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中配置對應的回調函數
typedef struct esp_http_client_event {esp_http_client_event_id_t event_id; // 事件id /*!< event_id, to know the cause of the event */esp_http_client_handle_t client; //句柄 /*!< esp_http_client_handle_t context */void *data; //事件數據緩存 /*!< data of the event */int data_len; // 事件數據長度 /*!< data length of data */void *user_data; //用戶數據 /*!< user_data context, from esp_http_client_config_t user_data */char *header_key; //http頭密鑰 /*!< For HTTP_EVENT_ON_HEADER event_id, it's store current http header key */char *header_value; // http請求頭 /*!< For HTTP_EVENT_ON_HEADER event_id, it's store current http header value */ } esp_http_client_event_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接口使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。