当前位置: 首页 > news >正文

[嵌入式系统-69]:RT-Thread-组件:网络组件“组”,RT-Thread系统通向外部网络世界的入口

目录

RT-Thread 提供的网络世界入口 - 网络组件

1. 总概

2. AT

3. Lwip: 轻量级IP协议栈

4. W5500

5. Netdev

6. RT-Thread SAL(Socket Abstraction Layer)套接字和BSD套接字区别

RT-Thread SAL 套接字接口示例

BSD 套接字接口示例


RT-Thread 提供的网络世界入口 - 网络组件

作为一款在 RTOS 领域对网络支持很丰富的 RT-Thread,对设备联网功能的支持的工具就是接下来要讨论的 net 组件。它位于 ./rt-thread/components/net 路径下;作为一款基础组件, env 与 Studio 的工程配置界面的配置项都依赖该目录下的 Kconfig 文件。我们对网络功能的选择,或者其配置都属于该 Kconfig 的管理范畴。

从图片中的信息也可以了解到,AT,Lwip,Netdev,SAL 这些我们相对熟悉的功能也位于该目录中。这四个基础组件,可以驱动的网络设备的种类多到各个方面。

从有线网络的各种 ETH 的方式,带 PHY 的 enc28j60,纯接口的 RJ45,还有自带网络协议栈的 W5500都可以直接经过配置,通过我们的 net 组件实现设备联网的需求;除了有线网络的接入方式,无线网络的接入方式则更多,2G模块,3G模块,4G模块,Cat-1模块,Cat-4模块,NB-IOT模块,乃至 5G 模块这些依赖基站运营商的入网方式,例如 SIM800,EC20,AIR720,L610,N58,M5311 等,这些不同厂家,不同工作频率的模组均可以通过 NET 组件入网;WIFI 这种无需运营商直接提供的网络的入网方式,例如 ESP8266,W60x,rw007 等。

通过上面的简单介绍,大家应该可以基本了解 Net 组件的作用,即为使用 RT-Thread 的设备提供上网能力。上面的联网设备,品类繁多,方式各异,但其实追踪到依赖的基础 net 能力其实也没有多复杂。实际上大部分的功能依赖的基础能力,只有两组而已,即 AT ,Lwip;而到用户,也就开发者层面,大部分就只用到 SAL 这一个概念。

相信大家看过这份文档,主要描述了 SAL 提供的编程接口,也就是大家常用的 socket 接口;通过 SAL 接口大家已经可以实现 MQTT,NTP,TFTP,TCP Client,TCP Server,webclient,UDP Client,UDP Server,webnet 等这些大家经常会使用的工具。像浏览器一样访问网站,webclient;模拟一个网站,webnet;连接各种云平台,Mqtt;获取准确授时,NTP ;通过网络传输文件 ,TFTP ;诸如此类功能, SAL 提供了轻松访问网络的一把钥匙。你可以理解这把钥匙是向上的,但是这篇文章现在要讲的,是向下的,看看 SAL 这样组件,又是谁在支撑着它。

Net 组件的主要内容有 4 个方面,分别是 sal ,AT,lwip 与 netdev,我们先从 AT 和 lwIP 讲起,在不同的方式中介绍 sal 的用途;然后讲 netdev 的作用。

1. 总概

对于一个给定的模组,他的联网方式有时并不是单一的;以常见的 Cat-4 (4G) 模块为例,一方面它可以使用 AT 命令这种经典的方式来实现网络连接(并不一定是通过串口传送AT命令,也可以通过线程间通信传送AT命令);另一方面又可以通过 PPP 拨号,使用 lwip 的方式来实现网络连接。或者在以 W60x 为例,一方面可以使用 AT 的方式来实现联网功能;另一方面又可以使用裸 IP 包的方式来实现网络连接。在选取上网模块时,应当考虑片上资源的情况,以及网络质量的问题,选择比较适合的联网方式。条条大路通罗马,短途长途,步行开车还是有些小区别的。

2. AT

AT 命令一开始并没有那么丰富,一开始是用作拨号的功能,也就是电话业务方面的内容。后来随着时间发展,AT 命令的范围也一步步进行了扩展,而逐渐支持了网络的一些功能,例如 TCP ,UDP 的功能;而到现在,有些模块厂商甚至直接使用 AT 命令扩展的方式,实现了诸如 MQTT,HTTP,HTTPS 之类的功能。这些使用扩展 AT 命令方式实现的上层应用对模块依赖度高,在 RT Thread 的 IOT Package 的栏目中,可以留意到这样的软件包,例如:bc28_mqtt。RT-Thread 的 AT socket 功能,则是更接近底层,实现 TCP UDP 这样的接口,通过 SAL 来实现 MQTT 这种上层应用。

RT-Thread 的 AT 组件的设计目的就是使设备能发送和解析 AT 命令。为了到达这个目的,契合 AT 命令的常见逻辑,提供了AT client 功能和 AT Server 功能。

  • 对于 AT Client 来说,是由 MCU 去向 Modem 发送 AT 命令,由 Modem 响应命令,并给出回复。这种方式我们常用的,也是我们通过支持 AT 的模组上网的常用方式。
  • 对于 AT Server 来说,是由 MCU 作为类似 Modem 的功能,由其他 MCU 向这个 MCU 发送 AT 命令,由这个 MCU 响应 AT 命令并做出回复。

