zoukankan      html  css  js  c++  java
  • ESP32-http client笔记

    基于ESP-IDF4.1

    #include <string.h>
    #include <stdlib.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "esp_log.h"
    #include "esp_system.h"
    #include "nvs_flash.h"
    #include "esp_event.h"
    #include "esp_netif.h"
    #include "protocol_examples_common.h"
    #include "esp_tls.h"
    
    #include "esp_http_client.h"
    
    #define MAX_HTTP_RECV_BUFFER 512
    static const char *TAG = "HTTP_CLIENT";
    
    //Http事件处理程序
    esp_err_t _http_event_handler(esp_http_client_event_t *evt)
    {
        switch(evt->event_id) {
            case HTTP_EVENT_ERROR:
                ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
                break;
            case HTTP_EVENT_ON_CONNECTED:
                ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
                break;
            case HTTP_EVENT_HEADER_SENT:
                ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT");
                break;
            case HTTP_EVENT_ON_HEADER:
                ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
                break;
            case HTTP_EVENT_ON_DATA:
                ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
                if (!esp_http_client_is_chunked_response(evt->client)) {
                    // Write out data
                    // printf("%.*s", evt->data_len, (char*)evt->data);
                }
    
                break;
            case HTTP_EVENT_ON_FINISH:
                ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
                break;
            case HTTP_EVENT_DISCONNECTED:
                ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
                int mbedtls_err = 0;
                esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL);
                if (err != 0) {
                    ESP_LOGI(TAG, "Last esp error code: 0x%x", err);
                    ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err);
                }
                break;
        }
        return ESP_OK;
    }
    
    static void http_rest_with_url(void)
    {
        esp_http_client_config_t config = {
            .url = "http://httpbin.org/get",
            .event_handler = _http_event_handler,
        };
        esp_http_client_handle_t client = esp_http_client_init(&config);
    
        // GET
        esp_err_t err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
        }
    
        // POST
        const char *post_data = "field1=value1&field2=value2";
        esp_http_client_set_url(client, "http://httpbin.org/post");
        esp_http_client_set_method(client, HTTP_METHOD_POST);
        esp_http_client_set_post_field(client, post_data, strlen(post_data));
        err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
        }
    
        //PUT
        esp_http_client_set_url(client, "http://httpbin.org/put");
        esp_http_client_set_method(client, HTTP_METHOD_PUT);
        err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP PUT Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP PUT request failed: %s", esp_err_to_name(err));
        }
    
        //PATCH
        esp_http_client_set_url(client, "http://httpbin.org/patch");
        esp_http_client_set_method(client, HTTP_METHOD_PATCH);
        esp_http_client_set_post_field(client, NULL, 0);
        err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP PATCH Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP PATCH request failed: %s", esp_err_to_name(err));
        }
    
        //DELETE
        esp_http_client_set_url(client, "http://httpbin.org/delete");
        esp_http_client_set_method(client, HTTP_METHOD_DELETE);
        err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP DELETE Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP DELETE request failed: %s", esp_err_to_name(err));
        }
    
        //HEAD
        esp_http_client_set_url(client, "http://httpbin.org/get");
        esp_http_client_set_method(client, HTTP_METHOD_HEAD);
        err = esp_http_client_perform(client);
        if (err == ESP_OK) {
            ESP_LOGI(TAG, "HTTP HEAD Status = %d, content_length = %d",
                    esp_http_client_get_status_code(client),
                    esp_http_client_get_content_length(client));
        } else {
            ESP_LOGE(TAG, "HTTP HEAD request failed: %s", esp_err_to_name(err));
        }
    
        esp_http_client_cleanup(client);
    }
    
    
    static void http_perform_as_stream_reader(void)
    {
        char *buffer = malloc(MAX_HTTP_RECV_BUFFER + 1);
        if (buffer == NULL) {
            ESP_LOGE(TAG, "Cannot malloc http receive buffer");
            return;
        }
        esp_http_client_config_t config = {
            .url = "http://httpbin.org/get",
            .event_handler = _http_event_handler,
        };
        esp_http_client_handle_t client = esp_http_client_init(&config);
        esp_err_t err;
        if ((err = esp_http_client_open(client, 0)) != ESP_OK) {
            ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
            free(buffer);
            return;
        }
        int content_length =  esp_http_client_fetch_headers(client);
        int total_read_len = 0, read_len;
        if (total_read_len < content_length && content_length <= MAX_HTTP_RECV_BUFFER) {
            read_len = esp_http_client_read(client, buffer, content_length);
            if (read_len <= 0) {
                ESP_LOGE(TAG, "Error read data");
            }
            buffer[read_len] = 0;
            ESP_LOGD(TAG, "read_len = %d", read_len);
        }
        ESP_LOGI(TAG, "HTTP Stream reader Status = %d, content_length = %d",
                        esp_http_client_get_status_code(client),
                        esp_http_client_get_content_length(client));
        esp_http_client_close(client);
        esp_http_client_cleanup(client);
        free(buffer);
    }
    
    //任务
    static void http_test_task(void *pvParameters)
    {
        http_rest_with_url();
        http_perform_as_stream_reader();
    
        ESP_LOGI(TAG, "Finish http example");
        vTaskDelete(NULL);
    }
    
    void app_main(void)
    {
        esp_err_t ret = nvs_flash_init();
        if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
          ESP_ERROR_CHECK(nvs_flash_erase());
          ret = nvs_flash_init();
        }
        ESP_ERROR_CHECK(ret);
        ESP_ERROR_CHECK(esp_netif_init());
        ESP_ERROR_CHECK(esp_event_loop_create_default());
    
        //连接网络
        ESP_ERROR_CHECK(example_connect());
        ESP_LOGI(TAG, "Connected to AP, begin http example");
    
        xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL);
    }

    原文:https://gitee.com/EspressifSystems/esp-idf

  • 相关阅读:
    python爬虫之趟雷
    python附录-builtins.py模块str类源码(含str官方文档链接)
    python-基础学习篇(一)
    pycharm和webstorm永久激活方法
    计算机网络基础概述
    计算机基础
    B/S和C/S架构简单理解
    认识HTML中文本、图片、链接标签和路径
    结对开发
    全国疫情可视化地图 (一)
  • 原文地址:https://www.cnblogs.com/kerwincui/p/13959236.html
Copyright © 2011-2022 走看看