深入探究蓝牙节能技术:SNIFF与HOLD模式

目录

一、概述

1.1. Sniff Mode(嗅探模式/呼吸模式)

1.1.1.定义与目的

1.1.2 工作原理

1.1.3 进入与退出

1.2. Hold Mode(保持模式)

1.2.1. 定义与目的

1.2.2. 工作原理

1.2.3. 进入

1.2.4. 通知机制

二、Sniff mode(嗅探模式)

2.1. Sniff mode命令

2.1.1. HCI_Sniff_Mode命令

2.1.2. HCI_Exit_Sniff_Mode命令

2.2. 进入和退出Sniff mode的步骤

2.2.1. 进入Sniff mode的步骤

2.2.2. 退出Sniff mode的步骤

2.3. 示例代码

2.4. 注意事项

三、Hold mode(保持模式)

3.1. Hold mode命令

3.2. 进入Hold mode的步骤

3.3. 结束Hold mode的步骤

3.4. 示例代码

3.4. 注意事项

四、Sniff模式与Hold模式的比较

4.1. 功耗节省程度

4.2. 数据传输及时性

4.3.  适用设备类型

五、应用场景

5.1. Sniff模式的应用场景

5.2. Hold模式的应用场景

六、总结


嗅探模式(Sniff Mode)和保持模式(Hold Mode)作为蓝牙设备的两种节能工作模式。要进入Sniff mode 或Hold mode,需要先建立一个ACL(Asynchronous Connectionless Link,简称 ACL)连接 。这两种模式的应用,不仅提高了蓝牙设备的节能性能,还使其能够更灵活地适应不同的应用场景。通过合理选择和配置这两种模式,蓝牙设备可以在保证连接稳定性的同时,实现更高效的能耗管理。

一、概述

1.1. Sniff Mode(嗅探模式/呼吸模式)

进入嗅探模式的首要前提是成功建立ACL连接。ACL 连接作为蓝牙设备间通信的基石,不仅确保了数据的可靠传输,还为后续高级模式的启用提供了必要的通道。在 ACL 连接的框架下,主设备与从设备之间能够进行一系列的参数协商与模式切换操作,从而为嗅探模式的顺利启动奠定基础。

1.1.1.定义与目的

  • Sniff Mode通过减少主从设备的监听频率,有效节省了电源。

  • 在这种模式下,设备仍然保持连接,但只在特定时间间隔内进行通信,从而降低了整体的能耗。

  • 这种模式特别适用于需要长时间保持连接但通信频率不高的应用场景。

1.1.2 工作原理

  • 在嗅探模式下,从设备会按照特定的时间间隔周期性地监听主设备发送的数据包。

  • 与持续保持接收状态不同,这种周期性的监听机制使得从设备在大部分时间内可以处于相对低功耗的状态。

  • 例如,从设备可能每隔若干毫秒开启一次接收窗口,在这个窗口期间监听主设备是否有数据包发送,如果没有则继续进入低功耗休眠状态,等待下一个监听周期的到来。通过这种方式,嗅探模式有效地减少了从设备不必要的功耗消耗,同时又能保证其及时接收主设备发送的重要信息,维持蓝牙连接的有效性。

1.1.3 进入与退出

  • 使用HCI_Sniff_Mode命令进入嗅探模式。

  • 使用HCI_Exit_Sniff_Mode命令退出嗅探模式。

1.2. Hold Mode(保持模式)

与嗅探模式类似,保持模式的启动依赖于已建立的 ACL 连接。ACL 连接在保持模式下扮演着连接状态 “守护者” 的角色,它确保设备在进入低功耗的保持状态后,依然能够与主设备保持关联,并在需要时顺利恢复通信。

1.2.1. 定义与目的

  • Hold Mode是蓝牙节能模式中最简单的一种,是一种更为极端的节能方式。

  • 当设备进入保持模式时,它会暂停当前连接的数据传输,但仍然保持连接状态。

  • 这样,设备可以在不丢失连接的情况下,进一步降低功耗。当需要恢复通信时,设备可以迅速从保持模式中退出,重新建立数据传输。