具体的 AT 的使用,可以参考 AT 文档;更加详细,底层的实操的内容在专门的文档中有描述;在查阅文档时,可以同时浏览代码,通过文章的说明,我们应该能了解到 AT 组件的使用方法。AT 组件的适用范围也进而清晰起来:

  • AT 命令用作模块控制
  • AT 命令用作数据的解析

对 AT Client 功能做大规模应用的软件包为 at_device ,作为一款使用频次很高的软件包,可以看到他充分利用了 AT 组件的能力,一方面针对模块控制的能力设置了 at_device_xxx.c 来提供模块的基础控制操作;一方面也提供了 at_socket_xxx.c 来提供数据解析能力。对于整体的 net 组件而言,at_socket_xxx.c 实际上沟通了 AT 组件与 SAL,使得上层应用能依赖 at_socket_xxx.c 的函数,实现对应的网络功能 MQTT,HTTP....

static const struct sal_socket_ops at_socket_ops =
{at_socket,at_closesocket,at_bind,NULL,at_connect,NULL,at_sendto,at_recvfrom,at_getsockopt,at_setsockopt,at_shutdown,NULL,NULL,NULL,
#ifdef SAL_USING_POSIXat_poll,
#endif /* SAL_USING_POSIX */
};static const struct sal_netdb_ops at_netdb_ops =
{at_gethostbyname,NULL,at_getaddrinfo,at_freeaddrinfo,
};复制错误复制成功

从 AT 组件的 at/at_socket/at_socket.h 中可以看到 AT 组件实现的 sal 的一部分函数,从这些函数命令也能看出来 at_socket 是不支持 server 模式的。

对于 at_device 软件包来说,at_socket_xxx.c 的内容,也主要是对 at_socket.h 内容的实现,例如:

/* AT socket operations function */
struct at_socket_ops
{int (*at_connect)(struct at_socket *socket, char *ip, int32_t port, enum at_socket_type type, rt_bool_t is_client);int (*at_closesocket)(struct at_socket *socket);int (*at_send)(struct at_socket *socket, const char *buff, size_t bfsz, enum at_socket_type type);int (*at_domain_resolve)(const char *name, char ip[16]);void (*at_set_event_cb)(at_socket_evt_t event, at_evt_cb_t cb);int (*at_socket)(struct at_device *device, enum at_socket_type type);
};复制错误复制成功

如果你能浏览对应的 at_device 中 at_socket_xxx.c 的代码,你可以发现几乎都是上述函数的实现,都是根据不同的模块的特性来处理对应逻辑。


在论坛中也能看到 at_device 的影响:

  1. at_device使用bc28报错
  2. 4.0.3版本串口接收buff设置大于128时,使用at_device有问题
  3. air720 at-device回复命令冲突
  4. AT组件接收不到数据
  5. .....

除了这些使用 at_device 能搜索到的问题,还有一些因为使用了 at_device 而产生的问题;这些问题的出现,对于在使用 AT 组件时的使用体验影响是很大的。

在遇到问题时,希望能小心地验证问题,并尝试解决问题;在问题难以解决时,请详细描述问题复现的场景,按照格式在论坛中提问。问题描述清晰,复现手段准确,更能吸引小伙伴们的参与,共同解决问题。

  • AT RAW 能准确显示 AT 交互中的 modem 返回的数据,再数据异常需要调试时,建议打开。

市面上的各种模块,at_device 已经囊括了最常使用的一些部分,不过还有更多的模块等待着小伙伴们一起帮忙完善。也许是因为在小伙伴提交代码时并没有那么多的业务量或者功能,在一次次的功能增加迭代中,导致了 at_device 有时不能做到随取随用而产生了一些问题,也希望使用的小伙伴能发现问题,做出修改并给予 at_device 软件包自己的 PR,一起推动 at_device 更加易用。

3. Lwip: 轻量级IP协议栈

大家基本都是看过这个 TCP/IP 模型的,在嵌入式的网络协议栈入口中,lwip 就是很重要的一个入口;

lwip 是开源的一个协议栈,已经经过很多厂家和开发者使用后,得到验证和肯定的嵌入式 TCP/IP 网络协议栈,lwip 的全称为 A Lightweight TCP/IP stack,一个轻量级的 TCP/IP 协议栈。

所以可以知道:lwip 并不是嵌入式上唯一的 TCP/IP 协议栈,但 lwip 是经过验证的,能胜任工作的 TCP/IP 协议栈。

在 RT-Thread 中,提供了三个 lwip 的版本供用户使用: lwip1.4.1,lwip2.0.2,lwip2.1.2 ;

通常大家在使用有线连接的方式使用网络时,一部分是使用的 lwip 协议栈,而另一部分则是使用了 w5500 这种方式来实现。

难道 lwip 只有在有线网络中才能使用吗?其实,也不尽然。对于使用裸 IP 包方式实现的网络数据的交互,而不是简单使用 AT 命令的话;rw007 这种 WIFI 设备,Air720 这种 Cat-4 设备,都是可以使用 Lwip 来使用网络功能的。

