【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制
目录
一、概述
1.1. 缓冲区管理的重要性
1.2. 实现方式
1.2.1. HCI_Read_Buffer_Size 命令
1.2.2. HCI_Number_Of_Completed_Packets 事件
1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令
1.2.4. HCI_Host_Buffer_Size 命令
1.2.5. HCI_Host_Number_Of_Completed_Packets 命令
二、缓冲区管理
2.1. 蓝牙设备初始化与数据传输确认
2.1.1. 读取控制器缓冲区大小
2.1.2. 数据传输与确认
2.1.3. 生成完成数据包事件
2.1.4. 示例代码
2.2. 蓝牙设备初始化与主机流控及数据接收确认
2.2.1. 设置主机流控制
2.2.2. 通知主机缓冲区大小
2.2.3. 数据接收与确认
2.2.4. 示例代码
三、流量控制
3.1. 流量控制的工作原理
3.1.1. 缓冲区状态监控
3.1.2. 流量控制信号
3.1.3. 动态调整速率
3.2. 流量控制的作用和意义
四、总结
在资源受限的设备中,有效管理缓冲区至关重要。缓冲区作为数据传输的临时存储区域,其管理效率直接影响数据传输速度和设备整体性能。通过优化缓冲区分配策略,如动态调整缓冲区大小、采用先进先出(FIFO)等策略,可以提高数据处理的实时性和吞吐量。同时,避免缓冲区溢出和欠载也是关键,这要求设备能实时监控缓冲区状态,并根据实际情况进行动态调整。有效管理缓冲区不仅能提升数据传输效率,还能确保设备在资源有限的情况下保持最佳性能。
一、概述
1.1. 缓冲区管理的重要性
对于资源有限的设备(resource limited devices),如一些小型的物联网设备、嵌入式设备或者早期的移动设备等,它们的存储容量、处理能力等资源相对较少。在这种情况下,缓冲区管理显得尤为重要。缓冲区是内存中用于临时存储数据的区域,有效的缓冲区管理可以确保数据在传输过程中不会丢失,同时最大限度地利用有限的设备资源。不合理的缓冲区管理可能会导致资源的浪费或者数据传输错误。例如,如果缓冲区设置得过大,会占用过多本来就有限的内存资源;如果设置得过小,又可能无法有效地缓冲数据,导致数据丢失或者频繁地进行数据重传,这会消耗额外的能量和带宽等资源。
1.2. 实现方式
在蓝牙技术中,缓冲区管理可以通过主机控制器接口(HCI)的一系列命令和事件来实现。这些命令和事件允许主机和控制器之间协调数据的传输和接收。
1.2.1. HCI_Read_Buffer_Size 命令
- 这个命令用于读取主机控制器(Host Controller)中的缓冲区大小。在设备初始化或者数据传输开始之前,通过这个命令获取缓冲区大小的信息是很关键的。
- 例如,设备可以根据读取到的缓冲区大小来决定每次发送多少数据量是合适的。如果缓冲区大小为 1024 字节,发送端可能会将数据分成大小合适的数据包,避免一次性发送过多数据导致缓冲区溢出。
1.2.2. HCI_Number_Of_Completed_Packets 事件
- 当一个 HCI(Host - Controller Interface)数据包成功传输到远程设备(remote device),并且收到了基带(Baseband)的确认信息后,就会产生这个事件。这一事件可以让主机(Host)了解到数据传输的完成情况,并根据需要调整发送速率。
- 例如,在蓝牙通信中,当手机(作为主机)向蓝牙耳机(远程设备)发送音频数据包后,一旦蓝牙耳机确认收到数据包,手机就会收到这个事件通知。主机可以利用这个事件来跟踪数据传输的进度,进而调整后续的数据发送策略,比如根据已完成数据包的数量和时间间隔来决定是否需要加快或减慢数据发送速度。
1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令
- 该命令用于设置从控制器到主机方向的流量控制。在数据从控制器传输到主机的过程中,通过启用流量控制,主机可以限制控制器发送数据的速率,从而防止数据过载并优化资源利用。
- 例如,如果主机的处理能力有限,无法快速处理从控制器接收的数据,可以使用这个命令来限制控制器的数据发送速度,以避免主机的缓冲区溢出。这就像是在一条数据 “河流” 上安装了一个 “水闸”,可以根据主机的实际情况控制数据流入主机的速度。
1.2.4. HCI_Host_Buffer_Size 命令
- 主机通过这个命令向控制器通知自己的缓冲区大小。这样控制器就能够了解主机的接收能力,从而合理地发送数据。
- 例如,主机可以告诉控制器自己的缓冲区还剩下多少空间可以接收新的数据,控制器就可以根据这个信息来决定发送多少数据以及何时发送。这就好比主机告诉控制器自己的 “仓库” 还有多少空位可以存放货物(数据),让控制器能够合理安排 “发货”(发送数据)。
1.2.5. HCI_Host_Number_Of_Completed_Packets 命令
- 当控制器从远程设备接收到数据包并向主机发送一个 HCI 数据包后,主机需要发送这个命令来确认收到,并允许控制器根据需要调整其发送策略。这一确认过程对于维持数据传输的连贯性非常重要。
- 例如,它可以让控制器知道主机已经成功接收了数据包,从而可以继续发送下一个数据包。就像在一个快递流程中,收件人(主机)签收(发送确认命令)后,快递员(控制器)才知道包裹已经安全送达,可以继续派送下一个包裹。
这些HCI命令和事件共同构成了蓝牙技术中缓冲区管理和流量控制的基础。它们允许主机和控制器之间有效地协调数据传输,确保在资源受限的设备中实现高效、可靠的数据通信。
二、缓冲区管理
2.1. 蓝牙设备初始化与数据传输确认
在蓝牙设备的初始化阶段,主机(Host)会执行一系列关键操作以确保与控制器(Controller)之间的有效通信。其中,读取控制器可用的缓冲区大小是至关重要的一步。具体步骤如下:
2.1.1. 读取控制器缓冲区大小
- 在初始化过程中,主机通过发送特定的命令(如
HCI_Read_Buffer_Size
)来查询控制器当前可用的缓冲区大小。 - 控制器接收到此命令后,会返回其缓冲区容量的信息,这有助于主机在后续的数据传输过程中做出合理的决策。
2.1.2. 数据传输与确认
- 初始化完成后,主机开始通过控制器向远程设备发送HCI数据包。
- 当数据包成功传输到远程设备后,远程设备的基带层会发送一个确认信号(acknowledgment)给控制器,表示数据已成功接收。
2.1.3. 生成完成数据包事件
- 控制器在接收到基带层的确认信号后,会生成一个
HCI_Number_Of_Completed_Packets
事件。 - 这个事件包含了已成功传输的数据包的数量,以及可能的其他相关信息。
- 主机通过监听这个事件,可以实时了解数据传输的进度和状态。
在蓝牙设备的初始化阶段,主机通过读取控制器的缓冲区大小来为后续的数据传输做准备。当数据包成功传输到远程设备并收到确认信号后,控制器会生成一个事件来通知主机已完成的数据包数量。这一机制确保了主机能够实时跟踪数据传输的进度,并根据需要调整传输策略。
2.1.4. 示例代码
以下是一个简化的代码示例,用于模拟上述蓝牙通信流程中的关键步骤。请注意,此示例并未涵盖所有实际的蓝牙通信细节和错误处理机制,而是聚焦于展示初始化、数据传输确认以及完成数据包事件生成的基本流程。
#include <stdio.h>
#include <stdbool.h>// 假设的结构体,用于模拟控制器和HCI数据包
typedef struct {int bufferSize; // 缓冲区大小
} Controller;typedef struct {int packetId; // 数据包标识符// 其他数据包字段...
} HCI_Packet;// 模拟读取控制器缓冲区大小的函数
void HCI_Read_Buffer_Size(Controller* controller) {// 在实际应用中,此函数会向控制器发送命令并接收响应// 这里我们直接设置缓冲区大小为示例值controller->bufferSize = 1024; // 假设缓冲区大小为1024字节printf("Controller buffer size: %d bytes\n", controller->bufferSize);
}// 模拟数据传输的函数
bool Send_HCI_Packet(Controller* controller, HCI_Packet* packet) {// 在实际应用中,此函数会通过控制器向远程设备发送数据包// 并等待基带层的确认信号// 这里我们直接模拟成功传输printf("Sending HCI packet with ID: %d\n", packet->packetId);// 假设基带层已发送确认信号return true;
}// 模拟生成完成数据包事件的函数
void Generate_Completed_Packets_Event(int numberOfCompletedPackets) {// 在实际应用中,此函数会根据控制器的内部状态生成事件// 并通知主机printf("Generated HCI_Number_Of_Completed_Packets event with %d completed packets\n", numberOfCompletedPackets);
}int main() {Controller controller;HCI_Packet packet;// 初始化HCI_Read_Buffer_Size(&controller);// 准备数据包packet.packetId = 1; // 为数据包设置标识符// 发送数据包并等待确认if (Send_HCI_Packet(&controller, &packet)) {// 假设我们发送了一个数据包,并收到确认Generate_Completed_Packets_Event(1); // 生成完成数据包事件}return 0;
}
在这个示例中,我们定义了Controller
和HCI_Packet
结构体来模拟控制器和数据包。HCI_Read_Buffer_Size
函数模拟了读取控制器缓冲区大小的过程,Send_HCI_Packet
函数模拟了数据包的发送和确认过程,而Generate_Completed_Packets_Event
函数则模拟了生成完成数据包事件的过程。
请注意,这个示例代码仅用于教学目的,并未涵盖蓝牙通信中的复杂性和细节。在实际应用中,需要使用蓝牙协议栈提供的API来实现这些功能,并处理各种可能的错误和异常情况。
2.2. 蓝牙设备初始化与主机流控及数据接收确认
在蓝牙设备的初始化阶段,除了配置控制器和读取缓冲区大小外,主机还需要通知控制器使用主机流控制,并告知主机可用的缓冲区大小。这一步骤对于确保数据在主机和控制器之间的高效、有序传输至关重要。具体步骤:
2.2.1. 设置主机流控制
- 在初始化过程中,主机通过发送特定的命令(HCI_Set_Controller_To_Host_命令)来通知控制器,主机将使用流控制机制来管理数据的接收。
- 流控制机制允许主机在控制器发送数据之前,通过某种方式(如发送一个允许发送数据的信号)来限制数据的传输速率,从而防止主机缓冲区溢出。
2.2.2. 通知主机缓冲区大小
- 主机在通知控制器使用流控制的同时,还会告知控制器主机当前可用的缓冲区大小。
- 这有助于控制器在发送数据之前评估是否有足够的空间来存储即将发送的数据包,从而避免数据丢失或传输错误。
- 就好比主机告诉控制器自己有多大的 “仓库容量”,让控制器心里有数,避免发送过多数据而 “撑爆” 主机的缓冲区,或者发送数据过少而影响整体的数据传输效率。
2.2.3. 数据接收与确认
- 当控制器从远程设备(remote device)接收到一个数据数据包后,它会将这些数据包封装成HCI数据包,并发送给主机。
- 主机在接收到这些数据包后,需要通过发送
HCI_Host_Number_Of_Completed_Packets
命令来确认数据的接收。这个命令通常包含了一个或多个已接收并成功处理的数据包的数量,以及可能的其他相关信息(如数据包的句柄或标识符)。 - 这一确认操作有着重要意义,它相当于给控制器一个反馈信号,让控制器明确知晓主机已经成功接收到了相应的数据。只有这样,控制器才能放心地继续接收下一个来自远程设备的数据,并按照既定的规则和流程向主机发送后续的数据包,确保整个数据接收流程能够有条不紊地持续进行下去。如果没有这个确认环节,控制器就无法确定主机是否真正接收到了数据,可能会出现重复发送数据包或者暂停发送数据等影响数据传输效率和准确性的情况。
在蓝牙设备的初始化阶段,主机通过配置控制器来使用主机流控制,并通知控制器主机可用的缓冲区大小。当控制器从远程设备接收到数据包并发送给主机后,主机通过发送确认命令来反馈数据的接收情况。这一机制确保了数据在主机和控制器之间的有序传输,并防止了数据丢失或缓冲区溢出的问题。
2.2.4. 示例代码
以下是一个简化代码示例,旨在模拟设置主机流控制、通知主机缓冲区大小以及数据接收与确认。请注意,此示例并未涵盖所有实际的蓝牙通信细节和错误处理机制,而是专注于展示核心流程。
#include <stdio.h>
#include <stdbool.h>// 假设的结构体,用于模拟控制器、主机和数据包
typedef struct {bool flowControlEnabled; // 流控制是否启用int hostBufferSize; // 主机缓冲区大小
} Controller;typedef struct {int packetId; // 数据包标识符// 其他数据包字段...
} HCI_Packet;// 模拟设置主机流控制的函数
void HCI_Set_Controller_To_Host_Flow_Control(Controller* controller, bool enable) {controller->flowControlEnabled = enable;printf("Host flow control set to: %s\n", enable ? "enabled" : "disabled");
}// 模拟通知控制器主机缓冲区大小的函数
void Notify_Controller_Host_Buffer_Size(Controller* controller, int bufferSize) {controller->hostBufferSize = bufferSize;printf("Notified controller of host buffer size: %d bytes\n", bufferSize);
}// 模拟控制器发送数据包给主机的函数
bool Send_Packet_To_Host(Controller* controller, HCI_Packet* packet) {// 在实际应用中,此函数会检查流控制和缓冲区大小// 这里我们直接模拟成功发送if (controller->flowControlEnabled && controller->hostBufferSize > 0) {printf("Sending packet with ID: %d to host\n", packet->packetId);// 假设发送后缓冲区大小减少controller->hostBufferSize -= sizeof(HCI_Packet); // 简化处理,实际应考虑数据包真实大小return true;} else {printf("Failed to send packet due to flow control or buffer size constraints\n");return false;}
}// 模拟主机确认接收数据包的函数
void HCI_Host_Confirm_Received_Packets(int numberOfPackets) {printf("Host confirmed receipt of %d packets\n", numberOfPackets);// 在实际应用中,此函数可能会向控制器发送确认信号
}int main() {Controller controller;HCI_Packet packet;// 初始化HCI_Set_Controller_To_Host_Flow_Control(&controller, true);Notify_Controller_Host_Buffer_Size(&controller, 1024); // 假设主机缓冲区大小为1024字节// 准备数据包packet.packetId = 1; // 为数据包设置标识符// 发送数据包并等待确认(模拟)if (Send_Packet_To_Host(&controller, &packet)) {// 假设我们发送了一个数据包,并收到主机的确认HCI_Host_Confirm_Received_Packets(1); // 确认接收数据包// 在实际应用中,这里可能需要更新控制器的内部状态// 例如,增加可用缓冲区大小或更新数据包计数器}// 注意:此示例未涵盖所有错误处理和恢复机制// 在实际应用中,需要添加适当的错误检查和恢复代码return 0;
}
在这个示例中,我们定义了Controller
和HCI_Packet
结构体来模拟控制器和数据包。HCI_Set_Controller_To_Host_Flow_Control
函数模拟了设置主机流控制的过程,Notify_Controller_Host_Buffer_Size
函数模拟了通知控制器主机缓冲区大小的过程,Send_Packet_To_Host
函数模拟了控制器发送数据包给主机的过程(并检查了流控制和缓冲区大小),而HCI_Host_Confirm_Received_Packets
函数则模拟了主机确认接收数据包的过程。
请注意,这个示例代码仅用于教学目的,并未涵盖蓝牙通信中的复杂性和细节。在实际应用中,需要使用蓝牙协议栈提供的API来实现这些功能,并处理各种可能的错误和异常情况。
三、流量控制
流量控制机制是蓝牙通信中一个重要的组成部分,它确保了数据在主机和控制器之间能够高效、有序地传输,而不会导致过载或数据丢失。通过动态地调整数据传输的速率,流量控制机制能够适应网络条件和设备资源的变化,从而保持数据传输的稳定性和可靠性。
3.1. 流量控制的工作原理
在蓝牙通信中,流量控制机制通常依赖于主机和控制器之间的协作。以下是流量控制的一些基本原理:
3.1.1. 缓冲区状态监控
- 主机和控制器都会监控各自缓冲区的状态,包括缓冲区的大小、已使用空间和剩余空间等。
- 当缓冲区满或接近满时,表明接收端可能无法及时处理更多的数据,此时需要限制数据的传输速率。
- 相反,当缓冲区有空闲空间时,表明接收端有能力处理更多的数据,此时可以增加数据的传输速率。
3.1.2. 流量控制信号
- 为了实现流量控制,主机和控制器之间会交换特定的流量控制信号。
- 例如,当主机缓冲区满时,它可以向控制器发送一个“停止发送”的信号,以暂停数据的传输。
- 当主机缓冲区有空闲空间时,它会向控制器发送一个“继续发送”的信号,以恢复数据的传输。
3.1.3. 动态调整速率
- 根据缓冲区的状态和流量控制信号,主机和控制器可以动态地调整数据传输的速率。
- 这种调整可以是渐进的,也可以是突然的,具体取决于网络条件和设备资源的变化情况。
3.2. 流量控制的作用和意义
流量控制机制在蓝牙通信中发挥着重要的作用,具体表现在以下几个方面:
- 防止数据丢失:通过限制数据传输的速率,流量控制机制可以防止因缓冲区溢出而导致的数据丢失问题。
- 提高数据传输效率:通过动态地调整数据传输的速率,流量控制机制可以确保数据在主机和控制器之间以最高的效率进行传输。
- 适应网络条件变化:流量控制机制能够根据网络条件的变化(如带宽变化、延迟变化等)来动态地调整数据传输的速率,从而确保数据传输的稳定性和可靠性。
- 优化设备资源利用:通过合理地分配和利用设备资源(如缓冲区空间、CPU时间等),流量控制机制可以优化设备的整体性能。
流量控制机制是蓝牙通信中一个不可或缺的组成部分。它确保了数据在主机和控制器之间能够高效、有序地传输,同时防止了资源耗尽或数据丢失的问题。在实际应用中,我们需要根据具体的网络条件和设备资源来选择合适的流量控制策略,以实现最佳的数据传输效果。
四、总结
这种基于主机缓冲区状态动态调整数据传输速率的流量控制机制,具有多方面的优势。一方面,它有助于维持数据传输的流畅性,使得数据能够按照一个相对稳定、合理的节奏在主机和控制器之间流转,不会出现长时间的停顿或者频繁的数据丢失、重传等情况,保障了数据通信的连贯性,还是对于数据完整性要求严格的文件传输等场景,都能提供良好的支持。
另一方面,通过有效地避免资源耗尽或数据丢失问题,它可以让整个系统更加稳定可靠地运行。避免资源耗尽意味着设备不会因为过度接收数据而导致内存溢出、CPU 占用过高无法响应等故障,延长了设备的使用寿命,同时也提升了用户体验;而避免数据丢失则确保了数据的完整性和准确性,对于涉及重要信息(如金融交易数据、企业关键业务数据等)的传输场景尤为关键,从根本上保障了数据通信的质量和安全性。
相关文章:
【消息序列】详解(6):深入探讨缓冲区管理与流量控制机制
目录 一、概述 1.1. 缓冲区管理的重要性 1.2. 实现方式 1.2.1. HCI_Read_Buffer_Size 命令 1.2.2. HCI_Number_Of_Completed_Packets 事件 1.2.3. HCI_Set_Controller_To_Host_Flow_Control 命令 1.2.4. HCI_Host_Buffer_Size 命令 1.2.5. HCI_Host_Number_Of_Complete…...
Java开发经验——Spring Test 常见错误
摘要 本文详细介绍了Java开发中Spring Test的常见错误和解决方案。文章首先概述了Spring中进行单元测试的多种方法,包括使用JUnit和Spring Boot Test进行集成测试,以及Mockito进行单元测试。接着,文章分析了Spring资源文件扫描不到的问题&am…...
麦肯锡报告 | 科技落地的真谛:超越技术本身的价值创造
科技创新正在以惊人的速度改变企业运作和客户体验,但实现其潜力的关键在于正确的策略、流程、文化和人才。麦肯锡强调了一个理念:Never just tech(不仅仅是技术)。这表明,成功的数字化转型不仅依赖于技术,还…...
React 常见问题解答:设置、安装、用户事件和最佳实践
在本文中,我们将回答您在开始使用 React 时可能会问的 9 个常见问题。 1、开始使用 React 需要哪些技能和知识? 在深入研究 React 之前,您应该对以下内容有深入的了解: HTML、CSS 和 JavaScript (ES6)&a…...
Mairadb 最大连接数、当前连接数 查询
目录 查询数据库 最大连接数 查询当前连接总数 环境 Mariadb 10.11.6 跳转mysql数据库: 查询数据库 最大连接数 show variables like max_connections; 注意; 这个版本不能使用 : show variables like ‘%max_connections%’; 会报错 ÿ…...
【R库包安装】R库包安装总结:conda、CRAN等
【R库包安装】R库包安装总结:conda、CRAN等 方法1:基于 R 的 CRAN 仓库安装CRAN库包查询从 CRAN 安装 方法2:使用conda安装库包确保已安装 R 和 Conda 环境使用 Conda 官网浏览是否存在相应库包Conda 安装 R 库 方法3:从 GitHub 安…...
php反序列化1_常见php序列化的CTF考题
声明: 以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…...
LabVIEW动态显示控件方案
在LabVIEW开发中,涉及到动态显示和控制界面的设计时,经常需要根据用户选择的不同参数来动态显示或隐藏相关控件。例如,某些能可能会根据“Type”控件的不同选择显示不同的参数,如“Target”、“Duration”和“EndType”等。在一个…...
游戏引擎学习第22天
移除 DllMain() 并成功重新编译 以下是对内容的详细复述与总结: 问题和解决方案: 在编译过程中遇到了一些问题,特别是如何告知编译器不要退出程序,而是继续处理。问题的根源在于编译过程中传递给链接器的参数设置不正确。原本尝试…...
GitLab|GitLab报错:PG::ConnectionBad: could not connect to server...
错误信息: PG::ConnectionBad: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"? /opt/gitlab/embedded/service…...
Ray 和 PyTorch
Ray 和 PyTorch 的介绍 Ray 是什么? Ray 是一个用于 分布式计算和机器学习任务 的开源框架,提供了一个高效的、灵活的并行计算平台。它的核心功能是支持分布式计算,帮助开发者以简单的方式扩展 Python 应用程序。 Ray 适用于以下场景&…...
Qt之详解QLockFile 文件锁
文章目录 QLockFile 详解前言什么是 QLockFile?QLockFile 的构造函数和常用成员函数构造函数1. 指定锁文件路径的构造函数 常用成员函数1. lock2. unlock3. isLocked4. setStaleLockTime5. getLockInfo6. removeStaleLock 完整示例代码总结 QLockFile 详解 前言 在…...
从0开始学PHP面向对象内容之常用设计模式(组合,外观,代理)
二、结构型设计模式 4、组合模式(Composite) 组合模式(Composite Pattern)是一种结构型设计模式,它将对象组合成树形结构以表示”部分–整体“的层次结构。通过组合模式,客户端可以以一致的方式处理单个对…...
机械设计学习资料
免费送大家学习资源,已整理好,仅供学习 下载网址: https://www.zzhlszk.com/?qZ02-%E6%9C%BA%E6%A2%B0%E8%AE%BE%E8%AE%A1%E8%A7%84%E8%8C%83SOP.zip...
论文笔记3-XCube: Large-Scale 3D Generative Modeling using Sparse Voxel Hierarchies
目录 Abtract 相关工作 核心算法: 整体流程概述 具体流程解析 1. 输入(Input) 2. 稀疏结构 VAE(Sparse Structure VAE) 3.分层体素潜在扩散(Hierarchical Voxel Latent Diffusion)…...
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能
【组件】前端ElementUi 下拉Tree树形组件 带模糊搜索自动展开高亮功能 https://live.csdn.net/v/435737 <template><div><el-popoverstyle"overflow-y: auto; "placement"bottom"trigger"click"><el-inputstyle"margi…...
诠视科技受邀出席“中国虚拟现实产学研大会”
2024年11月2-3日,由中国虚拟现实技术与产业创新平台举办的第十届“中国虚拟现实产学研大会” 在北京顺利召开,大会围绕“虚拟现实技术与产业创新融合”这一主题进行深入探讨。诠视科技作为虚拟现实产业的创新领军企业,CEO林瓊受邀参加本次活动…...
【达梦数据库】授权查询
目录 授权查询EXPIRED_DATECLUSTER_TYPE 更换原则更换方法 授权查询 select * from v$license;EXPIRED_DATE 过期日期,如果是正式版会显示NULL CLUSTER_TYPE 授权使用的集群类型CLUSTER_TYPE,格式为字符串“XXXX”, 每一位上 0 表示禁止…...
探索 ZED 双目 3D 相机发展:ZED 2i 的创新功能扩展之路
在科技迅速发展的当下,3D 视觉技术在众多领域的发展中有着重要作用。Stereolabs 公司研发的 ZED 相机受到广泛关注。Stereolabs 于 2010 年在美国旧金山成立,一直专注于立体视觉和 3D 深度相机技术的研究。2015 年推出的 ZED 相机为无人机、机器人等设备…...
基于卷积神经网络的白菜病虫害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】
更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 白菜病虫害识别与防治系统,卷积神经网络,resnet50,mobilenet【pytorch框架,python源码】_哔哩哔哩_bilibili (一)简介 基于卷…...
计算机网络 | 7.网络安全
1.网络安全问题概述 (1)计算机网络面临的安全性威胁 <1>计算机网络面临的完全性威胁 计算机网络面临的两大类安全威胁:被动攻击和主动攻击 被动攻击 截获:从网络上窃听他人的通信内容。主动攻击 篡改:故意篡改…...
Opencv+ROS自编相机驱动
目录 一、工具 二、原理 代码 标定 三、总结 参考: 一、工具 opencv2ros ubuntu18.04 usb摄像头 二、原理 这里模仿usb_cam功能包对Opencv_ros进行修饰,加上相机参数和相机状态,难点在于相机参数的读取。 对于相机参数话题 camera…...
js---函数参数是值传递还是引用传递
理解1:都是值(基本/地址值)传递 理解2:可能是值传递,也可能是引用传递(地址值) 在JavaScript中,函数参数的传递方式取决于参数的类型: 值传递(Pass by Val…...
如何解决DDoS导致服务器宕机?
分布式拒绝服务攻击(DDoS攻击)是一种常见的网络安全威胁,通过大量恶意流量使目标服务器无法提供正常服务。DDoS攻击可能导致服务器宕机,严重影响业务的正常运行。本文将详细介绍如何检测和防御DDoS攻击,防止服务器宕机…...
临床检验项目指标学习笔记
声明: 家有病人,记录此学习笔记仅为了更好照顾家人。本文不负责内容的准确性和版权。如果存在侵权、或不希望被转载的媒体或个人可与我们联系,我将立即进行删除处理。 血脂四项 [Q&A] 血脂四项 指导意义 测定血清中血脂含量,…...
代码管理之Gitlab
文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…...
秒杀系统三层架构设计:缓存、消息队列与数据库
秒杀是一种极端高并发场景,短时间内数百万用户涌入,抢购有限库存的商品。为了保证系统稳定性和数据一致性,同时提升用户体验,我们可以设计一个三层架构:缓存层、消息队列层、数据库层。本文将详细设计这一架构并探讨其…...
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
官网链接:What is Tauri? | Tauri 初始准备 rust版本一定要1.77.2以上的版本,查看版本和升级版本: 升级命名: rustup update 不然会报错: error: package tauri-plugin-shell v2.0.2 cannot be built because it r…...
SCI论文部分题目
SC20243213 通过氢和氨集成增强Power-to-X灵活性和可持续成本降低:绿色实验室Skive案例研究 SC20243211 分析同时发电的综合系统中的能量和能量效率、环境影响和经济可行性,淡水、热水和天然气凝液 SC20243208 双燃料生物质-天然气系统中的氢、…...
使用PyTorch在AMD GPU上进行INT8量化实现精简化的LLM推理
Leaner LLM Inference with INT8 Quantization on AMD GPUs using PyTorch — ROCm Blogs 随着大型语言模型(LLMs)规模达到数千亿参数,我们在这些庞大模型中表示数据的方式极大地影响了训练所需的资源(例如,用于推理的…...
Solon 拉取 maven 包很慢或拉不了,怎么办?
注意:如果在 IDEA 设置里指定了 settings.xml,下面两个方案可能会失效。(或者直接拿 "腾讯" 的镜像仓库地址,按自己的习惯配置) 1、可以在项目的 pom.xml 添加 "腾讯" 的镜像仓库 "阿里&qu…...
spring的事务隔离?
在Spring中,事务的隔离级别是指在多事务并发执行时,事务之间的隔离程度,隔离级别定义了一个事务可以看到另一个事务的哪些数据,Spring事务管理器允许通过Transactional注解或者xml配置来指定事务的隔离级别。 事务的隔离级别有以…...
13 —— 开发环境调错-source map
问题:代码被压缩后,无法正确定位源代码的位置(行数和列数) source map:准确追踪error和warning在原始代码的位置 —— webpack.config.js配置devtool选项 module.exports { devtool: inline-source-map }; inline-s…...
【大数据分析深度学习】在Hadoop上实现分布式深度学习
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘,以提取有价值的信息和洞察。它结合了大数据技术、人工智能(AI)、机器学习(ML&a…...
【Linux探索学习】第十六弹——进程地址空间:深入解析操作系统中的进程地址空间
Linux学习笔记: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 进程地址空间是操作系统进程管理的重要概念之一,它定义了进程在执行时所能访问的内存布局。理解进程地址空间不仅有助于掌握操…...
【数据结构与算法】相交链表、环形链表(判断是否有环)、环形链表(返回入环节点)
主页:HABUO🍁主页:HABUO 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 1.相交链表 题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表…...
hubuctf-2024校赛-复现wp
web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…...
.NET Core发布网站报错 HTTP Error 500.31
报错如图: 解决办法: 打开任务管理器》》服务》》找到这仨服务,右键启动即可,如果已经启动了就重启:...
RTSP摄像头、播放器为什么需要支持H.265?
H.264还是H.265? 好多开发者在做选RTSP播放器的时候,经常问我们的问题是,用H.264好还是H.265好?本文我们就H.264 和 H.265的主要区别和适用场景,做个大概的交流。 一、压缩效率 H.265 更高的压缩比 H.265 在相同视频…...
brynet源码阅读——解决文件描述符耗尽问题mIdle
1、背景 在高并发服务器程序中,文件描述符资源是有限的。当一个程序同时处理多个网络连接时,每个连接都会占用一个文件描述符。如果系统没有足够的文件描述符可用,调用 accept()(用于接收新的连接)或其他文件操作时可…...
学习Zookeeper
Zookeeper有手就行 1. 初识ZooKeeper1.1 安装ZooKeeper1.2 ZooKeeper命令操作1.2.1 Zookeeper数据模型1.2.2 Zookeeper 服务端常用命令1.2.3 Zookeeper客户端常用命令 2. ZooKeeperJavaAPl操作2.1 Curator介绍2.2 CuratorAPI常用操作2.2.0 引入Curator支持2.2.1 建立连接2.2.2 …...
css效果
css炫彩流光圆环效果 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>*{margin: 0;padding: 0;}body{width: 100%;height: 100vh;}.container{position: relative;width: 100%;height: 100vh…...
【Python爬虫五十个小案例】爬取豆瓣电影Top250
博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🪲前言 在这篇博客中,我们将学习如何使用Python爬取豆瓣电影Top250的数据。我们将使用requests库来发送HTTP请求,…...
「Mac玩转仓颉内测版25」基础篇5 - 布尔类型详解
本篇将介绍 Cangjie 中的布尔类型,包括布尔值的定义、运算操作符、逻辑运算、布尔类型的常见应用场景及其在条件判断中的应用,帮助开发者理解和使用布尔类型。 关键词 布尔类型定义布尔运算逻辑运算符条件判断常见应用场景 一、布尔类型概述 布尔类型&…...
electron主进程和渲染进程之间的通信
主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…...
在 Spring Boot 中实现多种方式登录(用户名、手机号、邮箱等)的不正经指南
欢迎来到一场技术与幽默交织的冒险!今天,我们将跳进 Spring Boot 的世界,探索如何通过 用户名、手机号、邮箱 等多种方式实现登录。想象一下,用户在登录时可以随心所欲地选择——就像你今天早上纠结到底是要喝美式咖啡还是拿铁&am…...
JVM标量替换
JVM标量替换 简单来说 JVM 中的标量替换是一种编译优化技术,将未逃逸对象拆解成不能再分,标量在栈帧或寄存器中分配使用。将对象拆解后直接使用标量,不但避免了完整对象的创建和后续回收流程,而且能更快地获取和操作相应的数据&…...
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
前言 我们先简单了解一下PyTorch、Keras、Scikit-learn和TensorFlow都是什么。 想象一下你要盖一座大房子。你需要砖头、水泥、工具等等,对吧?机器学习也是一样,需要一些工具来帮忙。PyTorch、Keras、Scikit-learn和TensorFlow就是四种不同的…...
C语言蓝桥杯组题目
系列文章目录 文章目录 系列文章目录前言题目第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?思路 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少…...
用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...