[嵌入式系统-25]:RT-Thread -12- 内核组件编程接口 - 网络组件 - HTTP编程
目录
一、HTTP编程概述
1.1 概述
1.2 HTTP 服务器和 HTTP 客户端
二、HTTP Client
2.1 如何配置HTTP Client
2.2 HTTP Client代码实例1:socket发送http报文
2.3 HTTP Client代码实例2:httpc_xx接口收发HTTP报文
2.3.1 接口函数描述
2.3.2 代码实例:httpc_get
2.3.3 代码实例:httpc_post
2.3.4 代码实例:httpc_put
三、HTTP Server
3.1 如何配置HTTP Server
3.2 HTTP Server代码实例
一、HTTP编程概述
1.1 概述
RT-Thread 是一个开源的实时操作系统,支持 HTTP 协议的编程。在 RT-Thread 上进行 HTTP 编程可以实现设备与互联网之间的数据通信和远程控制等功能。一般来说,RT-Thread 上进行 HTTP 编程的步骤包括:
- 在 RT-Thread 上配置和初始化网络模块,确保设备可以正常连接到网络。
- 使用 RT-Thread 提供的相关 API,如 socket API 或者相关网络库,建立 HTTP 连接。
- 构建 HTTP 请求报文,包括请求方法、URL、请求头和请求体等信息。
- 发送 HTTP 请求并接收服务器返回的响应,处理响应数据。
- 根据需求处理服务器返回的数据,执行相应的逻辑操作。
- 断开 HTTP 连接,并释放相关资源。
在 RT-Thread 中进行 HTTP 编程需要了解网络编程和 HTTP 协议的相关知识,同时根据具体需求选择合适的网络库或者协议栈进行开发。通过 HTTP 编程,可以实现设备与云平台、服务器之间的数据交互,实现远程控制、数据采集和设备管理等功能。
1.2 HTTP 服务器和 HTTP 客户端
在 RT-Thread 上,你可以同时实现 HTTP 服务器和 HTTP 客户端的功能。
HTTP 服务器:
要在 RT-Thread 上实现 HTTP 服务器,你可以选择使用 RT-Thread 提供的网络库或协议栈(如 lwIP 或 NuttX),并使用相应的 API 进行开发。
- 配置和初始化网络模块,确保设备可以正常连接到网络。
- 创建并配置 HTTP 服务器实例,指定监听的端口号。
- 注册处理 HTTP 请求的回调函数,该函数会在收到客户端的请求时被调用。
- 在回调函数中,解析接收到的 HTTP 请求报文,根据请求的 URL、方法等信息确定执行的操作。
- 根据具体逻辑处理请求,并构建并发送 HTTP 响应报文给客户端。
HTTP 客户端:
要在 RT-Thread 上实现 HTTP 客户端,你同样可以选择使用 RT-Thread 提供的网络库或协议栈,并使用相应的 API 进行开发。
- 配置和初始化网络模块,确保设备可以正常连接到网络。
- 创建并配置 HTTP 客户端实例,指定目标服务器的 IP 地址和端口号。
- 构建 HTTP 请求报文,包括请求方法、URL、请求头和请求体等信息。
- 发送 HTTP 请求给目标服务器,并等待服务器返回的响应。
- 解析接收到的 HTTP 响应报文,提取需要的数据。
- 根据具体需求处理服务器返回的数据,执行相应的逻辑操作。
无论是 HTTP 服务器还是客户端,你都需要根据具体需求选择合适的网络库或协议栈,并进行相应的配置和开发工作。同时,你需要了解 HTTP 协议的相关知识,以便正确地构建和解析 HTTP 请求和响应报文。
二、HTTP Client
2.1 如何配置HTTP Client
在 RT-Thread 上配置 HTTP 客户端可以使用 RT-Thread 提供的网络库或协议栈,并通过相应的 API 进行配置和开发。下面是一个简单的配置流程:
-
确保你的 RT-Thread 配置了正确的网络模块,以便设备可以正常连接到网络。你可以在 RT-Thread 的配置文件中进行相关设置。
-
在 RT-Thread 的包管理器中安装相应的 HTTP 客户端软件包。例如,你可以使用 uAgent 或 SCons 具体库。这些库提供了 HTTP 客户端的功能和 API。
-
在 RT-Thread 的应用程序中添加相应的头文件包含和编译选项。根据你选择的 HTTP 客户端库,你需要包含相应的头文件,并在编译选项中添加相应的库依赖。
-
配置 HTTP 客户端的初始化参数,如目标服务器的 IP 地址和端口号。具体的配置方法和 API 可以根据选择的 HTTP 客户端库而有所不同。可以参考相应的文档或示例代码来进行配置。
-
构建 HTTP 请求报文,包括请求方法、URL、请求头和请求体等信息。根据需要设置请求的参数和数据。
-
使用 HTTP 客户端库提供的 API 发送 HTTP 请求给目标服务器。例如,你可以使用相应的函数来发送 GET 或 POST 请求,并等待服务器返回的响应。
-
解析接收到的 HTTP 响应报文,提取需要的数据。根据具体需求,你可以使用库提供的函数来解析和处理响应。
请注意,在配置和使用 HTTP 客户端时,你需要了解 HTTP 协议的相关知识,并参考相应的库文档和示例代码。这将帮助你正确地配置和使用 HTTP 客户端,在 RT-Thread 上与远程服务器进行数据通信。
2.2 HTTP Client代码实例1:socket发送http报文
下面是一个在 RT-Thread 上使用 HTTP 客户端组件的代码示例,它演示了如何在 RT-Thread 中进行 HTTP 请求。
#include <rtthread.h>
#include <finsh.h>
#include <lwip/sockets.h>
#include <sys/time.h>#define HTTP_CLIENT_BUFFER_SIZE 1024
#define SERVER_HOST "api.example.com"
#define SERVER_PORT 80
#define HTTP_REQUEST "GET /data HTTP/1.1\r\nHost: api.example.com\r\nConnection: close\r\n\r\n"static void http_client_thread_entry(void *parameter)
{struct sockaddr_in server_addr;int client_sock;int ret;// 创建套接字client_sock = socket(AF_INET, SOCK_STREAM, 0);if (client_sock < 0){rt_kprintf("Failed to create socket\n");goto exit;}// 设置目标服务器地址server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);server_addr.sin_addr.s_addr = inet_addr(SERVER_HOST);// 连接到服务器ret = connect(client_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){rt_kprintf("Failed to connect to server\n");goto exit;}// 发送 HTTP 请求ret = send(client_sock, HTTP_REQUEST, strlen(HTTP_REQUEST), 0);if (ret < 0){rt_kprintf("Failed to send HTTP request\n");goto exit;}// 接收并打印服务器响应char buffer[HTTP_CLIENT_BUFFER_SIZE];memset(buffer, 0, sizeof(buffer));while (1){ret = recv(client_sock, buffer, sizeof(buffer) - 1, 0);if (ret <= 0){break;}rt_kprintf("%s", buffer);memset(buffer, 0, sizeof(buffer));}exit:// 关闭套接字if (client_sock >= 0){closesocket(client_sock);}// 删除线程if (parameter != RT_NULL){rt_thread_delete(parameter);}
}/* 创建 HTTP 客户端线程 */
int http_client_example(void)
{rt_thread_t thread;thread = rt_thread_create("http_client", http_client_thread_entry, RT_NULL, 2048, 20, 10);if (thread != RT_NULL){rt_thread_startup(thread);}return RT_EOK;
}
此示例使用了 socket 函数和相关网络 API,通过创建一个套接字连接到服务器,并发送 HTTP 请求。在 http_client_thread_entry 函数中,我们首先创建一个套接字,然后设置目标服务器的地址并连接到服务器。接下来,我们发送 HTTP 请求并通过调用 recv 函数接收并打印服务器的响应。最后,我们关闭套接字并删除线程。
请注意,在实际使用中,你可能需要根据实际情况修改服务器地址、端口和 HTTP 请求。此示例仅用作参考,具体的请求格式和数据处理可能需要根据服务器的要求进行调整。
同时,如果你要在 RT-Thread 中使用 HTTP 客户端,你也可以考虑使用已经提供的 HTTP 客户端组件,如 Mongoose-Client,它可以更方便地实现 HTTP 请求和响应处理。
2.3 HTTP Client代码实例2:httpc_xx接口收发HTTP报文
2.3.1 接口函数描述
在 RT-Thread 中,HTTP 客户端(httpc)接口提供了一组函数,用于在嵌入式系统中实现 HTTP 客户端功能。通过这些接口,用户可以方便地发送 HTTP 请求并处理服务器的响应。以下是一些常用的 RT-Thread HTTP 客户端接口函数:
- httpc_init:初始化 HTTP 客户端模块,可用于初始化 HTTP 客户端数据结构和相关资源。
int httpc_init(void);
- httpc_deinit:释放 HTTP 客户端模块使用的资源,一般在不需要使用 HTTP 客户端时调用。
void httpc_deinit(void);
- httpc_get:发送 HTTP GET 请求,并获取服务器的响应数据。
int httpc_get(const char *url, struct http_client_data *client_data);
- httpc_post:发送 HTTP POST 请求,并获取服务器的响应数据。
int httpc_post(const char *url, const char *post_data, size_t post_data_len, struct http_client_data *client_data);
- httpc_put:发送 HTTP PUT 请求,并获取服务器的响应数据。
int httpc_put(const char *url, const char *put_data, size_t put_data_len, struct http_client_data *client_data);
- httpc_delete:发送 HTTP DELETE 请求,并获取服务器的响应数据。
int httpc_delete(const char *url, struct http_client_data *client_data);
- httpc_set_timeout:设置 HTTP 请求超时时间,单位为毫秒。可以在发送 HTTP 请求之前调用此函数设置超时时间。
void httpc_set_timeout(unsigned int ms);
这些函数提供了基本的 HTTP 请求功能,可以帮助嵌入式系统与远程服务器进行通信。用户可以根据需要结合实际情况选择合适的函数,并参考 RT-Thread 的文档和示例代码来进行开发。
httpc_post与httpc_put的区别
在 HTTP 协议中,POST 和 PUT 方法都用于向服务器提交数据,但它们在语义和用法上有一些区别:
POST 方法:POST 方法用于向服务器提交数据,通常用于创建新资源、提交表单数据或进行数据更新。在 HTTP 请求中,POST 请求对应的数据会被包含在请求体中,而请求的 URI 可以指向处理请求的资源的 URI 或者处理请求的服务器端程序的 URI。POST 请求通常会产生副作用,例如创建、更新或删除资源。POST 请求的主要作用是向服务器提交数据。
PUT 方法:PUT 方法用于向服务器上传指定的资源,通常用于更新或创建资源。在 HTTP 请求中,PUT 请求也会将数据包含在请求体中,但请求的 URI 应该是指向目标资源的 URI。PUT 请求被认为是幂等的,即多次相同的 PUT 请求对资源的状态不会产生变化,也就是说重复执行 PUT 请求不会对资源产生额外的影响。PUT 请求的主要作用是传输数据以更新服务器上的资源。
总结来说,POST 方法主要用于提交数据并触发服务器的特定动作,而 PUT 方法主要用于传输数据以更新或创建资源,并且 PUT 请求应该是幂等的。
在使用 RT-Thread 中的 HTTP 客户端(例如 httpc)时,你可以根据需求选择使用 POST 方法或 PUT 方法来向服务器发送数据。根据 HTTP 协议的语义,合理地选择 POST 或 PUT 方法可以更好地符合实际需求。
下面是 HTTP POST 方法和 HTTP PUT 方法的进一步比较:
语义差异:POST 方法通常用于向服务器提交数据,涉及创建新资源、提交表单数据或进行数据更新。而 PUT 方法主要用于传输数据以更新或创建资源。
URI 的处理:在 POST 请求中,URI 可以指向处理请求的资源的 URI 或者处理请求的服务器端程序的 URI。而在 PUT 请求中,URI 应该指向目标资源的 URI。
副作用:POST 请求通常会产生副作用,例如创建、更新或删除资源。而 PUT 请求被认为是幂等的,即多次相同的 PUT 请求对资源的状态不会产生变化。
请求体的类型:POST 和 PUT 请求都可以在请求体中携带数据,但它们的用途略有不同。POST 请求的主要作用是向服务器提交数据,请求体通常包含表单数据、JSON 数据等。PUT 请求的主要作用是传输数据以更新服务器上的资源,请求体通常包含要更新的数据。
重复提交:根据 HTTP 协议的设计,多次提交相同的 POST 请求会产生多个资源实例,而多次提交相同的 PUT 请求不会产生额外的影响,资源的状态保持一致。
在使用 HTTP 客户端库进行开发时(如 RT-Thread 中的 httpc),你需要根据具体需求选择使用 POST 方法还是 PUT 方法。如果需要提交数据并触发服务器的特定动作,可以选择使用 POST 方法。如果需要传输数据以更新或创建资源,并且期望请求是幂等的,可以使用 PUT 方法。
2.3.2 代码实例:httpc_get
下面是一个使用 RT-Thread httpc 接口的简单示例代码,用于发送 HTTP GET 请求并打印服务器响应的状态码和响应体:
#include <rtthread.h>
#include <httpclient.h>void httpc_get_example(void)
{const char *url = "http://httpbin.org/get";struct httpclient_data client;int ret;rt_memset(&client, 0, sizeof(client));ret = httpc_get(url, &client);if (ret == 0){rt_kprintf("HTTP GET Status: %d\n", client.response_code);if (client.data_len > 0){rt_kprintf("Response Body: %.*s\n", client.data_len, client.data);}}else{rt_kprintf("HTTP GET request failed\n");}
}int httpc_example(void)
{httpc_get_example();return 0;
}MSH_CMD_EXPORT(httpc_example, send http GET request);
在这个示例代码中,我们定义了一个 httpc_get_example 函数,该函数用于发送 HTTP GET 请求并处理服务器的响应。在 httpc_get_example 函数中,我们首先定义了一个目标 URL,然后通过调用 httpc_get 函数发送 HTTP GET 请求,并将响应数据保存在 struct httpclient_data 结构体中。接下来,我们检查返回值,如果请求成功,则打印服务器的状态码和响应体内容。
在 httpc_example 函数中,我们直接调用 httpc_get_example 函数执行示例代码。
使用示例代码时,请根据实际情况修改目标 URL,并按照 RT-Thread 的编译、配置和运行流程进行操作。
2.3.3 代码实例:httpc_post
下面是一个使用 RT-Thread httpc 接口的简单示例代码,用于发送 HTTP POST 请求并打印服务器响应的状态码和响应体:
#include <rtthread.h>
#include <httpclient.h>void httpc_post_example(void)
{const char *url = "http://httpbin.org/post";const char *content_type = "application/json";const char *body = "{\"key\": \"value\"}";struct httpclient_data client;int ret;rt_memset(&client, 0, sizeof(client));ret = httpc_request(url, HTTPCLIENT_POST, content_type, body, rt_strlen(body), &client);if (ret == 0){rt_kprintf("HTTP POST Status: %d\n", client.response_code);if (client.data_len > 0){rt_kprintf("Response Body: %.*s\n", client.data_len, client.data);}}else{rt_kprintf("HTTP POST request failed\n");}
}int httpc_example(void)
{httpc_post_example();return 0;
}MSH_CMD_EXPORT(httpc_example, send http POST request);
在这个示例代码中,我们定义了一个 httpc_post_example 函数,该函数用于发送 HTTP POST 请求并处理服务器的响应。在 httpc_post_example 函数中,我们首先定义了目标 URL、Content-Type(内容类型)和请求体(body)。然后通过调用 httpc_request 函数发送 HTTP POST 请求,并将响应数据保存在 struct httpclient_data 结构体中。接下来,我们检查返回值,如果请求成功,则打印服务器的状态码和响应体内容。
在 httpc_example 函数中,我们直接调用 httpc_post_example 函数执行示例代码。
使用示例代码时,请根据实际情况修改目标 URL、Content-Type 和请求体,并按照 RT-Thread 的编译、配置和运行流程进行操作。
2.3.4 代码实例:httpc_put
下面是一个使用 RT-Thread httpc 接口的简单示例代码,用于发送 HTTP PUT 请求并打印服务器响应的状态码和响应体:
#include <rtthread.h>
#include <httpclient.h>void httpc_put_example(void)
{const char *url = "http://httpbin.org/put";const char *content_type = "text/plain";const char *body = "This is the PUT request body";struct httpclient_data client;int ret;rt_memset(&client, 0, sizeof(client));ret = httpc_request(url, HTTPCLIENT_PUT, content_type, body, rt_strlen(body), &client);if (ret == 0){rt_kprintf("HTTP PUT Status: %d\n", client.response_code);if (client.data_len > 0){rt_kprintf("Response Body: %.*s\n", client.data_len, client.data);}}else{rt_kprintf("HTTP PUT request failed\n");}
}int httpc_example(void)
{httpc_put_example();return 0;
}MSH_CMD_EXPORT(httpc_example, send http PUT request);
在这个示例代码中,我们定义了一个 httpc_put_example 函数,该函数用于发送 HTTP PUT 请求并处理服务器的响应。与之前的示例类似,我们定义了目标 URL、Content-Type 和请求体,并通过调用 httpc_request 函数发送 HTTP PUT 请求。接着,我们检查返回值,如果请求成功,则打印服务器的状态码和响应体内容。
在 httpc_example 函数中,我们直接调用 httpc_put_example 函数执行示例代码。
请记得根据实际情况修改目标 URL、Content-Type 和请求体,并按照 RT-Thread 的编译、配置和运行流程进行操作。
三、HTTP Server
3.1 如何配置HTTP Server
配置 RT-Thread 的 HTTP 服务器需要进行一些步骤,以下是简要的配置过程:
-
首先,在 RT-Thread 的包管理器中选择并添加 HTTP 服务器组件。你可以在包管理器中搜索相应的组件,例如 Mongoose 或者 LwIP。
-
配置网络相关的设置,确保网络正常连接,可以使用 LwIP 或者其他支持的网络协议栈,并根据实际情况进行配置。
-
在 RT-Thread 的环境配置文件(
rtconfig.h)中启用 HTTP 服务器相关的宏定义,一般情况下会有对应的宏定义用于启用 HTTP 服务器功能。 -
根据具体的 HTTP 服务器组件,进行相应的初始化工作。通常需要在应用程序或者系统初始化阶段调用相应的初始化函数完成 HTTP 服务器的启动。
-
配置 HTTP 服务器的参数,如监听端口、默认页面、虚拟路径映射等。具体配置方式会根据选择的 HTTP 服务器组件而有所不同。
-
编写处理 HTTP 请求的回调函数或者页面处理逻辑,根据业务需求进行相应的处理和响应。
-
最后,编译整个 RT-Thread 项目并烧录到目标设备中,启动系统后 HTTP 服务器将会运行并监听指定端口,可以通过浏览器等工具进行访问和测试。
注意:以上步骤仅供参考,具体操作可能会因为使用的 HTTP 服务器组件而有所差异,建议查阅相应的文档和示例代码进行详细配置。
3.2 HTTP Server代码实例
以下是一个简单的示例代码,演示了如何在 RT-Thread 中使用 Mongoose HTTP 服务器组件创建一个简单的 HTTP 服务器:
#include <rtthread.h>
#include <mongoose.h>static struct mg_mgr mgr;static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) {if (ev == MG_EV_HTTP_REQUEST) {struct http_message *hm = (struct http_message *) ev_data;mg_printf(nc, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello from RT-Thread!\r\n");nc->flags |= MG_F_SEND_AND_CLOSE;}
}static void http_server_thread_entry(void *parameter) {struct mg_connection *nc;mg_mgr_init(&mgr, NULL);nc = mg_bind(&mgr, "8080", ev_handler);mg_set_protocol_http_websocket(nc);while (1) {mg_mgr_poll(&mgr, 1000);}
}int http_server_init(void) {rt_thread_t thread;thread = rt_thread_create("http_server",http_server_thread_entry, RT_NULL,2048, 25, 10);if (thread != RT_NULL) {rt_thread_startup(thread);return 0;}return -1;
}INIT_APP_EXPORT(http_server_init);
在这个示例中,我们使用了 Mongoose 库来创建一个简单的 HTTP 服务器,当接收到 HTTP 请求时,服务器会返回一个包含 “Hello from RT-Thread!” 的简单文本响应。在 http_server_init() 函数中创建了一个线程来运行 HTTP 服务器,并在初始化过程中注册了路由处理函数 ev_handler。
需要注意的是,上述代码仅供参考,实际使用时需要根据具体需求进行适当的修改和调整。另外,确保在 RT-Thread 的环境中正确添加了 Mongoose HTTP 服务器组件,并进行了相应的配置。
相关文章:
[嵌入式系统-25]:RT-Thread -12- 内核组件编程接口 - 网络组件 - HTTP编程
目录 一、HTTP编程概述 1.1 概述 1.2 HTTP 服务器和 HTTP 客户端 二、HTTP Client 2.1 如何配置HTTP Client 2.2 HTTP Client代码实例1:socket发送http报文 2.3 HTTP Client代码实例2:httpc_xx接口收发HTTP报文 2.3.1 接口函数描述 2.3.2 代码实…...
一个服务器实现本机服务互联网化
欢迎来到我的博客,代码的世界里,每一行都是一个故事 一个服务器实现本机服务互联网化 前言痛点关于中微子代理实战演练搭建服务端搭建客户端服务端配置代理实现 前言 在数字世界的网络战场上,中微子代理就像是一支潜伏在黑暗中的数字特工队&…...
django配置视图并与模版进行数据交互
目录 安装django 创建一个django项目 项目结构 创建视图层views.py 写入视图函数 创建对应视图的路由 创建模版层 配置项目中的模版路径 创建模版html文件 启动项目 浏览器访问结果 安装django pip install django 创建一个django项目 这里最好用命令行完成…...
Java进阶
乐观锁和悲观锁分布式锁hashmap原理Redis及其分布式DDD领域驱动设计IO、多线程 ??Kafka ??设计模式之??Elasticsearch ??JVM ?? 面试题汇总1...
⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)
106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postor…...
K8S更新部署docker的两种方法举例
前提条件 imagePullPolicy: Always 方法1:删除更新法 test-project为命名空间 --删除所有asp-svc下面的pod,这会导致从新拉取镜像 kubectl delete pods -l appasp-svc -n test-project --删除指定的pod,这会导致从新拉取镜像 kubectl delete pod …...
Java高并发编程基础之Thread构造函数大有内涵
引言 在Java中,Thread类提供了许多丰富的构造函数,以便于创建和管理线程。使得可以根据具体需求来创建和配置线程对象,从而实现更灵活、可扩展的多线程编程。 Thread类的无参构造函数可以创建一个新的线程对象,然后通过调用star…...
2023年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 运行以下程序,输出的结果是?( ) class A():def __init__(self,x):self.x=x...
代码随想录算法训练营第一天
● 今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 1. 704二分法: 方法一: 整个数组是 左闭右闭区间 [ ] left指针指向数组开始下标, right 指针指向数组最后下表nums.size()-1, mid为 (leftright) /2循环条件 left<rightnu…...
基于 java springboot+layui仓库管理系统
基于 java springbootlayui仓库管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…...
电商平台商家结算
本文主要分析了目前电商清结算的流程以及自己对电商清结算的看法。 基本概念 先说下电商平台清结算的概念。简单说就是收的用户(C端)的付款,经过清分,再结算给对应商家。当然,这里排除那种资金不通过第三方,…...
AIGC 实战:如何使用 Docker 在 Ollama 上离线运行大模型(LLM)
Ollama简介 Ollama 是一个开源平台,用于管理和运行各种大型语言模型 (LLM),例如 Llama 2、Mistral 和 Tinyllama。它提供命令行界面 (CLI) 用于安装、模型管理和交互。您可以使用 Ollama 根据您的需求下载、加载和运行不同的 LLM 模型。 Docker简介 D…...
MII、RMII、GMII和RGMII,以太网接口中常见的几种标准接口
MII、RMII、GMII和RGMII是以太网接口中常见的几种标准接口,它们在硬件设计中有各自的特点和注意事项。 MII(Media Independent Interface):MII是一种传统的以太网物理层接口标准,它包括4位数据总线、时钟和控制信号。…...
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)
文章目录 前言1.痛点2.解决方案3.具体实现3.1搭建热配置服务3.2编写配置文件3.3搭建版本控制仓库3.4Eureka-Client引入以下依赖3.5Eureka-Client微服务编写以下配置bootstrap.yml提前加载3.6分别编写测试Controller3.7测试效果3.8下线场景压测 4.SpringCloudBus优化5.写到最后 …...
郑州大学2024年寒假训练 Day7:数论
感觉这一块讲的有点太少了,只有辗转相除法,拓展欧几里得定理,素数筛,快速幂和逆元五个内容。数论的内容远远不止这些。不过一个视频也讲不了太多东西,讲的还是数学,也是没有办法。一边看题一边说吧。 辗转…...
“目标检测”任务基础认识
“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的:检测在一个窗口中是否有物体。 eg:以猫脸检测举例,当给出一张图片时,我们需要框出猫脸的位置并给出猫脸的大小,如…...
springboot+vue的宠物咖啡馆平台(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
LaWGPT—基于中文法律知识的大模型
文章目录 LaWGPT:基于中文法律知识的大语言模型数据构建模型及训练步骤两个阶段二次训练流程指令精调步骤计算资源 项目结构模型部署及推理 LawGPT_zh:中文法律大模型(獬豸)数据构建知识问答模型推理训练步骤 LaWGPT:基…...
一文弄明白KeyedProcessFunction函数
引言 KeyedProcessFunction是Flink用于处理KeyedStream的数据集合,它比ProcessFunction拥有更多特性,例如状态处理和定时器功能等。接下来就一起来了解下这个函数吧 正文 了解一个函数怎么用最权威的地方就是 官方文档 以及注解,KeyedProc…...
alibabacloud学习笔记06(小滴课堂)
讲Sentinel流量控制详细操作 基于并发线程进行限流配置实操 在浏览器打开快速刷新会报错 基于并发线程进行限流配置实操 讲解 微服务高可用利器Sentinel熔断降级规则 讲解服务调用常见的熔断状态和恢复 讲解服务调用熔断例子 我们写一个带异常的接口:...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
