ESP-C3入门11. 创建最基本的HTTP请求
ESP-C3入门11. 创建最基本的HTTP请求
- 一、menuconfig配置
- 二、配置 CMakeLists
- 1. 设置项目的额外组件目录
- 2. 设置头文件搜索目录
- 三、在 ESP32 上执行 HTTP 请求的基本步骤
- 1. 创建 TCP 连接
- 2. 设置 HTTP 请求
- 3. 发送 HTTP 请求
- 4. 接收 HTTP 响应
- 5. 处理 HTTP 响应
- 6. 关闭 TCP 连接
- 三、示例
- 1. http_request.h
- 2. http_request.c
- http_request_send
- esp_http_client_config_t 结构体
- esp_http_client_init() 函数
- esp_http_client_perform() 函数
- esp_http_client_cleanup() 函数
官网文档:
https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/protocols/esp_http_client.html
一、menuconfig配置
打开ESP-IDF 4.4 CMD命令窗口,进入项目,运行: idf.py menuconfig,打开配置窗口:

选择 Component config- ESP HTTP client菜单:

钩选:

保存设置到自己项目:

二、配置 CMakeLists
1. 设置项目的额外组件目录
# 设置项目的额外组件目录,允许使用ESP-IDF示例中的公共组件。
set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/components)
2. 设置头文件搜索目录
CMakeLists.h 中要包含 esp_http_client的头文件位置:
# 设置项目的包含目录,这些是要搜索头文件的目录
set(INCLUDE_DIRS${INCLUDE_DIRS}${CMAKE_CURRENT_SOURCE_DIR}${IDF_PATH}/components/esp_http_client/include)
include_directories(${INCLUDE_DIRS})
这样就能使用 esp_http_client了。
三、在 ESP32 上执行 HTTP 请求的基本步骤
在 ESP32 上进行 HTTP 请求需要使用 TCP/IP 套接字和 HTTP 库来实现。
ESP32 IDF的esp_http_client 库提供了一组易于使用的 API,可以自动处理 HTTP 头和响应内容。
1. 创建 TCP 连接
使用 tcpip_adapter 和 lwip 库创建一个 TCP 连接。可以使用 lwip 库提供的函数(如 tcp_new() 和 tcp_connect())来创建和连接套接字。
2. 设置 HTTP 请求
使用 HTTP 协议创建一个请求消息。请求消息包括 HTTP 方法(如 GET、POST 等)和请求的 URL,以及一些 HTTP 头部(如 Content-Type、Content-Length 等)和负载数据(如果有的话)。
3. 发送 HTTP 请求
使用 lwip 库提供的 tcp_write() 函数将请求消息发送到服务器。
4. 接收 HTTP 响应
使用 lwip 库提供的 tcp_recv() 函数从服务器接收响应消息。通常,响应消息由一个或多个 TCP 数据包组成,因此需要在接收数据时进行缓冲区处理。
5. 处理 HTTP 响应
对响应消息进行处理,例如解析响应头、解码响应正文、处理错误码等。
6. 关闭 TCP 连接
使用 lwip 库提供的 tcp_close() 函数关闭 TCP 连接。
三、示例
1. http_request.h
#ifndef HTTP_REQUEST_H
#define HTTP_REQUEST_H
#include "esp_http_client.h"
#define HTTP_URL "http://www.example.com"
esp_err_t http_event_handler(esp_http_client_event_t *evt);
void request(const char* url);
#endif
2. http_request.c
#include <esp_err.h>
#include <esp_log.h>
#include "network/include/http_request.h"static const char *TAG = "HTTP_REQUEST";
#define MAX_HTTP_OUTPUT_BUFFER 2048// HTTP 请求的处理函数
esp_err_t http_event_handler(esp_http_client_event_t *evt)
{// 缓存http响应的bufferstatic char *output_buffer;// 已经读取的字节数static int output_len;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)) {// 如果配置了user_data buffer,则把响应复制到该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_LOGD(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");if (output_buffer != NULL) {free(output_buffer);output_buffer = NULL;}output_len = 0;break;}return ESP_OK;
}void request(const char *url) {// 响应结果放在这里char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};// 创建一个 HTTP 客户端配置esp_http_client_config_t config = {.method = HTTP_METHOD_GET,.url = url,.event_handler = http_event_handler,.user_data = local_response_buffer,.disable_auto_redirect = true,};// 创建一个 HTTP 客户端并执行 GET 请求esp_http_client_handle_t client = esp_http_client_init(&config);esp_err_t err = esp_http_client_perform(client);// 检查请求是否成功if (err == ESP_OK) {int len = esp_http_client_get_content_length(client);ESP_LOGI(TAG, "Status = %d, content_length = %d",esp_http_client_get_status_code(client),//状态码len);//数据长度} else {printf("HTTP GET request failed: %s\n", esp_err_to_name(err));}printf("Response: %.*s\n", strlen(local_response_buffer), local_response_buffer);//断开并释放资源esp_http_client_cleanup(client);
}
主要函数说明:
http_request_send
用于发送 HTTP 请求的函数 ,该函数接受一个 http_request_t 类型的指针作为参数,其中包含了 HTTP 请求的 URL、请求方法、请求头以及 POST 数据。在
esp_http_client_config_t 结构体
用于配置 HTTP 客户端的参数,包括 URL、请求方法和事件处理函数。然后,根据请求中是否包含请求头和 POST 数据来设置 HTTP 客户端的相应参数。
esp_http_client_init() 函数
用来创建一个 HTTP 客户端句柄。
esp_http_client_perform() 函数
发送 HTTP 请求。
esp_http_client_cleanup() 函数
释放 HTTP 客户端句柄。
相关文章:
ESP-C3入门11. 创建最基本的HTTP请求
ESP-C3入门11. 创建最基本的HTTP请求一、menuconfig配置二、配置 CMakeLists1. 设置项目的额外组件目录2. 设置头文件搜索目录三、在 ESP32 上执行 HTTP 请求的基本步骤1. 创建 TCP 连接2. 设置 HTTP 请求3. 发送 HTTP 请求4. 接收 HTTP 响应5. 处理 HTTP 响应6. 关闭 TCP 连接…...
K8S+Jenkins+Harbor+Docker+gitlab集群部署
K8SJenkinsHarborDockergitlab服务器集群部署 目录K8SJenkinsHarborDockergitlab服务器集群部署1.准备以下服务器2.所有服务器统一处理执行2.1 关闭防火墙2.2 关闭selinux2.3 关闭swap(k8s禁止虚拟内存以提高性能)2.4 更新yum (看需要更新)2.5 时间同步2…...
看见统计——第四章 统计推断:频率学派
看见统计——第四章 统计推断:频率学派 接下来三节的主题是中心极限定理的应用。在不了解随机变量序列 {Xi}\{X_i\}{Xi} 的潜在分布的情况下,对于大样本量,中心极限定理给出了关于样本均值的声明。例如,如果 YYY 是一个 N(0&am…...
2023年2月访问学者博士后热门国家出入境政策变化汇总
近期关于出国的咨询量日益增多,出入境政策也是其中之一。所以本期知识人网小编汇总了最新访问学者和博士后关注的热门国家及地区入境政策变化,提供给大家。目前各国入境政策大致分为三种:一、 无法入境的国家如:摩洛哥、朝鲜等。二…...
“离开浪浪山”是假象,80%年轻人下班后还在学习,真实是想先上个山。
最近,又有一个关于年轻人与职场的新词横空出世—— 浪浪山。 什么是浪浪山? 每个人心中都有一座浪浪山。 浪浪山,其实是人生的一种状态,步入社会时满腔热血,然而很快就被现实给修理了一顿;想要辞职不干出去…...
Kotlin 33. CompileSdkVersion 和 targetSdkVersion 有什么区别?
CompileSdkVersion 和 targetSdkVersion 有什么区别? 在 build.gradle (Module) 文件中,我们通常会看到 CompileSdkVersion 和 targetSdkVersion 的使用,比如下面是一个完整的 build.gradle (Module) 文件: plugins {id com.and…...
实用调试技巧——“C”
各位CSDN的uu们你们好呀,今天小雅兰的内容是实用调试技巧,其实小雅兰一开始,也不知道调试到底是什么,一遇到问题,首先就是观察程序,改改这里改改那里,最后导致bug越修越多,或者是问别…...
JavaScript - 函数
文章目录一、箭头函数二、函数名三、理解参数3.1 箭头函数中的参数四、没有重载五、默认参数值5.1 默认参数作用域与暂时性死区六、参数扩展与收集6.1 扩展参数6.2 收集参数七、函数声明与函数表达式八、函数作为值九、函数内部9.1 arguments9.2 this9.3 caller9.4 new.target十…...
Cesium 卫星轨迹、卫星通信、卫星过境,模拟数据传输。
起因:看了cesium官网卫星通信示例发现只有cmzl版本的,决定自己动手写一个。欢迎大家一起探讨,评论留言。 效果 全部代码在最后 起步 寻找卫星轨迹数据,在网站space-track上找的,自己注册账号QQ邮箱即可。 卫星轨道类…...
2023年湖北中级职称(工程类建筑类)报名条件和要求是什么?
2023年湖北中级职称(工程类建筑类)报名条件和要求是什么? 中级职称分为计算机类、医药类、卫生类、教师类、工程类、经济类等各大类,今天主要就是跟大家说一下工程类中级职称评审的一个条件和要求,这也是评职称人员应该…...
socket编程复习
再次用到socket编程,将socket相关的知识点做了简单整理,根据网络上大家的整理,又做了一些调整和汇总。 API列表 sokect常见的API大致有列表里面这么多,不同平台的实现可能有些微的差别,下面对常用API的参数和用法做了…...
深度学习神经网络基础知识(三)前向传播,反向传播和计算图
专栏:神经网络复现目录 深度学习神经网络基础知识(三) 本文讲述神经网络基础知识,具体细节讲述前向传播,反向传播和计算图,同时讲解神经网络优化方法:权重衰减,Dropout等方法,最后进行Kaggle实…...
一图说明 monorepo 落地流程方案
关于 monorepo 初次讨论已有2年载,目前团队已经沉淀了成熟的技术方案且经受住了实战考验。所以特梳理相关如下: 也算是关于之前发起的 monorepo–依赖 的解答篇。 上图为目前团队贡献的主流程:① 本地开发 > ② 提交Git仓库 > ③ 触发…...
SAP ABAP WRITE语法大全
列表是ABAP/4报表程序数据的输出媒介。每个ABAP/4报表程序将其输出数据传递到直接与该程序连接的列表中。每个程序最多生成21个列表:1个基本列表和20个辅助列表。 将数据写入列表的基本ABAP/4语句是WRITE、SKIP和ULINE输出语句。 一、标准列表结构 (1&…...
微信小程序自定义全局组件showModal
开发过程中微信提供的showmodal样式不符合ui风格,又不想写成组件用的页面都引入,就考虑模拟showmodal写一个自定义的弹框组件 一,在components中新建一个navModal组件 navModal.wxml <view class="modal_mask" hidden={{hidden}}><view class="mo…...
4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|考试知识点
《无线传感器网络原理及方法》第1章无线传感器网络概述1.1无线传感器网络的基本概念1.2无线传感器网络的特征1.2.1与现有无线网络的区别1.2.2与现场总线的区别1.2.3传感器节点的限制1.2.4传感器组网的特点1.3无线传感器网络的关键性能指标1.4无线传感器网络的应用1.5无线传感器…...
startForegroundService与startService 使用浅析
一. 了解服务(Service)的概念 service是安卓开发中一个很重要组件,意为“服务”。与我们常见的activity不同,“服务”是默默的在背后进行工作的,通常,它用于在后台为我们执行一些耗时,或者需要…...
django项目实战三(django+bootstrap实现增删改查)进阶分页
目录 一、分页 1、修改case_list.html页面 2、修改views.py的case_list方法(分页未封装) 二、分页封装 1、新建类Pagination 2、修改views.py的case_list方法 三、再优化,实现搜索分页qing情况 四、优化其他查询页面实现分页和查询 五…...
Python 之 Pandas DataFrame 数据类型的简介、创建的列操作
文章目录一、DataFrame 结构简介二、DataFrame 对象创建1. 使用普通列表创建2. 使用嵌套列表创建3 指定数值元素的数据类型为 float4. 字典嵌套列表创建5. 添加自定义的行标签6. 列表嵌套字典创建 DataFrame 对象7. Series 创建 DataFrame 对象三、DataFrame 列操作1. 选取数据…...
华为OD机试真题Python实现【5键键盘的输出】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述:示例1:示例2:解题思路代码实现运行结果:版权说明:题目...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