1.2.2. 工作原理

  • 在Hold模式下,设备会暂停当前的蓝牙通信活动,进入一种低功耗的等待状态。

  • 设备会保留与主设备的连接信息,包括蓝牙地址、配对密钥等相关参数,但停止主动的数据传输与接收操作。

  • 例如,设备内部的蓝牙模块可能会关闭部分不必要的电路或功能模块,以降低功耗。直到被主设备唤醒或满足一定的唤醒条件,如经过了预设的保持时间、接收到特定的唤醒信号等,设备才会重新启动蓝牙通信功能,恢复到正常的工作状态并与主设备进行数据交互。

1.2.3. 进入

  • 使用HCI_Hold_Mode命令将设备设置为保持模式。

  • 控制器可以通过协商保持模式参数或强制保持模式来做到这一点。

1.2.4. 通知机制

  • 当保持模式完成时,使用HCI_Mode_Change事件通知主机。

二、Sniff mode(嗅探模式)

要进入嗅探模式(Sniff mode)需要使用 “HCI_Sniff_Mode” 命令,而若要退出嗅探模式,则需使用 “HCI_Exit_Sniff_Mode” 命令。这两个命令为设备在嗅探模式的进入与退出操作方面提供了明确的控制手段,就如同开启和关闭一扇特定功能的大门一样,让设备能按照需求切换工作状态。

2.1. Sniff mode命令

2.1.1. HCI_Sniff_Mode命令

  • 作用:用于使蓝牙设备进入Sniff模式。

  • 参数协商:在进入Sniff模式之前,主机和从机需要通过LMP(链路管理协议)的SNIFF_REQ PDU(协议数据单元)来协商Sniff模式的参数。这些参数可能包括嗅探间隔(Sniff Interval)、嗅探尝试次数(Sniff Attempt)和嗅探超时时间(Sniff Timeout)等。

  • 多次发送:由于参数协商可能需要多次通信,因此主机可能会发送多个LMP_SNIFF_REQ PDUs。

2.1.2. HCI_Exit_Sniff_Mode命令

  • 作用:用于使蓝牙设备退出Sniff模式。

  • 执行时机:当设备不再需要节省功耗或需要恢复正常的数据传输时,主机可以使用此命令使设备退出Sniff模式。

2.2. 进入和退出Sniff mode的步骤

2.2.1. 进入Sniff mode的步骤

  • 主机发送请求:主机通过HCI接口向蓝牙控制器发送HCI_Sniff_Mode命令,请求进入Sniff模式。

  • 参数协商:蓝牙控制器和连接的对端设备开始通过LMP协议协商Sniff模式的参数。这可能需要多次发送LMP_SNIFF_REQ PDUs来完成。

  • 进入模式:一旦参数协商成功,蓝牙设备将进入Sniff模式,开始按照协商的参数进行通信。

2.2.2. 退出Sniff mode的步骤

当设备处于嗅探模式下,若主机决定要退出该模式,就会发起相应的请求。这个请求会触发一系列操作,使得设备能够从当前的嗅探模式工作状态平稳地切换回正常的工作模式,停止周期性的监听行为以及相应的低功耗控制机制,恢复到常规的持续可接收数据等状态,以便继续正常地与其他设备进行通信交互。

  • 主机发送请求:当需要退出Sniff模式时,主机通过HCI接口向蓝牙控制器发送HCI_Exit_Sniff_Mode命令。

  • 模式切换:蓝牙控制器接收到命令后,将设备从Sniff模式切换回正常的通信模式。

例如,以蓝牙耳机与手机的蓝牙连接为例。当耳机在音乐播放暂停等空闲时段,手机作为主机可以发送 “HCI_Sniff_Mode” 命令请求进入嗅探模式,期间通过多个 “LMP_SNIFF_REQ” PDUs 协商好合适的嗅探参数,让耳机以合适的周期和监听窗口进行监听,节省电量。而当音乐又要开始播放时,手机可以发送 “HCI_Exit_Sniff_Mode” 命令请求退出嗅探模式,耳机就会恢复到正常接收音频数据的状态,保障音乐能顺利播放,不会出现因处于嗅探模式而错过数据接收的情况。

2.3. 示例代码

以下是一个简化的代码示例,用于展示主机如何通过HCI接口请求进入和退出蓝牙的Sniff模式。请注意,这只是一个示例,实际实现会涉及更多细节,包括HCI命令的具体结构、错误处理、与蓝牙控制器通信的接口等。