AT 方式lwip 方式
rw007AT 命令实现数据交互(与模块版本有关)裸 IP 包形式实现数据交互
Air720AT 命令实现数据交互PPP 包形式实现数据交互

通过表格可以发现 net 组件的意图:即通过数据交互的方式来实现网络数据传输。对于 AT 方式来说,网络数据在 AT 命令中,需要从 AT 数据中解析出想要使用的网络数据;这种方式不需要 Lwip 庞大的协议栈,但很明显需要比较强大的解析能力,而且频繁转换解析对网络效率也是有影响的。

对于 lwip 方式来说,网络数据直接以 IP/PPP 包的方式传输,这是网络世界通用的格式;无论是我们的交换机,路由器,它们都能识别 IP 报文,更加轻便而且无需进行复杂的相互转换,但这种方法需要有 lwip 协议栈的参与,需要根据项目对 lwip 做一些细微得调整。

在 RT-Thread 中,我们对 lwip 做了一些小修改,也使用 Kconfig 的方式提供了一些简单的优化配置项供用户进行简单的配置。在上面提到,我们对 lwip 有一些修改,主要的修改内容包括 netif 与 mem 方面;在 netif 中,我们在上层抽象了 netdev 的结构,对于 lwip 而言是对 netif 的继承和常用的一些接口函数的函数,而对于不是使用 lwip 实现的网络通信功能来说,netdev 可以使开发者更轻松的使用;在 mem 方面,我们使用 RT-Thread 自身的内存分配算法取代了 lwip 的内存堆分配算法,不包括内存池部分。查看 lwipx.x.x 下的j脚本文件 Sconscript 文件,可以留意到.\src\core\mem.c文件是没有参与编译的;也就是说在使用 pbuf_alloc(PBUF_RAW, len, PBUF_RAM)语句来申请 pbuf 空间时,我们实际上使用得是 RT-Thread 通用的内存堆算法。当然无论是 lwip 还是 RT-Thread ,内存堆与内存池的申请确实是各有优劣的,还是需要针对使用场景才能确定孰优孰劣。在本篇文章中,主要讲解 lwip 在 net 中的作用,具体的 lwip 配置方法和内容讲解会在另一篇文章中仔细描述。

4. W5500

我们经常使用的 net 组件中的两项已经介绍了基本情况;除了这两种方式,w5500 作为一个拥有 TCP/IP 协议栈的一个独立模块,也是一种通用的方式。在 RT-Thread 中使用 w5500 的方式也很简单。只需在工程中使用 wiznet 软件包就可以使用标准的 BSD socket 接口来实现网络编程了。

通过网络框架图可以看到:wiznet 是独立与 AT socket 与 lwip 的,但还是需要 netdev 与 SAL 的参与才能轻松的使用。

从sal,netdev,w5500 的对接过程来看,在 BSD socket 的接口方面,只是实现了常用的一些接口;这些接口已经囊括了 IOT 设备中会使用的常用能力。

static const struct sal_socket_ops wiz_socket_ops =
{wiz_socket,wiz_closesocket,wiz_bind,wiz_listen,wiz_connect,wiz_accept,wiz_sendto,wiz_recvfrom,wiz_getsockopt,wiz_setsockopt,wiz_shutdown,NULL,NULL,NULL,
#ifdef SAL_USING_POSIXwiz_poll,
#endif /* SAL_USING_POSIX */
};static const struct sal_netdb_ops wiz_netdb_ops =
{wiz_gethostbyname,NULL,wiz_getaddrinfo,wiz_freeaddrinfo,
};复制错误复制成功

在 w5500 的使用中,也有一部分小伙伴会遇到问题。比如,一些 Linux 上的网络应用在迁移到 w5500 的平台上时会出现一些参数的不兼容问题。比如设置某些 socket 的属性,设置一个 TCP 的属性等等;有些设置在 Linux 平台上可能是可以使用的,有些则可能会产生编译或者执行过程的逻辑异常,不符合函数预期。

为了在嵌入式平台上实现网络功能,AT命令,lwip 协议栈,wiznet 这些方法都是实现了 TCP/IP 协议中的一大部分功能;并没有完全实现整个协议栈的内容。可能有些函数特性在嵌入式的平台上是不太符合预期的。这时候就需要发现问题的小伙伴及时在论坛中提出问题,更多的小伙伴参与讨论,才能使我们的 net 组件功能更丰富。

5. Netdev

在 lwip 的介绍中,我们提到 netdev 是对 lwip 中 netif 的继承。因为 netdev 从 netif 中取出了一些字节用于关键信息的填充。我们在 cmd 控制台上,经常会用到 ifconfig命令,然后得到下面的回复:

在控制台中可以显示每个注册为 netdev 的信息,IP地址,网关地址,子网掩码,以及 DNS 服务器地址;还有 MTU 长度,MAC 地址,以及该 netdev 的属性(是否启用,链路是否正常,网络是否正常,DHCP 是否打开,ARP 功能是否开启,广播是否支持,IGMP组播能力是否支持)。这些内容中经常使用到的一般有三个属性:

