【史上最全面ESP32教程】http通信
文章目录
- 前言
- HTTP协议是什么?
- HTTP协议的特点
- HTTP协议的常见应用
- esp32 使用http通信
- 通信流程
- 基础使用
- HTTPClient 常用的函数
- 函数介绍:
- `void end(void);`
- `bool connected(void);`
- `void setReuse(bool reuse);`
- `void setUserAgent(const String& userAgent);`
- `void setAuthorization(const char * user, const char * password);`
- `int GET();`
- `String getString(void);`
- `int PATCH(uint8_t * payload, size_t size);`
- `int PATCH(String payload);`
- `int POST(uint8_t * payload, size_t size);`
- `int POST(String payload);`
- `int PUT(uint8_t * payload, size_t size);`
- `int PUT(String payload);`
- `int sendRequest(const char * type, String payload);`
- `void addHeader(const String& name, const String& value, bool first = false, bool replace = true);`
- `void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);`
- `String header(const char* name);`
- `String header(size_t i);`
- `String headerName(size_t i);`
- `int headers();`
- `bool hasHeader(const char* name);`
- `int getSize(void);`
- `const String &getLocation(void);`
- `WiFiClient& getStream(void);`
- `WiFiClient* getStreamPtr(void);`
- `int writeToStream(Stream* stream);`
- `String getString(void);`
- `static String errorToString(int error);`
- `void setCookieJar(CookieJar* cookieJar);`
- `void resetCookieJar();`
- `void clearAllCookies();`
- 总结
前言
随着物联网(IoT)的快速发展,ESP32作为一款高性能、低功耗的Wi-Fi和蓝牙双模芯片,受到了广泛的关注和应用。在物联网设备中,HTTP协议是实现设备与服务器之间通信的常用协议。本文将介绍HTTP协议的基本概念及其常见应用场景。
HTTP协议是什么?
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于传输超文本的应用层协议。它是万维网(WWW)的基础,定义了客户端(如浏览器)与服务器之间的通信规则。HTTP协议采用请求-响应模式,客户端发送请求,服务器返回响应。
HTTP协议的特点
- 无状态:每次请求都是独立的,服务器不会保留之前请求的状态。
- 灵活性:支持多种数据格式,如HTML、JSON、XML等。
- 简单性:易于实现和使用,广泛应用于Web开发。
HTTP协议的常见应用
- Web浏览:浏览器通过HTTP协议请求网页内容,服务器返回HTML页面。
- API通信:物联网设备通过HTTP协议与服务器进行数据交互,如上传传感器数据或获取控制指令。
- 文件传输:通过HTTP协议下载或上传文件,如软件更新或日志文件。
esp32 使用http通信
通信流程
- 连接网络
- 开始http通信
- 发送请求并获取响应
- 关闭连接
基础使用
我们需要使用HTTPClient类来进行通信
如果我们要开启一个http通信使用下面这个函数,参数为你要http通信的url:
bool begin(String url);
如果我们要GET一个内容,我们可以使用下面这个函数:
int GET();
他的返回值为状态码。
状态码有下面这些取值:
- 200 OK:请求成功。具体的含义取决于HTTP方法。例如,GET方法表示资源已被获取并在消息体中传输。
- 201 Created:请求成功,并且新的资源已经作为结果创建。这通常是在POST请求或某些PUT请求后发送的响应。
- 204 No Content:没有要发送的内容,但头部可能有用。用户代理可能会使用新的头部更新此资源的缓存头部。
- 301 Moved Permanently:请求的URL已永久移动到新位置,并且将来的引用应使用新的URL。
- 400 Bad Request:服务器无法理解请求的语法。
- 401 Unauthorized:请求需要用户验证。
- 403 Forbidden:服务器理解请求,但拒绝执行它。
- 404 Not Found:服务器找不到请求的资源。
- 500 Internal Server Error:服务器遇到错误,无法完成请求
我们可以通过下面这个函数来获取GET的返回值:
String getString(void);
我们可以使用下面这个函数来关闭http连接:
void end(void);
#include <WiFi.h>
#include <HTTPClient.h>const char* ssid = "......."; // WiFi网络名称
const char* password = "......."; // WiFi网络密码void setup() {Serial.begin(115200); // 初始化串口通信// 连接到WiFi网络WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(1000);Serial.println("Connecting to WiFi...");}Serial.println("Connected to WiFi");// 设置HTTPClient对象HTTPClient http;// 为GET请求设置目标URLString url = "http://example.com/api/data"; // 替换为你的目标URL// 发送GET请求http.begin(url);// 发送请求并获取响应int httpResponseCode = http.GET();if (httpResponseCode > 0) { // 如果收到响应Serial.print("HTTP Response code: ");Serial.println(httpResponseCode); // 打印响应代码String payload = http.getString(); // 获取响应内容Serial.println(payload); // 打印响应内容} else {Serial.print("Error code: ");Serial.println(httpResponseCode); // 打印错误代码}http.end(); // 关闭连接
}void loop() {// 程序主循环,此处不需要添加其他代码
}
HTTPClient 常用的函数
函数介绍:
void end(void);
- 函数原型:
void end(void); - 函数作用: 关闭HTTPClient对象,释放资源。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); // 处理响应 http.end(); // 关闭HTTP连接
bool connected(void);
- 函数原型:
bool connected(void); - 函数作用: 检查HTTPClient对象是否已连接到服务器。
- 函数参数: 无。
- 返回值的作用: 返回
true表示连接成功,返回false表示未连接或连接已断开。 - 示例代码:
HTTPClient http; if (http.connected()) {// 执行请求操作 } else {// 重新连接或处理断开连接情况 }
void setReuse(bool reuse);
- 函数原型:
void setReuse(bool reuse); - 函数作用: 设置是否启用HTTP keep-alive功能,允许多次复用同一TCP连接。
- 函数参数:
reuse:布尔值,true表示启用keep-alive,false表示禁用。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setReuse(true); // 启用keep-alive
void setUserAgent(const String& userAgent);
- 函数原型:
void setUserAgent(const String& userAgent); - 函数作用: 设置HTTP请求的用户代理(User-Agent)标头。
- 函数参数:
userAgent:String类型,要设置的用户代理字符串。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setUserAgent("ESP32 Client");
void setAuthorization(const char * user, const char * password);
- 函数原型:
void setAuthorization(const char * user, const char * password); - 函数作用: 设置基本身份验证的用户名和密码。
- 函数参数:
user:用户名字符串。password:密码字符串。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.setAuthorization("username", "password");
int GET();
- 函数原型:
int GET(); - 函数作用: 发送HTTP GET请求并接收响应。
- 函数参数: 无。
- 返回值的作用: 返回HTTP响应状态代码(例如200表示成功)。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); // 处理响应
String getString(void);
- 函数原型:
String getString(void); - 函数作用: 获取HTTP响应的正文内容。
- 函数参数: 无。
- 返回值的作用: 返回包含HTTP响应正文内容的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (httpResponseCode > 0) {String response = http.getString();Serial.println(response); }
int PATCH(uint8_t * payload, size_t size);
- 函数原型:
int PATCH(uint8_t * payload, size_t size); - 函数作用: 发送HTTP PATCH请求并附带数据。
- 函数参数:
payload:指向要发送数据的字节数组的指针。size:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.PATCH(data, sizeof(data));
int PATCH(String payload);
- 函数原型:
int PATCH(String payload); - 函数作用: 发送HTTP PATCH请求并附带数据(字符串形式)。
- 函数参数:
payload:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.PATCH(data);
int POST(uint8_t * payload, size_t size);
- 函数原型:
int POST(uint8_t * payload, size_t size); - 函数作用: 发送HTTP POST请求并附带数据。
- 函数参数:
payload:指向要发送数据的字节数组的指针。size:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.POST(data, sizeof(data));
int POST(String payload);
- 函数原型:
int POST(String payload); - 函数作用: 发送HTTP POST请求并附带数据(字符串形式)。
- 函数参数:
payload:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.POST(data);
int PUT(uint8_t * payload, size_t size);
- 函数原型:
int PUT(uint8_t * payload, size_t size); - 函数作用: 发送HTTP PUT请求并附带数据。
- 函数参数:
payload:指向要发送数据的字节数组的指针。size:要发送数据的大小(字节数)。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; uint8_t data[] = { 0x01, 0x02, 0x03 }; int httpResponseCode = http.PUT(data, sizeof(data));
int PUT(String payload);
- 函数原型:
int PUT(String payload); - 函数作用: 发送HTTP PUT请求并附带数据(字符串形式)。
- 函数参数:
payload:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; String data = "key=value"; int httpResponseCode = http.PUT(data);
int sendRequest(const char * type, String payload);
- 函数原型:
int sendRequest(const char * type, String payload); - 函数作用: 发送自定义类型的HTTP请求,并附带数据(字符串形式)。
- 函数参数:
type:HTTP请求类型,例如 “GET”, “POST”, “PUT” 等。payload:要发送的数据字符串。
- 返回值的作用: 返回HTTP响应状态代码。
- 示例代码:
HTTPClient http; int httpResponseCode = http.sendRequest("POST", "key=value");
void addHeader(const String& name, const String& value, bool first = false, bool replace = true);
- 函数原型:
void addHeader(const String& name, const String& value, bool first = false, bool replace = true); - 函数作用: 添加HTTP请求头。
- 函数参数:
name:头部字段的名称。value:头部字段的值。first:可选参数,默认为false。如果为true,则将新头部添加到头部列表的开头。replace:可选参数,默认为true。如果为true,则替换现有的同名头部;如果为false,则添加到现有同名头部后面。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.addHeader("Content-Type", "application/json");
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
- 函数原型:
void collectHeaders(const char* headerKeys[], const size_t headerKeysCount); - 函数作用: 指定要收集的HTTP响应头。
- 函数参数:
headerKeys:指向包含要收集的头部字段名称的数组。headerKeysCount:数组中头部字段名称的数量。
- 返回值的作用: 无返回值。
- 示例代码:
const char* headersToCollect[] = { "Content-Length", "Content-Type" }; HTTPClient http; http.collectHeaders(headersToCollect, sizeof(headersToCollect) / sizeof(headersToCollect[0]));
String header(const char* name);
- 函数原型:
String header(const char* name); - 函数作用: 获取指定名称的HTTP响应头值。
- 函数参数:
name:要获取的头部字段名称。
- 返回值的作用: 返回包含头部字段值的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String contentType = http.header("Content-Type");
String header(size_t i);
- 函数原型:
String header(size_t i); - 函数作用: 获取指定索引位置的HTTP响应头值。
- 函数参数:
i:要获取的头部字段的索引(从0开始)。
- 返回值的作用: 返回包含头部字段值的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String firstHeader = http.header(0);
String headerName(size_t i);
- 函数原型:
String headerName(size_t i); - 函数作用: 获取指定索引位置的HTTP响应头名称。
- 函数参数:
i:要获取的头部字段的索引(从0开始)。
- 返回值的作用: 返回包含头部字段名称的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String firstName = http.headerName(0);
int headers();
- 函数原型:
int headers(); - 函数作用: 获取HTTP响应中头部字段的数量。
- 函数参数: 无。
- 返回值的作用: 返回头部字段的数量。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); int numHeaders = http.headers();
bool hasHeader(const char* name);
- 函数原型:
bool hasHeader(const char* name); - 函数作用: 检查HTTP响应中是否存在指定名称的头部字段。
- 函数参数:
name:要检查
的头部字段名称。
- 返回值的作用: 如果存在指定名称的头部字段,则返回
true;否则返回false。 - 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (http.hasHeader("Content-Type")) {// 处理存在Content-Type头部的情况 }
int getSize(void);
- 函数原型:
int getSize(void); - 函数作用: 获取HTTP响应正文的大小(字节数)。
- 函数参数: 无。
- 返回值的作用: 返回HTTP响应正文的大小。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); int contentSize = http.getSize();
const String &getLocation(void);
- 函数原型:
const String &getLocation(void); - 函数作用: 获取HTTP响应中的
Location头部字段的值,用于处理重定向。 - 函数参数: 无。
- 返回值的作用: 返回包含
Location头部字段值的String对象的引用。 - 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String redirectLocation = http.getLocation();
WiFiClient& getStream(void);
- 函数原型:
WiFiClient& getStream(void); - 函数作用: 获取底层的WiFiClient对象,用于直接访问底层网络连接。
- 函数参数: 无。
- 返回值的作用: 返回一个WiFiClient对象的引用。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient& stream = http.getStream();
WiFiClient* getStreamPtr(void);
- 函数原型:
WiFiClient* getStreamPtr(void); - 函数作用: 获取底层的WiFiClient对象指针,用于直接访问底层网络连接。
- 函数参数: 无。
- 返回值的作用: 返回一个指向WiFiClient对象的指针。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient* streamPtr = http.getStreamPtr();
int writeToStream(Stream* stream);
- 函数原型:
int writeToStream(Stream* stream); - 函数作用: 将HTTP响应内容写入给定的流(Stream)对象。
- 函数参数:
stream:指向目标流对象的指针。
- 返回值的作用: 返回写入流的字节数。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); WiFiClient client; int bytesWritten = http.writeToStream(&client);
String getString(void);
- 函数原型:
String getString(void); - 函数作用: 获取HTTP响应的正文内容。
- 函数参数: 无。
- 返回值的作用: 返回包含HTTP响应正文内容的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); String response = http.getString();
static String errorToString(int error);
- 函数原型:
static String errorToString(int error); - 函数作用: 将HTTPClient库中的错误代码转换为对应的错误消息字符串。
- 函数参数:
error:HTTPClient库中定义的错误代码。
- 返回值的作用: 返回表示错误消息的String对象。
- 示例代码:
HTTPClient http; http.begin("http://example.com/api/data"); int httpResponseCode = http.GET(); if (httpResponseCode < 0) {String errorMessage = HTTPClient::errorToString(httpResponseCode);Serial.println(errorMessage); }
void setCookieJar(CookieJar* cookieJar);
- 函数原型:
void setCookieJar(CookieJar* cookieJar); - 函数作用: 设置用于管理HTTP请求和响应中Cookie的CookieJar对象。
- 函数参数:
cookieJar:指向CookieJar对象的指针。
- 返回值的作用: 无返回值。
- 示例代码:
CookieJar cookieJar; HTTPClient http; http.setCookieJar(&cookieJar);
void resetCookieJar();
- 函数原型:
void resetCookieJar(); - 函数作用: 重置CookieJar,清除所有保存的Cookie。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.resetCookieJar();
void clearAllCookies();
- 函数原型:
void clearAllCookies(); - 函数作用: 清除所有保存的Cookie,无论它们是否过期。
- 函数参数: 无。
- 返回值的作用: 无返回值。
- 示例代码:
HTTPClient http; http.clearAllCookies();
总结
本文简要介绍了HTTP协议的基本概念及其在物联网设备中的常见应用。HTTP协议作为一种简单、灵活的通信协议,广泛应用于Web开发和物联网设备中。希望本文能帮助读者更好地理解HTTP协议及其在ESP32中的应用。
相关文章:
【史上最全面ESP32教程】http通信
文章目录 前言HTTP协议是什么?HTTP协议的特点HTTP协议的常见应用 esp32 使用http通信通信流程基础使用HTTPClient 常用的函数函数介绍:void end(void);bool connected(void);void setReuse(bool reuse);void setUserAgent(const String& userAgent);…...
*算法训练(leetcode)第二十七天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树
刷题记录 56. 合并区间*738. 单调递增的数字*968. 监控二叉树 56. 合并区间 leetcode题目地址 排序后遇到有重合的区间选择最大的区间保存即可,结果集中保存的是离当前区间最近的区间,因此使用当前区间与结果集中的最后一个集合比较查看是否有重合&…...
OpenJudge 奇数求和
目录 描述思路样例输入样例输出CodeCC 总时间限制: 1000ms 内存限制: 65536kB 描述 计算非负整数 m 到 n(包括m 和 n )之间的所有奇数的和,其中,m 不大于 n,且n 不大于300。例如 m3, n12, 其和则为:357911…...
【排序 - 快速排序】
快速排序(Quick Sort)是一种高效的排序算法,它基于分治(Divide and Conquer)的策略。这种排序算法的核心思想是选择一个基准元素,将数组分割成两部分,使得左边的元素都小于等于基准元素…...
pytest使用报错(以及解决pytest所谓的“抑制print输出”)
1. 测试类的类名问题 #codingutf-8import pytestclass TestClass1:def setup(self) -> None:print(setup)def test_01(self) -> None:print(test_01111111111111111111111)def test_02(self) -> None:print(test_02)以上述代码为例,如果类名是Test开头&am…...
开源项目编译harbor arm架构的包 —— 筑梦之路
GitHub - amy5200/harbor-arm64 先做个记录,空了再验证...
[笔记] SKF Enveloping FAQ 用户指南
文档编号:Application Note CM3013 1.名词解释: 1.1cavitationWhat Is Cavitation? | Pumps & Systems 叶片在液体中扰动形成的超声波 1.2 stiff machinehttps://suspensionlist.com/the-pros-and-cons-of-stiff-vs-soft-suspension-systems/ …...
宪法学学习笔记(个人向) Part.3
宪法学学习笔记(个人向) Part 3 3. 国家基本制度 3.1 国家性质 3.1.1 国家性质概述 国家性质的概念 国家性质也称国体,或国家的阶级本质,是指各个阶级在国家中的地位(哪个阶层是统治阶层,哪个阶层是被统治阶层,哪个…...
联想拯救者Y7000 IRX9 笔记本接口功能介绍
适用机型:Legion Y7000 IRX9; 83JJ; USB(3.2 Gen 1)Type-接口摄像头开关组合音频插孔 多用于USB Type-C接口 以太网接口 多用途USB Type-C接口(支持USB Power Delivery)HDMI接口USB(3.2 Gen 1&…...
【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网
SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候,我们用的是代码里面固定的SSID和密码去连接热点,但实际应用中不可能这么弄,我们得有办法把家里的WiFi SSID和密码输入到设备里面去,对于带屏带输入设备还…...
MD5加密和注册页面的编写
MD5加密 1.导入包 npm install --save ts-md5 2.使用方式 import { Md5 } from ts-md5; //md5加密后的密码 const md5PwdMd5.hashStr("123456").toUpperCase(); 遇见的问题及用到的技术 注册页面 register.vue代码 <template><div class"wappe…...
【Android组件】封装加载弹框
📖封装加载弹框 ✅1. 构造LoadingDialog✅2. 调用LoadingDialog 效果: ✅1. 构造LoadingDialog 构造LoadingDialog类涉及到设计模式中的建造者模式,进行链式调用,注重的是构建的过程,设置需要的属性。 步骤一&#x…...
Spring源码二十:Bean实例化流程三
上一篇Spring源码十九:Bean实例化流程二中,我们主要讨论了单例Bean创建对象的主要方法getSingleton了解到了他的核心流程无非是:通过一个简单工厂的getObject方法来实例化bean,当然spring在实例化前后提供了扩展如:bef…...
前端导出文件时,后端代码出错如何将错误信息返回给前端展示
功能说明:前端导出excel时,后端出现异常,比如sql异常,或者创建excel时出现的异常,希望将这些异常信息返回给前端查看。 框架:vue3 axios Springboot 实现难度分析:前端导出excel,…...
解决Spring Boot应用中的内存优化问题
解决Spring Boot应用中的内存优化问题 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. Spring Boot应用的内存管理 在开发和部署Spring Boot应用时,有效地管理内存是确保应用性能和稳…...
shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中
文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…...
响应式设计的双璧:WebKit 支持 CSS Flexbox 和 Grid 布局深度解析
响应式设计的双璧:WebKit 支持 CSS Flexbox 和 Grid 布局深度解析 在现代网页设计中,响应式布局是实现跨设备兼容性的关键。CSS Flexbox 和 Grid 作为 CSS 布局的两大支柱,提供了强大的工具来构建灵活和复杂的用户界面。WebKit,作…...
Linux软件包管理
一、软件包管理 1.什么是软件包 一般在window系统的.exe是软件按转包 2.linux系统下的软件包安装方式 PRM 软件包安装 软件名称.rpmYUM 包管理工具 yum intall 软件名称 -y源码安装 下载源代码---编译---安装 很麻烦,稳定 3.二进制软件包 二进制 4.获取*.rpm…...
如何分辨AI生成的内容?AI生成内容检测工具对比实验
检测人工智能生成的文本对各个领域的组织都提出了挑战,包括学术界和新闻界等。生成式AI与大语言模型根据短描述来进行内容生成的能力,产生了一个问题:这篇文章/内容/作业/图像到底是由人类创作的,还是AI创作的?虽然 LL…...
Clion中怎么切换不同的程序运行
如下图,比如这个文件夹下面有那么多的项目: 那么我想切换不同的项目运行怎么办呢?如果想通过下图的Edit Configurations来设置是不行的: 解决办法: 如下图,选中项目的CMakeLists.txt,右键再点击…...
高效解决付费墙难题:Bypass Paywalls Clean实用技术指南
高效解决付费墙难题:Bypass Paywalls Clean实用技术指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字信息时代,付费墙已成为获取优质内容的主要障碍&…...
瑞萨RA6E2评估板Keil MDK5开发全攻略:从RA Smart Configurator到烧录调试
瑞萨RA6E2评估板Keil MDK5开发全流程实战指南 对于嵌入式开发者而言,瑞萨RA6E2系列MCU凭借其高性能和丰富外设正成为工业控制、物联网终端设备的优选方案。而Keil MDK5作为Arm生态中最成熟的开发环境之一,与瑞萨官方工具链的深度整合为开发者提供了高效…...
M9A智能助手:《重返未来:1999》自动化管理解决方案
M9A智能助手:《重返未来:1999》自动化管理解决方案 【免费下载链接】M9A 1999 小助手 项目地址: https://gitcode.com/gh_mirrors/m9/M9A 玩家在《重返未来:1999》中常面临日常任务繁琐、资源管理复杂、多账号操作效率低等问题。M9A智…...
抖音视频批量下载:从零掌握双版本工具的完整实战指南
抖音视频批量下载:从零掌握双版本工具的完整实战指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在短视频内容日益丰富的今天,如何高效批量下载抖音视频成为许多内容创作者和研究…...
Logisim实战:从零到一构建MIPS32控制器核心模块
1. 初识MIPS32控制器设计 第一次接触MIPS32控制器设计时,我完全被那些密密麻麻的电路图和晦涩的指令格式搞懵了。记得当时在头歌平台上做实验,盯着Logisim界面整整半小时都不知道从何下手。后来才发现,理解控制器核心模块其实就像搭积木&…...
PT插件配置完全指南:从基础到进阶的全方位解决方案
PT插件配置完全指南:从基础到进阶的全方位解决方案 【免费下载链接】PT-Plugin-Plus PT 助手 Plus,为 Microsoft Edge、Google Chrome、Firefox 浏览器插件(Web Extensions),主要用于辅助下载 PT 站的种子。 项目地址…...
如何免费获取专业级多语言字体:Poppins字体完整使用秘籍
如何免费获取专业级多语言字体:Poppins字体完整使用秘籍 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins Poppins字体是一款完全开源免费的专业级几何无衬线字体&…...
告别AI瞎编代码:手把手教你用Context7 MCP给Claude/Cursor装上“实时文档库”
告别AI幻觉代码:Context7 MCP与主流开发工具深度集成实战指南 每次看到AI助手生成那些无法运行的过时代码时,你是否也感到沮丧?作为深度依赖AI编程助手的开发者,我们都经历过这样的困境:花费数小时调试一段本不该出现的…...
3步实现文件安全验证:HashCheck实战指南
3步实现文件安全验证:HashCheck实战指南 【免费下载链接】HashCheck HashCheck Shell Extension for Windows with added SHA2, SHA3, and multithreading; originally from code.kliu.org 项目地址: https://gitcode.com/gh_mirrors/ha/HashCheck 在数字化办…...
注CO2驱替煤层气THM耦合模型与自定义PDE耦合固体力学
注co2驱替煤层气THM耦合模型 自定义pde耦合固体力学今天,我来分享一下关于CO2驱替煤层气的THM(热-水-力学)耦合模型的构建过程。这个模型听起来有点复杂,但其实拆开来理解,每一步都还挺有意思的。尤其是其中涉及的自定…...