#include <stdio.h>
#include <stdint.h>
#include <string.h>// 假设有一个与蓝牙控制器通信的接口函数
// 这些函数在实际应用中需要由蓝牙协议栈或硬件抽象层提供
extern int hci_send_command(uint8_t *command, uint16_t size);
extern int hci_receive_event(uint8_t *event, uint16_t size);// 示例:HCI_Sniff_Mode命令结构(简化版)
typedef struct {uint16_t opcode;       // HCI命令操作码uint8_t  connection_handle; // 连接句柄uint16_t sniff_interval;    // Sniff间隔(单位:slots)uint16_t sniff_attempt;     // Sniff尝试次数uint16_t sniff_timeout;     // Sniff超时(单位:slots)
} HCI_Sniff_Mode_Cmd;// 示例:HCI_Exit_Sniff_Mode命令结构(简化版)
typedef struct {uint16_t opcode;       // HCI命令操作码uint8_t  connection_handle; // 连接句柄
} HCI_Exit_Sniff_Mode_Cmd;// 示例:发送HCI_Sniff_Mode命令
int enter_sniff_mode(uint8_t connection_handle, uint16_t sniff_interval, uint16_t sniff_attempt, uint16_t sniff_timeout) {HCI_Sniff_Mode_Cmd cmd;cmd.opcode = 0xXXXX; // 替换为实际的HCI_Sniff_Mode命令操作码cmd.connection_handle = connection_handle;cmd.sniff_interval = sniff_interval;cmd.sniff_attempt = sniff_attempt;cmd.sniff_timeout = sniff_timeout;return hci_send_command((uint8_t*)&cmd, sizeof(cmd));
}// 示例:发送HCI_Exit_Sniff_Mode命令
int exit_sniff_mode(uint8_t connection_handle) {HCI_Exit_Sniff_Mode_Cmd cmd;cmd.opcode = 0xYYYY; // 替换为实际的HCI_Exit_Sniff_Mode命令操作码cmd.connection_handle = connection_handle;return hci_send_command((uint8_t*)&cmd, sizeof(cmd));
}int main() {uint8_t connection_handle = 0x01; // 示例连接句柄uint16_t sniff_interval = 0x0010; // 示例Sniff间隔uint16_t sniff_attempt = 0x0004;  // 示例Sniff尝试次数uint16_t sniff_timeout = 0x0200;  // 示例Sniff超时// 进入Sniff模式if (enter_sniff_mode(connection_handle, sniff_interval, sniff_attempt, sniff_timeout) != 0) {printf("Failed to enter Sniff mode\n");return -1;}printf("Entered Sniff mode\n");// 模拟一些操作,比如等待一段时间或接收某些事件// ...// 退出Sniff模式if (exit_sniff_mode(connection_handle) != 0) {printf("Failed to exit Sniff mode\n");return -1;}printf("Exited Sniff mode\n");return 0;
}
  • HCI命令操作码:上述代码中的0xXXXX0xYYYY需要替换为实际的HCI命令操作码。这些操作码可以在蓝牙核心规范中找到。

  • 连接句柄connection_handle是蓝牙连接的唯一标识符,需要根据实际连接情况设置。

  • 参数协商:上述代码未包含LMP协议参数协商的部分,需要在蓝牙控制器固件中实现,并通过HCI事件通知主机协商结果。

  • 错误处理:示例代码中的错误处理非常简化,实际应用中需要更详细的错误处理逻辑。

  • 与蓝牙控制器的通信hci_send_commandhci_receive_event函数是假设存在的,实际应用中需要实现这些函数以与蓝牙控制器进行通信。 

2.4. 注意事项

  • 在进入和退出Sniff模式时,设备需要确保连接的稳定性和数据的完整性。因此,参数协商和模式切换都需要在不影响正常通信的前提下进行。

  • Sniff模式适用于需要长时间保持连接但通信频率不高的应用场景。通过减少监听频率和通信次数,Sniff模式可以有效地降低设备的功耗。

Sniff模式是蓝牙技术中一种重要的节能模式。通过合理使用HCI_Sniff_Mode和HCI_Exit_Sniff_Mode命令,以及正确的参数协商和模式切换步骤,可以使蓝牙设备在保证连接稳定性的同时实现更高效的能耗管理。

三、Hold mode(保持模式)

3.1. Hold mode命令

HCI_Hold_Mode命令用于将蓝牙设备置于保持模式。在保持模式下,设备将暂停其正常的通信活动,以降低功耗。控制器可以通过协商保持模式参数或强制保持模式来使设备进入保持模式。一旦保持模式结束,设备将自动恢复到正常的通信状态。