重要属性意义
UP / DOWN网卡是否启用
LINK_UP / LINK_DOWN链路是否正常
INTERNET_UP / INTERNET_DOWN网络是否正常
  • LINK_UP 的意义为链路是否正常,在 netdev 启用后,LINK_UP 是作为 PING 命令是否可用的关键。如果 为 LINK_DOWN ,PING 命令将禁用。毕竟,网线都没有连接,PING 命令不可以用也是合情合理的喽。LINK_DOWN 状态下禁用 PING 命令很合理,但是如果 netdev 的状态被异常置为 LINK_DOWN 就很苦恼了。如果被代码错误执行到设置为 LINK_DOWN,PING 命令将不可用。netdev 的使用,可以参考文档介绍。
  • INTERNET_UP 的意义为网络是否正常。实际上,RT-Thread 的代码逻辑中,把这个位作为标志位,但很少利用这个标志位做逻辑判断。这样做的原因,是因为判断 INTERNET_UP 的方式为访问 link.rt-thread.org,如果能有回复,就把标志位置为 INTERNET_UP,否则置为 INTERNET_DOWN。这个逻辑在一般情况下算是正常,但是在一些网络拓扑中,很有可能被网络标记位不可达(被墙了,PS :也有可能是 RT-Thread 的网络主机重启了),所以哪怕实际上是可以连接网络的,却显示为 INTERNET_DOWN。

除此以外,netdev 还有 PING 功能的抽象,就是上面提到的 LINK_DOWN 状态不可用的那个。说它是抽象,是因为 netdev 中并没有直接实现全部的 ping 逻辑,而是依赖底层的提供提供的 PING 能力。

也许会有小伙伴想问,netdev 没有提供 ping 功能是因为代码不够高大上,能力不足吗?都是连接到一个 IP 地址上面,使用 socket 的接口不可以吗?为什么一定要抽象出一个 ping 接口,让底层去实现这个接口,而不是 netdev 层直接实现呢?其实这并不是这个原因,因为 ping 功能发送的数据,和通过 socket 发出的数据,格式并不是完全相同的。虽然统称为 IP 数据报文,但实际上 netdev 这个层级是感受不到这个数据的。具体的内容可以在下一篇 lwip 的讲解中来一起解释。

6. RT-Thread SAL(Socket Abstraction Layer)套接字和BSD套接字区别

RT-Thread SAL(Socket Abstraction Layer)套接字和BSD套接字在功能和使用上存在一些区别,尽管它们都用于网络通信,但各有其特定的设计和应用场景。

RT-Thread SAL套接字:

  1. 定义与功能:SAL是RT-Thread操作系统中的一个组件,用于抽象和统一多种网络协议栈接口。它提供了一个Socket层面的TLS加密传输特性,并支持标准BSD Socket API。SAL套接字抽象层位于网络硬件层和应用层之间,通过它,RT-Thread系统能够适配下层不同的网络协议栈,并提供给上层统一的网络编程接口,方便不同协议栈的接入
  2. 特点与优势:SAL套接字的主要特点包括抽象和统一多种网络协议栈接口,提供统一的FD(文件描述符)管理,以及支持标准BSD Socket API等。这使得开发者可以更方便地使用read/write、poll/select等函数来操作网络功能。此外,SAL的孕育而出,使得RT-Thread可以无缝接入各式各样的网络芯片或模块,极大地提升了RT-Thread在IoT领域对于不同网络硬件的兼容性。

BSD套接字:

  1. 定义与功能:BSD套接字最早是由BSD(伯克利软件套件)在1982年引入的通信机制,目前已被广泛移植到主流的操作系统中。对于应用开发人员来说,套接字(socket)是一个抽象层,是一种特殊的I/O接口,独立于具体协议的网络编程接口,也是一种文件描述符。应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。
  2. 特点与优势:BSD套接字具有跨平台、兼容性好、易于理解和使用等优点。它支持各种形式的网络应用,并且还是一种进程间通信的机制。套接字可以看成是一种特殊的管道,但与管道不同的是,套接字所能容纳的数据不受限制。

总结来说,RT-Thread SAL套接字和BSD套接字在功能和使用上存在一些差异。RT-Thread SAL套接字是RT-Thread操作系统中的一个组件,主要用于抽象和统一多种网络协议栈接口,提升系统的兼容性和易用性;而BSD套接字则是一种广泛使用的网络通信机制,具有跨平台、兼容性好等优点,适用于各种网络应用。在实际应用中,可以根据具体需求和场景选择合适的套接字类型。

RT-Thread 的 SAL (Socket Abstraction Layer) 套接字与 BSD 套接字在接口层面上是非常相似的,因为它们都遵循 BSD Socket API 规范。下面我会分别给出一个 RT-Thread SAL 套接字和 BSD 套接字的简单接口示例,以便进行比较。

RT-Thread SAL 套接字接口示例

在 RT-Thread 中使用 SAL 套接字进行网络通信时,通常会遵循以下步骤:

  1. 创建套接字

 

c复制代码

int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
/* 错误处理 */
}
  1. 绑定套接字

 

c复制代码

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080);
server_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
/* 错误处理 */
}
  1. 监听套接字

 

c复制代码

if (listen(sockfd, 5) < 0) {
/* 错误处理 */
}
  1. 接受连接

 

