ESP32-C3学习笔记:HTTP的POST连接

注意:HTTP post示例(仅适用于HTTP)

1.配置结构体:esp_http_client_config_t
eg:
    esp_http_client_config_t config = {
        .url = "http:xxxxxxxxx",
        .event_handler = _http_event_handler,        
        .user_data = local_response_buffer,
        .keep_alive_enable = true,
        .method = HTTP_METHOD_POST,
    }; 
    
    其中:
        .event_handler:                   为回调函数,参考下文示例_http_event_handler
        .user_data:                          返回的Response数据
        .method:                              连接方式 POST/GET
        .keep_alive_enable:            使能keep-alive    

2.初始化,设置http连接句柄client
eg:
    esp_http_client_handle_t client = esp_http_client_init(&config);     

3.设置传输数据body,一般为json格式的字符串
eg:
    const char * post_data = "{\"testID\":\"12345678\",\"sign\":\"xxxxxxxxxxxxx\"}" ;    

4.设置请求报头
eg:
    esp_http_client_set_header(client, "Content-Type", "application/json");

5.设置POST传输数据包
eg:    
    esp_http_client_set_post_field(client, post_data, strlen(post_data));

6.发起请求,等待回调结束
eg:
    esp_err_t 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));    //获取http响应内容长度
    } 
    else 
    {
        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
        esp_http_client_cleanup(client);
        return EXIT_FAILURE;
    }

7.检查是否有respose返回
eg:
    if( esp_http_client_is_chunked_response(client) == true )
    {
        ESP_LOGI(TAG, "response: %s", local_response_buffer );
    }
    else
    {
        ESP_LOGE(TAG, "get response err!" );
        esp_http_client_cleanup(client);
        return EXIT_FAILURE;
    }

附录1:回调函数_http_event_handler

static esp_err_t _http_event_handler(esp_http_client_event_t *evt)
{
    static char *output_buffer;  // Buffer to store response of http request from event handler
    static int output_len;       // Stores number of bytes read
    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, key=%s, value=%s", evt->header_key, evt->header_value);
            break;
        case HTTP_EVENT_ON_DATA:
            ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
            /*
             *  Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data.
             *  However, event handler can also be used in case chunked encoding is used.
             */
            if (esp_http_client_is_chunked_response(evt->client)) 
            {
                // If user_data buffer is configured, copy the response into the buffer
                if (evt->user_data) {
                    memcpy(evt->user_data + output_len, evt->data, evt->data_len);
                } else {
                    if (output_buffer == NULL) {
                        output_buffer = (char *) malloc(esp_http_client_get_content_length(evt->client));
                        output_len = 0;
                        if (output_buffer == NULL) {
                            ESP_LOGE(TAG, "Failed to allocate memory for output buffer");
                            return ESP_FAIL;
                        }
                    }
                    memcpy(output_buffer + output_len, evt->data, evt->data_len);
                }
                output_len += evt->data_len;
            }
            break;
        case HTTP_EVENT_ON_FINISH:
            ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH");
            if (output_buffer != NULL) {
                // Response is accumulated in output_buffer. Uncomment the below line to print the accumulated response
                // ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len);
                free(output_buffer);
                output_buffer = NULL;
            }
            output_len = 0;
            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);
            }
            if (output_buffer != NULL) {
                free(output_buffer);
                output_buffer = NULL;
            }
            output_len = 0;
            break;
    }
    return ESP_OK;
}

附录2:结构体参数