3.2. 进入Hold mode的步骤

  • 主机请求保持模式:主机通过HCI接口向蓝牙控制器发送HCI_Hold_Mode命令,请求将设备置于保持模式。

  • 主机强制保持模式(可选):如果控制器未能通过协商参数成功使设备进入保持模式,或者主机需要立即进入保持模式,主机可以发送一个强制保持模式的命令。这将使设备立即进入保持模式,而不进行参数协商。

  • 外设请求保持模式较少见):在某些情况下,外设(如蓝牙耳机或扬声器)可能会主动请求进入保持模式。这通常发生在设备检测到一段时间内没有数据传输时,为了节省功耗而自动进入保持模式。

3.3. 结束Hold mode的步骤

  • 通知主机:当保持模式结束时(即达到了协商的时间长度或发生了其他触发事件),蓝牙控制器将向主机发送一个HCI_Mode_Change事件通知。这个通知将告诉主机设备已经退出了保持模式,并恢复到了正常的通信状态。

3.4. 示例代码

以下是一个简化的代码示例,用于展示如何通过HCI接口请求蓝牙设备进入和退出Hold模式。请注意,这只是一个示例,实际实现会涉及更多细节,包括HCI命令的具体结构、错误处理、与蓝牙控制器通信的接口等。

#include <stdio.h>
#include <stdint.h>
#include <string.h>// 假设有一个与蓝牙控制器通信的接口函数
// 这些函数在实际应用中需要由蓝牙协议栈或硬件抽象层提供
extern int hci_send_command(uint8_t *command, uint16_t size);
extern int hci_receive_event(uint8_t *event, uint16_t size, uint16_t *event_code);// 示例:HCI_Hold_Mode命令结构(简化版)
typedef struct {uint16_t opcode;       // HCI命令操作码uint8_t  connection_handle; // 连接句柄uint16_t hold_mode_duration; // 保持模式持续时间(单位:slots,0表示无限期)
} HCI_Hold_Mode_Cmd;// 示例:发送HCI_Hold_Mode命令
int enter_hold_mode(uint8_t connection_handle, uint16_t hold_mode_duration) {HCI_Hold_Mode_Cmd cmd;cmd.opcode = 0x0C1F; // 替换为实际的HCI_Hold_Mode命令操作码(根据蓝牙核心规范)cmd.connection_handle = connection_handle;cmd.hold_mode_duration = hold_mode_duration; // 0表示无限期,非0表示指定slots数return hci_send_command((uint8_t*)&cmd, sizeof(cmd));
}// 示例:处理HCI_Mode_Change事件
int handle_mode_change_event(uint8_t *event, uint16_t size) {// 根据蓝牙核心规范解析HCI_Mode_Change事件// 这里的解析是简化的,实际实现需要更详细的检查和处理uint8_t mode = event[2]; // 假设第3个字节是模式信息uint8_t connection_handle = event[3]; // 假设第4个字节是连接句柄(可能需要根据实际规范调整)if (mode == 0x00) { // 假设0x00表示正常模式printf("Exited Hold mode, connection handle: 0x%02X\n", connection_handle);} else {// 处理其他模式(如果需要)}// 根据需要返回状态码return 0;
}int main() {uint8_t connection_handle = 0x01; // 示例连接句柄uint16_t hold_mode_duration = 0; // 无限期保持模式// 进入Hold模式if (enter_hold_mode(connection_handle, hold_mode_duration) != 0) {printf("Failed to enter Hold mode\n");return -1;}printf("Entered Hold mode\n");// 等待或执行其他操作...// 注意:在实际应用中,这里可能需要一个循环来等待HCI_Mode_Change事件// 示例:接收并处理HCI_Mode_Change事件(这里需要一个事件循环或回调机制)uint8_t event_buffer[256];uint16_t event_code;while (1) { // 简化的事件循环,实际应用中需要更复杂的逻辑if (hci_receive_event(event_buffer, sizeof(event_buffer), &event_code) == 0) {if (event_code == 0x0E) { // 假设0x0E是HCI_Mode_Change事件的操作码handle_mode_change_event(event_buffer, sizeof(event_buffer));break; // 退出循环,因为已经处理了所需的事件}// 处理其他事件(如果需要)}// 可能需要添加延迟或检查其他条件以避免忙等待}printf("Program ends\n");return 0;
}
  • HCI命令操作码0x0C1F是示例操作码,需要替换为实际的HCI_Hold_Mode命令操作码。这些操作码可以在蓝牙核心规范中找到。

  • 事件处理handle_mode_change_event函数是简化的,实际实现需要根据蓝牙核心规范详细解析HCI_Mode_Change事件。

  • 事件循环:示例中的事件循环是简化的,实际应用中需要实现一个更复杂的事件处理机制,可能包括回调函数、状态机等。

  • 错误处理:示例代码中的错误处理非常简化,实际应用中需要更详细的错误处理逻辑。

  • 与蓝牙控制器的通信hci_send_commandhci_receive_event函数是假设存在的,实际应用中需要实现这些函数以与蓝牙控制器进行通信。这通常涉及到底层硬件接口(如UART、USB等)和蓝牙协议栈的集成。