c复制代码

struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_len);
if (connfd < 0) {
/* 错误处理 */
}
  1. 发送和接收数据

 

c复制代码

char buf[1024];
int len = recv(connfd, buf, sizeof(buf), 0);
if (len > 0) {
/* 处理接收到的数据 */
}
/* 发送数据 */
send(connfd, "Hello, Client!", strlen("Hello, Client!"), 0);
  1. 关闭套接字

 

c复制代码

close(sockfd);
close(connfd);
BSD 套接字接口示例

BSD 套接字的接口与 RT-Thread SAL 套接字的接口非常相似,因为 RT-Thread SAL 本身就是基于 BSD Socket API 设计的。所以上面的示例代码在 BSD 环境下也是适用的。

不过,需要注意的是,虽然接口相似,但在具体实现和性能上可能会有所不同。

RT-Thread SAL 针对嵌入式系统和物联网设备进行了优化,可能具有更小的内存占用和更高的效率。而 BSD 套接字则更广泛地应用于各种操作系统和环境中

相关文章:

[嵌入式系统-69]:RT-Thread-组件:网络组件“组”,RT-Thread系统通向外部网络世界的入口

目录 RT-Thread 提供的网络世界入口 - 网络组件 1. 总概 2. AT 3. Lwip&#xff1a; 轻量级IP协议栈 4. W5500 5. Netdev 6. RT-Thread SAL&#xff08;Socket Abstraction Layer&#xff09;套接字和BSD套接字区别 RT-Thread SAL 套接字接口示例 BSD 套接字接口示例 …...

Linux学习笔记1---Windows上运行Linux

在正点原子的教程中学习linux需要安装虚拟机或者在电脑上安装一个Ubuntu系统&#xff0c;但个人觉得太麻烦了&#xff0c;现在linux之父加入了微软&#xff0c;因此在Windows上也可以运行linux 了。具体方法如下&#xff1a; 一、 在Windows上的设置 在window的搜索框内&#…...

Java算法-力扣leetcode-135. 分发糖果

135. 分发糖果 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并…...

企业为什么需要主数据管理工具?十大热门主数据管理工具盘点

主数据管理是一套综合性的策略和技术&#xff0c;用于协调和管理企业内用于识别关键业务实体&#xff08;如客户、产品、供应商和员工&#xff09;的一致性、准确性和统一性的数据。主数据管理的目的是创建一个“单一真相源”&#xff0c;确保在不同部门和系统之间共享的数据保…...

免费思维13招之一:体验型思维

思维01:体验型思维 第一大战略:体验型思维。 体验型思维是免费思维中最简单的思维,我们先从最简单的讲起,由简入繁,简单的我们少讲,复杂的我们多讲。 那么,什么是体验型思维呢? 很简单,就是先让客户进行体验,再进行成交的方式。这一种思维,具体的可以分为两种:…...

面试C++(基础篇)-NULL与nullptr的区别?

3: NULL与nullptr的区别&#xff1f; 在C中&#xff0c;NULL和nullptr都用于表示空指针&#xff0c;但它们之间存在一些关键的区别&#xff1a; 1. 来源和含义&#xff1a; • NULL&#xff1a;在C中&#xff0c;NULL最初是从C语言中继承过来的&#xff0c;定义在<cstddef…...

「AIGC」深度学习

深度学习是机器学习的一个子领域&#xff0c;它基于人工神经网络的学习算法。深度学习在图像和语音识别、自然语言处理、医学图像分析、药物发现、自动驾驶汽车等领域取得了显著的进展。以下是围绕深度学习的几个关键主题的阐述。 学习路线 基础数学&#xff1a; 了解线性代数…...

mysql5.7数据库安装及性能测试

mysql5.7数据库安装及性能测试 记录Centos7.9下安装mysql 5.7并利用benchmark工具简单测试mysql的性能。 测试机&#xff1a;centos7.9 配置&#xff1a;4C8G40G 1. 下安装mysql5.7 安装mysql5.7&#xff1a; # 通过官方镜像源安装$ wget http://dev.mysql.com/get/mysql57-com…...

聪明与诚实:社会信任的桥梁

在现代社会中&#xff0c;我们经常听到这样的评价&#xff1a;“某人真聪明。”然而&#xff0c;当我们深入思考时&#xff0c;会发现“聪明”这个词背后所承载的含义并不单一。聪明和狡诈往往被混淆&#xff0c;而诚实的价值却时常被忽视。在一个高度诚信的社会里&#xff0c;…...

基于单片机的无线数据传输系统设计

摘要:基于单片机的无线数据传输系统的设计,实现了温度和湿度的自动采集、无线通讯和报警功能。该系统包括了LCD1602显示电路、DHT11温湿度采集电路等,完成了基于无线数据传输的方法来实现温湿度的采集。 关键词:温湿度检测;N RF 24 L 01;单片机 0 引言 随着科技水平的提高,…...

【IP:Internet Protocol,子网(Subnets),IPv6:动机,层次编址:路由聚集(rout aggregation)】

文章目录 IP&#xff1a;Internet Protocol互联网的的网络层IP分片和重组&#xff08;Fragmentation & Reassembly&#xff09;IP编址&#xff1a;引论子网&#xff08;Subnets&#xff09;特殊IP地址IP 编址: CIDR子网掩码&#xff08;Subnet mask&#xff09;转发表和转发…...