typedef struct {
    const char                  *url; //url请求接口必须配置              
    const char                  *host; //服务器域名或ip地址              
    int                         port; //端口 http默认80 https 默认443               
    const char                  *username;  //用户名,认证使用        
    const char                  *password;  //用户密码,认证使用         
    esp_http_client_auth_type_t auth_type; //认证方式          
    const char                  *path;  //路径             
    const char                  *query;  //请求参数            
    const char                  *cert_pem;    //证书       
    const char                  *client_cert_pem;    
    const char                  *client_key_pem;     
    esp_http_client_method_t    method;  //请求方式 post get                
    int                         timeout_ms;  //请求超时           
    bool                        disable_auto_redirect;   
    int                         max_redirection_count;    
    int                         max_authorization_retries;   
    http_event_handle_cb        event_handler;  //可注册回调           
    esp_http_client_transport_t transport_type;  // 传输方式 tcp ssl       
    int                         buffer_size; //接收缓存大小            
    int                         buffer_size_tx; //发送缓存大小       
    void                        *user_data;  //http用户数据            
    bool                        is_async;  //同步模式               
    bool                        use_global_ca_store;      
    bool                        skip_cert_common_name_check; //跳过证书  
    esp_err_t (*crt_bundle_attach)(void *conf);      
    bool                        keep_alive_enable;
    int                         keep_alive_idle;     
    int                         keep_alive_interval;
    int                         keep_alive_count;    
    struct ifreq                *if_name;        
} esp_http_client_config_t;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2022 / 01/ 30: 新版esptool 刷micropython固件指令不是 esptool.py cmd... 而是 esptool cmd... 即可;另外rshell 在 >= python 3.10 的时候出错解决方法可以查看:  已于2022年发布的: 第二章:修复rshell在python3.10出错 免费内容: https://edu.csdn.net/course/detail/29666 micropython语法和python3一样,编写起来非常方便。如果你快速入门单片机玩物联网而且像轻松实现各种功能,那绝力推荐使用micropython。方便易懂易学。 同时如果你懂C语音,也可以用C写好函数并编译进micropython固件里然后进入micropython调用(非必须)。 能通过WIFI联网(2.1章),也能通过sim卡使用2G/3G/4G/5G联网(4.5章)。 为实现语音控制,本教程会教大家使用tensorflow利用神经网络训练自己的语音模型并应用。为实现通过网页控制,本教程会教大家linux(debian10 nginx->uwsgi->python3->postgresql)网站前后台入门。为记录单片机传输过来的数据, 本教程会教大家入门数据库。  本教程会通过通俗易懂的比喻来讲解各种原理与思路,并手把手编写程序来实现各项功能。 本教程micropython版本是 2019年6月发布的1.11; 更多内容请看视频列表。  学习这门课程之前你需要至少掌握: 1: python3基础(变量, 循环, 函数, 常用库, 常用方法)。 本视频使用到的零件与淘宝上大致价格:     1: 超声波传感器(3)     2: MAX9814麦克风放大模块(8)     3: DHT22(15)     4: LED(0.1)     5: 8路5V低电平触发继电器(12)     6: HX1838红外接收模块(2)     7:红外发射管(0.1),HX1838红外接收板(1)     other: 电表, 排线, 面包板(2)*2,ESP32(28)  
您好!要将ESP32-C3与INMP441麦克风模块连接,您可以按照以下步骤进行操作: 1. 首先,了解INMP441模块的引脚定义。INMP441通常具有以下引脚: - VIN:电源输入(一般为3.3V) - GND:地线连接 - SDA:I2C数据线 - SCL:I2C时钟线 - LRCL:左/右声道选择引脚 - BCLK:位时钟引脚 - DOUT:数字输出引脚 - CLKSEL:时钟选择引脚 2. 在ESP32-C3上选择适当的GPIO引脚来连接至INMP441。您可以根据您的需求选择合适的引脚,确保不会与其他功能冲突。 3. 连接VCC引脚:将INMP441的VIN引脚连接ESP32-C3的3.3V电源引脚。 4. 连接GND引脚:将INMP441的GND引脚连接ESP32-C3的地线引脚。 5. 连接SDA和SCL引脚:将INMP441的SDA引脚连接ESP32-C3的I2C数据引脚,将SCL引脚连接ESP32-C3的I2C时钟引脚。确保在连接之前,您已经启用了ESP32-C3上的I2C功能。 6. (可选)连接LRCL、BCLK和DOUT引脚:如果您需要使用INMP441的音频输出功能,您可以连接LRCL、BCLK和DOUT引脚到适当的ESP32-C3引脚。这些引脚通常与I2S功能一起使用。 7. (可选)连接CLKSEL引脚:如果您需要更改INMP441的时钟源,您可以连接CLKSEL引脚到适当的ESP32-C3引脚。根据INMP441的规格书,选择正确的引脚以进行时钟选择。 请注意,具体的引脚连接可能会因您的硬件需求而有所不同。请参考ESP32-C3和INMP441的引脚定义和规格书以确保正确地连接它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值