3.4. 注意事项

  • 在进入和退出保持模式时,设备需要确保不会丢失任何重要的数据或命令。因此,在协商参数时,主机和外设需要仔细考虑保持模式的持续时间和触发条件。
  • 保持模式是一种有效的节能机制,特别适用于那些需要长时间待机但偶尔需要通信的设备。通过合理使用保持模式,可以显著降低设备的功耗并延长电池寿命。

Hold模式是蓝牙技术中一种重要的节能机制。通过合理使用HCI_Hold_Mode命令和正确的参数协商步骤,可以使蓝牙设备在保证连接稳定性的同时实现更高效的能耗管理。

四、Sniff模式与Hold模式的比较

4.1. 功耗节省程度

  • 嗅探模式:通过周期性监听主设备数据包的方式,在保证一定通信及时性的前提下,减少了从设备的持续接收时间,从而实现功耗的降低。但由于仍需要周期性地开启接收窗口,其功耗节省程度相对有限。

  • 保持模式:设备在保持模式下完全暂停通信活动,进入深度低功耗状态,关闭了大部分与通信相关的功能模块,因此其功耗节省程度通常比嗅探模式更高。但相应地,其恢复到正常工作状态所需的时间和资源也可能更多。

4.2. 数据传输及时性

  • 嗅探模式:由于从设备会周期性地监听主设备数据包,所以在主设备有数据发送时,从设备能够相对较快地接收到数据并进行处理,数据传输及时性较好。但如果从设备处于监听周期之外的休眠状态时,可能会存在一定的延迟。

  • 保持模式:在保持模式下,设备暂停了数据传输活动,只有在被唤醒后才会恢复数据传输。因此,在唤醒过程完成之前,数据传输会被中断,其数据传输及时性相对较差。但一旦唤醒,设备能够正常进行数据传输操作。

4.3.  适用设备类型

  • 嗅探模式:适用于那些需要在一定程度上节省电量,但又不能长时间中断与主设备数据连接的设备,如无线耳机、蓝牙传感器等需要及时响应主设备数据请求或事件触发的设备。

  • 保持模式:更适合于那些在一段时间内不需要进行数据传输,但又需要快速响应主设备唤醒操作的设备,如蓝牙鼠标、蓝牙手环等具有间歇性操作特点的设备。 

五、应用场景

蓝牙Sniff模式和Hold模式各自具有独特的应用场景,以下是对这两种模式应用场景的梳理。

5.1. Sniff模式的应用场景

1. 消费电子领域

  • 无线耳机:在音乐播放暂停、通话间隙等无音频数据传输时,进入 Sniff 模式降低功耗,延长续航,有新音频数据时又能迅速恢复正常接收,保障音频体验的连续性。

  • 蓝牙音箱:当音箱处于待机或暂停播放状态,且短期内无操作指令时,可进入 Sniff 模式节能,待有播放需求时快速响应。

  • 可穿戴设备:如智能手表,在开启单纯时间显示、计步等功能且与手机无大量数据交互时,采用 Sniff 模式减少与手机通信,节省电量,同时定时同步数据。

2. 医疗保健领域

  • 蓝牙医疗监测设备:像心率、血压监测仪,按一定时间间隔采集数据,采集间隙进入 Sniff 模式,降低功耗并延长电池使用周期,异常数据或接收到查询指令时能迅速恢复通信。

3. 工业物联网领域

  • 蓝牙传感器网络:用于设备状态监测、环境参数采集的温度、振动等传感器,正常运行时按频率采集传输数据,间隙进入 Sniff 模式节能,设备异常或有数据更新请求时快速响应恢复传输 ,提高传感器网络运行寿命。