智启算力平台基本操作

智启算力平台 智启算力平台路径搭载数据集搭载镜像配置 智启算力平台 开发文档 帮助文档 - OpenI - 启智AI开源社区 路径搭载 OpenIOSSG/promote: 启智AI协作平台首页推荐组织及推荐项目申请。 - notice/Other_notes/SDKGetPath.md at master - promote - OpenI - 启智AI开…...

微信小程序 【关键部分】

1. 动机 最近在开发小程序&#xff0c;小程序既需兼顾针对新用户的内容预览&#xff0c;又要为注册用户提供服务&#xff0c;简单梳理下&#xff0c;基本需求如下&#xff1a; 小程序共三个tab页&#xff0c;所有用户都可以浏览首页内容&#xff0c;了解我们可以提供的优质服…...

JavaEE技术之MySql高级(索引、索引优化、sql实战、View视图、Mysql日志和锁、多版本并发控制)

文章目录 1. MySQL简介2. MySQL安装2.1 MySQL8新特性2.2 安装MySQL2.2.1 在docker中创建并启动MySQL容器&#xff1a;2.2.2 修改mysql密码2.2.3 重启mysql容器2.2.4 常见问题解决 2.3 字符集问题2.4 远程访问MySQL(用户与权限管理)2.4.0 远程连接问题1、防火墙2、账号不支持远程…...

OCR文本识别模型CRNN

CRNN网络结构 论文地址&#xff1a;https://arxiv.org/pdf/1507.05717 参考&#xff1a;https://blog.csdn.net/xiaosongshine/article/details/112198145 git:https://github.com/shuyeah2356/crnn.pytorch CRNN文本识别实现端到端的不定长文本识别。 CRNN网络把包含三部分&…...

【数据结构】闲谈A股实时交易的数据结构-队列

今天有点忙&#xff0c;特意早起&#xff0c;要不先写点什么。看到个股的红红绿绿&#xff0c; 突然兴起&#xff0c;要不写篇文章分析下A股交易的简易版数据结构。 在A股实时股票交易系统中&#xff0c;按照个人理解&#xff0c;大致会用队列来完成整个交易。队列&#xff08;…...

深入探索van Emde Boas树:原理、操作与C语言实现

van Emde Boas (vEB) 树是一种高效的数据结构&#xff0c;用于处理整数集合。它是由荷兰计算机科学家Jan van Emde Boas在1977年提出的。vEB树在处理整数集合的查找、插入、删除和迭代操作时&#xff0c;能够以接近最优的时间复杂度运行。vEB树特别适合于那些元素数量在某个较小…...

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-14-主频和时钟配置

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突&#xff0c;需要修改tomcat的端口...

03 JavaSE-- 访问控制权限、接口、抽象类、内部类、Object类、异常

1. Exception 异常 在 Java 中&#xff0c;异常分为两种主要类型&#xff1a;强制性异常&#xff08;Checked Exceptions&#xff09;和非强制性异常&#xff08;Unchecked Exceptions&#xff09;。 强制性异常&#xff08;Checked Exceptions&#xff09;&#xff1a; 强制…...

free5gc+ueransim操作

启动free5gc容器 cd ~/free5gc-compose docker-compose up -d 记录虚拟网卡地址&#xff0c;eth0 ifconfig 查看并记录amf网元的ip地址 sudo docker inspect amf "IPAddress"那一行&#xff0c;后面记录的即是amf的ip地址 记录上述两个ip地址&#xff0c;完成UER…...

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作&#xff0c;没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…...

高速、简单、安全的以太彩光,锐捷网络发布极简以太全光 3.X 方案

从 2021 年 3 月正式推出到现在&#xff0c;锐捷网络极简以太全光方案已经走进第四个年头。IT 仍在不断向前发展&#xff0c;数字化进程深入&#xff0c;数字化业务增多&#xff0c;更广泛的终端设备接入企业级园区网络&#xff0c;对园区网络提出了更高的要求&#xff0c;例如…...

图书管理系统

一、图书管理系统菜单 &#x1f353;管理员菜单 1.查找图书 2.新增图书 3.删除图书 4.显示图书 0.退出系统 --------------------------------------------------------------------------------------------------------------------------------- &#x1f33c;用户菜…...

图解HTTP(2、简单的 HTTP 协议)

HTTP 协议用于客户端和服务器端之间的通信 请求访问文本或图像等资源的一端称为客户端&#xff0c;而提供资源响应的一端称为服务器端。 通过请求和响应的交换达成通信 请求必定由客户端发出&#xff0c;而服务器端回复响应报文 请求报文是由请求方法、请求 URI、协议版本、…...

小鹅知识付费系统登录,网课怎么推广与宣传?有啥获客方法?