5.2. Hold模式的应用场景

1. 消费电子领域

  • 蓝牙鼠标和键盘:当短时间无操作时,进入 Hold 模式降低功耗,节省电池电量,再次操作时能迅速唤醒恢复连接和数据传输,提供无延迟操作体验。

  • 蓝牙耳机:手机电量低且暂不需要使用耳机时,将耳机设为 Hold 模式减少对手机电量消耗;或耳机等待连接时进入 Hold 模式节能。

  • 蓝牙手环:在睡眠监测等无需实时传输数据时段进入 Hold 模式,记录数据暂存本地以降低功耗,醒来查看数据时自动唤醒与手机同步。

2. 智能家居领域

  • 智能照明系统:光线充足时,可通过指令让照明系统蓝牙模块进入 Hold 模式暂停灯光调节控制功能以节能,光线不足时恢复。

  • 智能音箱与其他设备协同:智能音箱播放音乐时,同时连接的智能灯泡、插座等设备若无需数据交互,可设为 Hold 模式避免冲突和干扰,确保音乐播放流畅。

3. 智能安防领域

  • 蓝牙门锁、门窗传感器等:日常处于 Hold 模式等待触发事件,门被非法打开或窗户被破坏时被唤醒,立即向安防监控中心发送报警信息,在电池供电下长时间稳定工作,减少更换电池麻烦,提高可靠性 。

蓝牙Sniff模式和Hold模式各自具有独特的应用场景和优势。根据设备的具体需求和应用场景,可以选择合适的模式来降低功耗、优化通信效率和提高设备的使用寿命。这些模式的应用不仅有助于提升用户体验,还能在节能减排方面发挥积极作用。

六、总结

综上所述,嗅探模式和保持模式作为蓝牙技术中的重要工作模式,各自具有独特的工作原理、应用场景以及优势与局限性。在实际的蓝牙设备设计与应用开发中,需要根据设备的功能需求、功耗要求以及数据传输特性等因素,合理选择并应用这两种模式,以实现蓝牙连接的高效性、稳定性与低功耗性。通过深入理解和优化这两种模式的使用,可以进一步推动蓝牙技术在更多领域的广泛应用与发展,为用户带来更加便捷、智能的无线连接体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/476736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号&#xff1a;正点原子的IMX6ULL-alpha开发板。ubuntu版本为&#xff1a;20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯&#xff0c;可以通过read系统调用可以…

ROS机器视觉入门:从基础到人脸识别与目标检测

前言 从本文开始&#xff0c;我们将开始学习ROS机器视觉处理&#xff0c;刚开始先学习一部分外围的知识&#xff0c;为后续的人脸识别、目标跟踪和YOLOV5目标检测做准备工作。我采用的笔记本是联想拯救者游戏本&#xff0c;系统采用Ubuntu20.04&#xff0c;ROS采用noetic。 颜…

电子电气架构 ---漫谈车载网关

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

@Autowired与构造器注入区别,为什么spring推荐使用构造注入而不是Autowired?

目录 1.简介 2.了解两种注入方式的全过程 2.1 Autowired字段注入 2.2 构造函数注入 3.使用autowired注解注入有以下问题 3.1空指针异常 3.2测试不友好 4.使用Lombok去简化构造函数注入的臃肿代码 5.小结 5.1注解注入 5.2构造函数注入 1.简介 使用Spring开发时&#…

优化注意力层提升 Transformer 模型效率:通过改进注意力机制降低机器学习成本

Transformer 架构由 Vaswani 等人在 2017 年发表的里程碑式论文《Attention Is All You Need》中首次提出&#xff0c;如今已被广泛认为是过去十年间最具开创性的科学突破之一。注意力机制是 Transformer 的核心创新&#xff0c;它为人工智能模型提供了一种全新的方法&#xff…

在Excel中处理不规范的日期格式数据并判断格式是否正确

有一个Excel表&#xff0c;录入的日期格式很混乱&#xff0c;有些看着差不多&#xff0c;但实际多一个空格少一个字符很难发现&#xff0c;希望的理想格式是 1980-01-01&#xff0c;10位&#xff0c;即&#xff1a;“YYYY-mm-dd”&#xff0c;实际上数据表中这样的格式都有 19…

医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22

小罗碎碎念 今天给大家推荐一本入门书籍。 这本书由Uday Kamath、Kenneth L. Graham和Wael Emara撰写&#xff0c;深入探讨了Transformer模型在机器学习领域的应用&#xff0c;特别是自然语言处理&#xff08;NLP&#xff09;。 原文pdf已经上传至知识星球的【入门书籍】专栏&…

SpringCloud Gateway转发请求到同一个服务的不同端口

SpringCloud Gateway默认不支持将请求路由到一个服务的多个端口 本文将结合Gateway的处理流程&#xff0c;提供一些解决思路 需求背景 公司有一个IM项目&#xff0c;对外暴露了两个端口8081和8082&#xff0c;8081是springboot启动使用的端口&#xff0c;对外提供一些http接口…

Parker派克防爆电机在实际应用中的安全性能如何保证?

Parker防爆电机确保在实际应用中的安全性能主要通过以下几个方面来保证&#xff1a; 1.防爆外壳设计&#xff1a;EX系列电机采用强大的防爆外壳&#xff0c;设计遵循严格的防爆标准&#xff0c;能够承受内部可能发生的爆炸而不破损&#xff0c;利用间隙切断原理&#xff0c;防…

虚拟形象+动作捕捉:解锁品牌N种营销玩法

近年来&#xff0c;随着Z世代年轻人对于二次元文化的热爱&#xff0c;各种二次元内容频频出圈。为了吸引年轻观众的注意&#xff0c;虚拟IP形象成为了品牌营销的“新宠”与“利器”为品牌踏入元宇宙蓝海提供了关键的切入点。在此背景下虚拟形象动作捕捉技术的组合应用方式正成为…

空间计算、物理计算、实时仿真与创造拥有「自主行为」的小狗 | 播客《编码人声》

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 虚拟世界与现实世界的界限逐渐模糊&#xff0c;已然成为不争的事实。但究竟哪些曾经的幻想已然…

影响电阻可靠性的因素

一、影响电阻可靠性的因素&#xff1a; 影响电阻可靠性的因素有温度系数、额定功率&#xff0c;最大工作电压、固有噪声和电压系数 &#xff08;一&#xff09;温度系数 电阻的温度系数表示当温度改变1摄氏度时&#xff0c;电阻阻值的相对变化&#xff0c;单位为ppm/C.电阻温度…

JAVA后端如何调用百度的身份证识别API

大家好&#xff0c;我是 程序员码递夫 。 今天给大家分享的是 JAVA后台如何调用百度的身份证识别API。 1、前言 我们做APP开发时常遇到 身份证认证或资质认证的 需求&#xff0c; 通过上传身份证照片是个常用的操作&#xff0c; 后台对上传的身份证照信息进行识别&#xff0…

Go语言进阶依赖管理

1. Go语言进阶 1.1 Goroutine package mainimport ("fmt""time" )func hello(i int) {println("hello goroutine : " fmt.Sprint(i)) }func main() {for i : 0; i < 5; i {go func(j int) { hello(j) }(i) // 启动一个新的 goroutine&…

基于Java Springboot高考志愿填报辅助系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…

autoware(2)运行自己的数据集

上一节完成了autoware.ai的安装和编译跑通了demo数据集&#xff0c;本将自己录制的数据包用于测试 1.修改点云地图 将加载点云地图的my_map.launch文件复制并命名为my_map_test.launch&#xff0c; &#xff08;1&#xff09;point cloud处替代原来的点云地图为自己的&#…

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…

【LeetCode热题100】栈

这道题一共记录了关于栈的5道题目&#xff1a;删除字符串中所有相邻重复项、比较含退格的字符串、基本计算器II、字符串解码、验证栈序列。 class Solution { public:string removeDuplicates(string s) {string ret;for(auto c : s){if(ret.size() 0 || c ! ret.back()) ret …

《Python基础》之pip换国内镜像源

目录 推荐镜像源网址&#xff1a; 方法一&#xff1a;手动换源 方法二&#xff1a;命令提示符指令换源 临时换源 推荐镜像源网址&#xff1a; 阿里云&#xff1a;Simple Indexhttp://mirrors.aliyun.com/pypi/simple/ 华为云&#xff1a;Index of python-local https://m…

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 &#xff08;一&#xff09;本地缓存 &#xff08;二&#xff09;分布式缓存 二、缓存更新模式分析 &#xff08;一&#xff09;Cache Aside Pattern&#xff08;旁路缓存模式&#xff09; 读操作流程 写操作流程 流程问题思考 问题1&#…