现在很多教育机构都开始做网络课程&#xff0c;同行之间的竞争也愈发激烈&#xff0c;机构的网课想要盈利就需要对课程进行宣传推广&#xff0c;网课要怎么推广和宣传呢&#xff1f; 在线课程要想推广获客方法有几种&#xff0c;不同推广方法获客效果也是不同的&#xff0c;只有…...

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java&#xff0c;真的吗&#xff1f;唉&#xff0c;先把这视频干完吧。 逻辑运算符练习 x6&#xff0c;y6 x6&#xff0c;y5 x11&#xff0c;y6 x11&#xff0c;y5 z48 错了&a…...

单片机为什么能直接烧录程序?

在设计芯片的时候&#xff0c;关于烧录的环节是一个不得不考虑的问题。首先排除掉&#xff0c;由外部硬件直接操控FLASH的方案&#xff0c;这个方案有很多缺点。 1、每个IC使用的FLASH型号各不相同&#xff0c;每种型号的FLASH的烧录命令和流程都有差别&#xff0c;这会导致烧…...

【Linux】25. 网络基础(一)

网络基础(一) 计算机网络背景 网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 其实本质上一台计算机内部也是一个小型网络结构(如果我们将计算机内部某个硬件不存放在电脑中&#xff0c;而是拉根长长的线进行连接。这其实也就是网…...

项目经理【人】任务

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】任务 【环境】绩效 【人】概述 【人】原则 【人】任务 一、定义团队的基本规则&塔克曼阶梯理论 1.1 定义团队的基本规则 1.2 塔克曼阶梯理论 二、项目经理管理风格 …...

Linux学习(嵌入式硬件知识)

GPU和CPU GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;和 CPU&#xff08;Central Processing Unit&#xff0c;中央处理单元&#xff09;是计算机中两种不同的处理器。它们在功能、设计和用途上有所不同。 CPU&#xff08;中央处理单元&…...

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…...

Hive Bucketed Tables 分桶表

Hive Bucketed Tables 分桶表 1.分桶表概念 2.分桶规则 3.语法 4.分桶表的创建 5.分桶表的好处...

【拆位法 决策包容性 位运算】2871. 将数组分割成最多数目的子数组

本文涉及知识点 拆位法 贪心 位运算 决策包容性 位运算、状态压缩、子集状态压缩汇总 LeetCode2871. 将数组分割成最多数目的子数组 给你一个只包含 非负 整数的数组 nums 。 我们定义满足 l < r 的子数组 nums[l…r] 的分数为 nums[l] AND nums[l 1] AND … AND nums[r…...

Java 线程池 ( Thread Pool )的简单介绍

想象一下&#xff0c;你正指挥着一支超级英雄团队&#xff0c;面对蜂拥而至的敌人&#xff08;任务&#xff09;&#xff0c;不是每次都召唤新英雄&#xff08;创建线程&#xff09;&#xff0c;而是精心调配现有成员&#xff0c;高效应对。这就是Java线程池的魔力&#xff0c;…...

鸿蒙内核源码分析(时间管理篇) | 谁是内核基本时间单位

时间概念太重要了&#xff0c;在鸿蒙内核又是如何管理和使用时间的呢? 时间管理以系统时钟 g_sysClock 为基础&#xff0c;给应用程序提供所有和时间有关的服务。 用户以秒、毫秒为单位计时.操作系统以Tick为单位计时&#xff0c;这个认识很重要. 每秒的tick大小很大程度上决…...

安装numpy遇到的问题

安装numpy的时候提示无法安装如下&#xff1a; (venv) E:\works\AI\venv\Scripts>pip install numpy pandas matplotlib jupyter -i https://pypi.douban.com/simple Looking in indexes: https://pypi.douban.com/simple WARNING: Retrying (Retry(total4, connectNone, r…...

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下&#xff0c;uiotos.net&#xff0c;通过连线来代替脚本逻辑开发&#xff0c;复杂的交互界面&#xff0c;通过页面嵌套轻松解决&#xff0c;是个很新颖的思路&#xff0c;前端零代码&#xff01; 蓝图连线尤其是独创的页面嵌套和属性继承技术&#xff0c;好家…...

上传文件至linux服务器失败

目录 前言异常排查使用df -h命令查看磁盘使用情况使用du -h --max-depth1命令查找占用空间最大的文件夹 原因解决补充&#xff1a;删除文件后&#xff0c;磁盘空间无法得到释放 前言 使用XFTP工具上传文件至CentOS服务器失败 异常 排查 使用df -h命令查看磁盘使用情况 发现磁盘…...

渗透 如何防御ARP欺骗,LLMNR-MDNS-NBNS等协议的作用

一. 如何防御ARP欺骗&#xff1f; 1.使用双向IP/MAC绑定&#xff1b; 2.使用静态ARP缓存表&#xff1b; 3.使用ARP服务器&#xff0c;通过服务器来查找ARP转换表来响应其他机器的广播&#xff1b; 4.使用ARP欺骗防护软件&#xff1b; 5.在网关设备上部署防ARP欺骗攻击功能…...

【C++ 所有STL容器简介】

【C 所有STL容器简介】 1. vector2. list3. deque4. set / multiset5. map / multimap6. unordered_set / unordered_multiset7. unordered_map / unordered_multimap8. stack9. queue10. priority_queue C 标准模板库&#xff08;STL&#xff09;提供了一系列常用的容器&#…...

Django调用SECRET_KEY对数据进行加密

对数据进行加密 在Django中进行加密可以直接调用django配置文件中的SECRET_KEY , 同时还需要导入itsdangerous模块中的TimedJSONWebSignatureSerializer进行加密 1. 实现加密方法 , 生成用户加密链接 # 生成用户加密链接 def generate_verify_email_url(user):# 调研加密方法…...

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…...

【机器学习与实现】线性回归示例——波士顿房价分析

目录 一、创建Pandas对象并查看数据的基本情况二、使用皮尔逊相关系数分析特征之间的相关性三、可视化不同特征与因变量MEDV&#xff08;房价中值&#xff09;间的相关性四、划分训练集和测试集并进行回归分析 一、创建Pandas对象并查看数据的基本情况 boston.csv数据集下载&a…...

Redis核心数据结构——跳表(生成数据到文件和从文件中读取数据、模块合并、)

生成文件和从文件中读取数据。 需求如下&#xff1a; 你的任务是实现 SkipList 类中的数据持久化成员函数和数据加载成员函数。 持久化数据成员函数签名&#xff1a;void dump_file(); 该成员函数负责将存储引擎内的数据持久化到文件中。数据的持久化格式是将每个键值对写入文…...

微信小程序下载文件详解

在微信小程序中&#xff0c;下载文件通常涉及使用 wx.downloadFile API。这个 API 可以将网络资源下载到本地临时文件路径&#xff0c;然后你可以使用 wx.saveFile 将临时文件保存到本地持久存储位置。下面是一个下载文件的详细过程&#xff1a; 使用 wx.downloadFile 下载文件…...

2024 概率论和数理统计/专业考试/本科考研/论文/重点公式考点汇总

## 列表http://www.deepnlp.org/equation/category/statistics ## 均匀分布http://www.deepnlp.org/equation/uniform-distribution ## t-分布http://www.deepnlp.org/equation/student-t-distribution ## 伯努利分布http://www.deepnlp.org/equation/bernoulli-distributio…...

四川易点慧电子商务抖音小店:潜力无限的新零售风口

在当今数字化浪潮中&#xff0c;电子商务已经成为推动经济发展的重要引擎。四川易点慧电子商务有限公司凭借其敏锐的市场洞察力和创新精神&#xff0c;成功在抖音小店这一新兴平台上开辟出一片新天地。本文将探讨四川易点慧电子商务抖音小店的潜力及其在新零售领域的影响力。 一…...

Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》

Seal^_^【送书活动第3期】——《Hadoop大数据分析技术》 一、参与方式二、作者荐语三、图书简介四、本期推荐图书4.1 前 言4.2 本书内容4.3 本书目的4.4 本书适合的读者4.5 配套源码、PPT课件等资源下载 五、目 录六、&#x1f6d2; 链接直达 Hadoop框架入门书&#xff0c;可当…...

win10下,svn上传.so文件失败

问题&#xff1a;win10下使用TortoiseSVN&#xff0c;svn上传.so文件失败 解决&#xff1a;右键&#xff0c;选择Settings&#xff0c;Global ignore pattern中删除*.so&#xff0c;保存即可。...

如何帮孩子学好编程

学习编程对于孩子来说是一项非常有益的技能&#xff0c;不仅可以培养孩子的逻辑思维能力&#xff0c;还可以提高孩子的问题解决能力和创造力。以下是一些建议&#xff0c;帮助孩子学好编程&#xff1a; 选择适合孩子的编程语言和工具&#xff1a;根据孩子的年龄和兴趣选择合适的…...

HTML+CSS练习小项目——百叶窗

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的是新手可以练习的小项目——百叶窗 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下效果&#xff1a…...

视频加背景

习使用ffmpeg命令给视频添加一张设计好的背景图片 效果如下 命令如下 效果如下 未加背景图片之前&#xff1a; 加上背景图片之后&#xff1a; 命令如下 视频加背景&#xff1a; ffmpeg -loop 1 -i bg.jpg -i output/test.mp4 -filter_complex ‘overlay(W-w)/2:(H-h)/2:short…...

C++ 将字符串解析为argc、argv

文章目录 前言一、如何实现&#xff1f;1、实现split2、split双引号3、奇数下标元素加入结果4、偶数下标元素split空格 二、完整代码三、使用示例1、解析命令行2、构造argc、argv 总结 前言 一般开启子进程的时候&#xff0c;需要传参数&#xff0c;通常直接传输命令行字符串&…...

怎么做微信在线预约

在快节奏的现代生活中&#xff0c;我们总是追求更高效、更便捷的服务体验。而微信&#xff0c;这个拥有数亿用户的社交平台&#xff0c;早已不仅仅是一个聊天工具&#xff0c;它更是一个融合了多种功能的综合性服务平台。今天&#xff0c;就让我们一起探讨如何通过微信在线预约…...

KING大咖直播 | KES RAC如何成为核心系统首选?

核心系统负载高 停机代价大 KES RAC来了 KingbaseES共享存储集群 不仅满足您对数据库 扩展性与可用性的严苛要求 更能在保障性能的同时 实现低成本、高效益 是企业核心系统的理想选择 5月16日19:30-20:30 锁定金仓数据库视频号 人大金仓高级研发工程师 深度揭秘如何实现 Kingba…...