BLE core 内容整理解释
本文内容比较杂散,只是做记录使用,后续会整理的有条理些
link layer
基本介绍
**Link Layer Control(链路层控制)**是蓝牙低功耗(BLE)协议栈的核心部分,负责实现设备间可靠、安全、低功耗的数据传输和控制。它是蓝牙协议栈的基础,在 BLE 的操作中承担了许多关键功能。
以下是 BLE Link Layer Control 的整体内容详细解析:
1. 概述
链路层(Link Layer, LL)位于 BLE 协议栈的控制部分,与物理层(PHY)直接交互,是数据链路的核心组件。其主要职责包括:
- 连接建立和管理
- 数据传输
- 安全控制
- 状态管理
2. 链路层状态
链路层支持以下几种状态,每种状态对应不同的操作模式:
- Standby(待机状态):设备处于非活动状态,不执行任何操作。
- Advertising(广播状态):设备以广播包形式发送数据,允许其他设备扫描或连接。
- Scanning(扫描状态):设备接收广播包,用于发现其他设备。
- Initiating(发起状态):设备尝试与广播设备建立连接。
- Connected(连接状态):设备成功建立连接,进入数据传输模式。
3. 核心功能
链路层控制的核心功能分为以下几个模块:
(1) 设备发现
- 广播(Advertising):
- 广播设备发送广播包,表明其可用性。
- 支持多种广播类型(如可连接、不可连接、定向广播等)。
- 扫描(Scanning):
- 扫描设备接收广播包,提取设备信息(如地址、名称等)。
(2) 连接管理
- 连接建立:
- 发起设备通过
CONNECT_REQ
数据包与广播设备建立连接。
- 发起设备通过
- 连接维护:
- 定期通过 连接事件(Connection Events) 交换数据包。
- 支持主设备和从设备间的双向通信。
- 连接参数更新:
- 包括连接间隔、超时时间、主从时延等参数的调整。
- 通过 Connection Update Procedure 完成。
(3) 信道管理
- BLE 使用 40 个信道:
- 3 个广播信道(37、38、39)。
- 37 个数据信道(0-36)。
- 信道选择算法:
- BLE 通过信道跳频避免干扰,提高通信可靠性。
- 信道映射更新:
- 使用 Channel Map Update Procedure 动态调整信道。
(4) 数据传输
- 数据包结构:
- 包括 Preamble(前导符)、Access Address(访问地址)、Header(头部)、Payload(负载)等。
- 数据包通过 AES-CCM 加密保障安全性。
- 分片与重组:
- 长数据分片后通过多个 PDU(Protocol Data Unit)传输。
(5) 安全管理
- 加密过程:
- 使用
LTK
(Long Term Key)进行会话加密。 - 加密过程包括密钥分发、验证等。
- 使用
- 身份验证:
- 通过配对(Pairing)或绑定(Bonding)确保设备间的可信连接。
(6) 低功耗特性
-
支持
低功耗模式:
- 通过调整连接间隔、监听窗口等参数降低功耗。
-
主从切换:
- 主设备可以动态调整连接频率以节省资源。
4. 链路层控制过程
链路层定义了多种控制过程(Control Procedures)以管理连接和数据传输:
控制过程 | 描述 |
---|---|
Connection Update | 调整连接参数(间隔、超时等)。 |
Channel Map Update | 更新信道映射以避免干扰。 |
Encryption Procedure | 启用或关闭加密以保障数据安全。 |
Feature Exchange | 主从设备交换支持的功能特性。 |
Version Exchange | 主从设备交换蓝牙版本信息。 |
PHY Update | 更新物理层速率(如 1 Mbps 到 2 Mbps 切换)。 |
Terminate Procedure | 主动终止连接,释放资源。 |
5. 链路层 PDU(Protocol Data Unit)
链路层数据单元(PDU)是链路层通信的基本单位,分为以下两种类型:
- 控制 PDU:用于执行链路层控制过程。
- 数据 PDU:用于传输应用层数据。
每个 PDU 包括以下字段:
- Header:标识 PDU 类型和长度。
- Payload:实际的数据或控制信息。
- MIC(可选):消息完整性检查,用于验证数据的完整性。
6. 链路层与其他层的交互
- 与物理层(PHY):
- 直接管理射频信道的切换和数据包发送接收。
- 与主机层(Host Layer):
- 提供基础数据传输服务(如 ACL 数据通道)。
- 通过 HCI(Host Controller Interface)与主机层通信。
7. 链路层的特点
- 高效:支持数据分片、信道跳频和错误恢复。
- 安全:内置加密和验证机制,保障通信安全。
- 灵活:多种状态和过程支持复杂的 BLE 应用场景。
- 低功耗:通过优化连接参数和数据传输,延长电池寿命。
链路层是 BLE 协议栈的核心模块,其功能覆盖了连接、数据传输、安全管理等关键领域。如果需要更深入的某一部分解析(如广播过程或加密机制),请告诉我!
Connection Update procedure
这张图展示了 BLE(蓝牙低功耗)设备在连接参数更新时的连接事件时序图(Connection Event Timing)。它描述了主设备(Central)和从设备(Peripheral)在旧连接参数和新连接参数切换时的时间关系。
图中关键部分解释
- Last Event Transmitted with Old Connection Parameters
- 描述:
- 这是主设备(C)和从设备(P)之间使用旧的连接参数(
connInterval_old
)完成的最后一次数据传输。
- 这是主设备(C)和从设备(P)之间使用旧的连接参数(
- 特点:
- 此时仍按照旧的连接间隔
connInterval_old
进行通信。
- 此时仍按照旧的连接间隔
- 描述:
- Transmit Window (传输窗口)
- 位置:在
Instant
时间点后出现。 - 定义:
Transmit Window
是连接参数更新的关键,它标志着新连接参数(connInterval_new
)生效的开始。- 主设备将在
transmitWindowOffset
和transmitWindowOffset + transmitWindowSize
之间开始第一个连接事件。
- 限制条件:
- 主设备(C)必须在此窗口内发送数据包,从设备(P)需监听该窗口,以便完成参数更新后的第一次连接。
- 位置:在
- First Event Transmitted with New Connection Parameters
- 描述:
- 在
Transmit Window
中,主设备和从设备首次使用新的连接参数进行通信。 - 具体的连接间隔变为
connInterval_new
,后续事件也将按此间隔执行。
- 在
- 特点:
- 新的连接事件开始按照
connInterval_new
重新计算定时。
- 新的连接事件开始按照
- 描述:
- Second Event Transmitted with New Connection Parameters
- 描述:
- 在第一个使用新参数的连接事件后,设备继续按照
connInterval_new
的时间间隔执行后续连接事件。
- 在第一个使用新参数的连接事件后,设备继续按照
- 描述:
- 关键时间参数
connInterval_old
:- 旧连接参数下的连接事件间隔。
transmitWindowOffset
:Instant
时间点后,新参数生效的延迟时间。
transmitWindowSize
:- 定义新参数开始生效时主设备的传输窗口大小。
connInterval_new
:- 更新后的新连接事件间隔。
T_IFS
:T_IFS
表示设备之间数据包的间隔(Inter-Frame Space)。
图的实际意义
- 这是 BLE 中 连接参数更新过程 的标准行为,确保主从设备在切换参数时不会失去同步。
- 使用
transmitWindowOffset
和transmitWindowSize
,主设备可以在规定的窗口内完成新连接参数的切换,而从设备只需监听这一窗口即可。 - 应用场景:
- 调整连接间隔(
connInterval
)以优化功耗或响应速度。 - 提高通信效率,满足实时性或低功耗的需求。
- 调整连接间隔(
总结
这张图展示了 BLE 连接参数更新中的定时关系:
- 主从设备使用旧参数完成最后一次通信。
- 主设备进入
Transmit Window
,开始按照新参数通信。 - 新的连接事件间隔生效,并持续使用新参数进行通信。
主机连接流程
这两张图展示了 BLE(蓝牙低功耗)连接建立过程 的两种不同场景:使用 CONNECT_IND 和 AUX_CONNECT_REQ 建立连接。
上图(Figure 4.45):Central’s view of LL connection setup with CONNECT_IND
描述:
- Advertising Packet(广播包):
- 从 Peripheral(外设)发送广播包。
- Central(中心设备)监听广播频道接收这个包。
- CONNECT_IND:
- Central 在接收到广播包后,通过广播频道发送一个 CONNECT_IND 数据包,表示请求建立连接。
- Transmit Window:
- Peripheral 和 Central 在 Transmit Window 时间段内开始通信。
- TransmitWindowOffset 和 TransmitWindowSize 决定了数据传输的起始时间和窗口大小。
- Connection Interval:
- 数据传输进入周期性模式,每隔 Connection Interval 时间开始一个连接事件。
- 数据传输:
- 通信以 C->P(Central 发向 Peripheral)和 P->C(Peripheral 发向 Central)为交替模式进行,确保数据双向传输。
下图(Figure 4.46):Central’s view of LL connection setup with AUX_CONNECT_REQ
描述:
- AUX_ADV_IND(辅助广播包):
- Peripheral 通过辅助广播频道发送 AUX_ADV_IND 包,提供更多的广播数据。
- 这是 BLE 的扩展广播(Extended Advertising)功能。
- AUX_CONNECT_REQ:
- Central 在接收到 AUX_ADV_IND 后,通过辅助频道发送 AUX_CONNECT_REQ 包,表示建立连接的请求。
- AUX_CONNECT_RSP:
- Peripheral 接收到 AUX_CONNECT_REQ 后,通过辅助频道发送响应包 AUX_CONNECT_RSP,确认连接建立。
- Transmit Window:
- 与 CONNECT_IND 一样,连接建立后进入 Transmit Window 阶段,按照 TransmitWindowOffset 和 TransmitWindowSize 的约定开始传输数据。
- Connection Interval:
- 数据传输也按照设定的 Connection Interval 周期进行。
两种方式的区别:
- 通信信道:
- CONNECT_IND 使用的是 主广播信道。
- AUX_CONNECT_REQ 使用的是 辅助广播信道,适用于扩展广播场景。
- 使用场景:
- CONNECT_IND 适合传统的广播连接。
- AUX_CONNECT_REQ 则是 BLE 5.0 引入的特性,支持更多广播数据和更灵活的连接方式。
总结:
这两张图分别展示了 BLE 在传统广播和扩展广播模式下,如何从连接请求到数据传输建立的全过程。核心流程相似,主要区别在于所使用的广播信道不同。
NESN和SN什么意思
在蓝牙低功耗(BLE)通信中,NESN(Next Expected Sequence Number)和 SN(Sequence Number)是链路层(Link Layer)用于实现数据包序列控制和可靠通信的重要机制。这两个字段帮助 BLE 设备管理数据包的接收、确认和重传。
1. NESN(Next Expected Sequence Number)
- 定义:指接收端期望从发送端接收到的下一个数据包的序列号。
- 作用:
- 表明发送端已经接收到哪些数据包。
- 用于确认当前数据包的可靠传输,并指示发送端可以继续发送新的数据。
- 值的取值范围:通常是一个 1-bit 字段(值为 0 或 1),按顺序切换。
- 0 表示期望接收序列号为
0
的数据包。 - 1 表示期望接收序列号为
1
的数据包。
- 0 表示期望接收序列号为
2. SN(Sequence Number)
- 定义:指发送端发送的数据包的当前序列号。
- 作用:
- 标识当前发送的数据包是否与前一个数据包不同。
- 帮助接收端判断是否是新的数据包,防止重复接收或丢包。
- 值的取值范围:也是一个 1-bit 字段(值为 0 或 1,按顺序切换。)
- 0 表示当前发送的数据包序列号为
0
。 - 1 表示当前发送的数据包序列号为
1
。
- 0 表示当前发送的数据包序列号为
3. NESN 和 SN 的关系
-
数据包传输流程:
-
发送端 将数据包的 SN 设置为当前序列号。
-
接收端
检查数据包中的 SN,判断是否是期望的包(与自己的 NESN 匹配)。
- 如果 SN 与 NESN 相符,说明数据包接收正确,接收端更新 NESN(切换到下一个值)。
- 如果 SN 与 NESN 不符,说明包重复或错误,接收端不会更新 NESN。
-
接收端 在返回的确认包(ACK/NACK)中设置自己的 NESN,告知发送端当前的接收状态。
-
-
可靠性保障:
- NESN 和 SN 确保每个数据包在 BLE 链路上传输时都能被正确接收或重传。
- 如果数据包丢失,发送端会根据接收端返回的 NESN 重传丢失的数据。
4. 示例
假设 A 和 B 两个设备在通信:
- 初始状态:
- A 的初始 SN = 0
- B 的初始 NESN = 0
- 数据包传输:
- A 发送一个数据包,SN = 0。
- B 收到数据包,发现 SN = NESN(都是 0),说明包正确。
- B 更新 NESN = 1,并返回 ACK。
- 继续发送:
- A 收到 ACK 后,更新自己的 SN = 1,发送下一个数据包。
- B 收到新的数据包,检查 SN = 1,匹配自己的 NESN,继续传输。
- 错误处理:
- 如果某个数据包丢失或重复,NESN 和 SN 不匹配,接收端不会更新 NESN,发送端据此判断需要重传。
5. 总结
- NESN(Next Expected Sequence Number):接收端告知发送端下一个期望的序列号,用于确认是否成功接收。
- SN(Sequence Number):发送端标识当前数据包的序列号,用于确认数据包的唯一性和顺序。
这种简单的机制通过 1-bit 序列号实现了高效的包顺序管理和丢包重传,非常适合 BLE 的低功耗和低复杂度设计目标。
连接参数更新instant的作用
在 BLE (Bluetooth Low Energy)中,连接参数更新的 instant 是一个重要的机制,确保在连接参数更新时,主设备(Central)和从设备(Peripheral)能以同步的方式应用新的连接参数。
Instant 的作用
- 同步连接参数的生效时刻:
- BLE 的连接是基于时间片(连接事件)的,每个事件都有唯一的事件计数(
Event Count
)。 - Instant 是一个特定的事件计数,指明连接参数更新将在那个时刻开始生效。
- 通过 Instant,主设备和从设备可以在同一连接事件上同时切换到新参数,避免切换过程中的不一致。
- BLE 的连接是基于时间片(连接事件)的,每个事件都有唯一的事件计数(
- 防止通信中断:
- 如果主从设备在不同步的情况下切换参数,可能导致连接失败。
- Instant 确保在指定时刻之前,双方仍使用旧参数通信,在指定时刻同时切换到新参数。
- 提供足够的准备时间:
- Instant 通常是当前事件计数加上一段安全的延迟(例如 6 个连接事件)。
- 这段时间允许设备完成必要的准备工作,例如调整硬件定时器或通信调度。
连接参数更新流程中的 Instant
-
主设备发送更新请求:
-
主设备通过 L2CAP 的
Connection Parameter Update Request
向从设备提议新的连接参数,包括:
- 新的连接间隔(
Interval
) - 新的从设备延迟(
Slave Latency
) - 新的超时时间(
Timeout
) - Instant(表示参数更新的生效时刻)
- 新的连接间隔(
-
-
从设备响应更新请求:
- 从设备根据自身能力接受或拒绝请求。
- 如果接受,从设备会记录 Instant,并继续使用旧参数直到 Instant 时刻。
-
双方同步参数更新:
- 在 Instant 指定的事件计数到达时,主从设备同时切换到新的连接参数。
Instant 的具体计算
-
Instant 的值:
- Instant 是一个 16-bit 的计数值,取自 BLE 链路层的事件计数(
Event Counter
)。 - 它通常设定为当前事件计数加上一个固定的偏移量。例如:
- 当前事件计数 = 100
- Instant = 100 + 6 = 106(即 6 个事件之后生效)
- Instant 是一个 16-bit 的计数值,取自 BLE 链路层的事件计数(
-
偏移量的作用:
- 给设备提供足够的时间来完成切换准备,例如:
- 重新配置定时器
- 校准新的参数
- 给设备提供足够的时间来完成切换准备,例如:
关键点
- 双方必须遵守 Instant:
- 无论是主设备还是从设备,只有在 Instant 指定的时刻才会切换到新的参数。
- 瞬态点的检查:
- 在连接参数更新逻辑中,双方都会检查当前事件计数与 Instant 的差值(
gap
)。 - 如果
gap == 0
或发生溢出(gap >= 32767
),说明 Instant 到达,开始切换。
- 在连接参数更新逻辑中,双方都会检查当前事件计数与 Instant 的差值(
- 失败处理:
- 如果主设备或从设备在 Instant 到达之前断开连接,参数更新将无法完成。
总结
- Instant 的核心作用是为 BLE 连接参数的更新提供一个同步的切换点。
- 它通过事件计数保证主从设备在同一时刻应用新参数,防止因参数不同步而导致的通信错误。
- 这一机制对于 BLE 的低功耗设计至关重要,因为它能在不频繁通信的情况下仍保持通信的可靠性和一致性。
LL_CONNECTION_UPDATE_IND
和 LL_CONNECTION_PARAM_REQ
是蓝牙低功耗(BLE)链路层中两种用于连接参数更新的链路层消息,主要区别在于用途、触发条件和使用场景。
LL CONNECTION UPDATE IND和LL_CONNECTION_PARAM_REQ有什么区别
1. LL_CONNECTION_PARAM_REQ
LL_CONNECTION_PARAM_REQ
是主机用来请求从机更新连接参数的链路层消息,属于 Connection Parameter Request Procedure。
主要特点:
- 消息发送方:主机
- 该消息由主机发起,目的是向从机请求更新连接参数(例如连接间隔、超时时间和从机延迟等)。
- 响应机制:
- 从机会根据本地的支持情况响应,可以:
- 接受请求,并继续协商更新参数。
- 拒绝请求,并通过 LL_REJECT_IND 返回拒绝原因。
- 从机会根据本地的支持情况响应,可以:
- 适用场景:
- 主机检测到当前连接参数不适合应用需求(如延迟过高或功耗过高)。
- 主机需要优化连接性能。
- 典型使用场景包括主设备需要更高效的数据传输或降低能耗。
- 协议支持:
- 此消息仅在从机支持 Connection Parameter Request Procedure 的情况下使用。
- 主机会通过 Feature Exchange Procedure 确认从机是否支持该过程。
2. LL_CONNECTION_UPDATE_IND
LL_CONNECTION_UPDATE_IND
是链路层更新连接参数的通知消息,属于 Connection Update Procedure。
主要特点:
- 消息发送方:主机或从机
- 该消息既可以由主机发送,也可以由从机发送,具体取决于设备角色。
- 用于通知对方连接参数更新的结果。
- 触发机制:
- 当主从设备协商好新的连接参数后,
LL_CONNECTION_UPDATE_IND
用于指示更新参数的生效时间和内容。 - 包含字段如:新的连接间隔、超时时间、从机延迟以及更新生效的时间点。
- 当主从设备协商好新的连接参数后,
- 适用场景:
- 协商更新连接参数后,用于通知双方。
- 应用场景包括完成
LL_CONNECTION_PARAM_REQ
流程后,更新连接参数。
- 协议要求:
- 无需确认特性支持,任何 BLE 设备都能使用 Connection Update Procedure。
3. 二者的关键区别
特性 | LL_CONNECTION_PARAM_REQ | LL_CONNECTION_UPDATE_IND |
---|---|---|
作用 | 请求更新连接参数 | 通知连接参数的最终更新 |
消息发送方 | 主机 | 主机或从机 |
触发条件 | 需要协商新的连接参数 | 新的连接参数已经协商好 |
从机特性支持要求 | 要求从机支持 Connection Parameter Request Procedure | 无需特性支持要求 |
典型用途 | 主机希望调整连接性能(延迟、功耗等) | 连接参数更新过程的最后一步 |
响应消息 | 从机会通过 LL_CONNECTION_UPDATE_IND 或 LL_REJECT_IND 响应 | 无需回应(作为通知消息发送) |
协议依赖 | Connection Parameter Request Procedure | Connection Update Procedure |
4. 二者的协作关系
LL_CONNECTION_PARAM_REQ
是用于主机发起参数更新请求的初始消息,目标是与从机协商合适的参数。- 在完成协商后,通过
LL_CONNECTION_UPDATE_IND
指定新参数的生效时间和内容。
5. 示例流程
以下是主机通过链路层更新连接参数的完整流程:
-
Feature Exchange:主机与从机确认是否支持
Connection Parameter Request Procedure
。 -
主机发送请求:主机通过
LL_CONNECTION_PARAM_REQ
请求从机更新参数。 -
从机处理请求:
- 从机接受:协商新的连接参数。
- 从机拒绝:通过
LL_REJECT_IND
通知主机。
-
参数更新通知:
- 如果从机接受并协商完成,则由主机发送
LL_CONNECTION_UPDATE_IND
,通知从机新的参数及生效时间。
- 如果从机接受并协商完成,则由主机发送
6. 总结
LL_CONNECTION_PARAM_REQ
用于请求更新连接参数,是参数协商流程的开始。LL_CONNECTION_UPDATE_IND
用于通知新参数的生效,是参数协商流程的结束。
如果有其他问题或需要更深入的协议分析,可以继续讨论!
Channel Map Update procedure
在 BLE(蓝牙低功耗)通信中,Channel Map Update Procedure 是一种更新连接通道映射的机制,用于优化通信质量和减少干扰。这一机制在 BLE 链接中非常重要,因为它确保了数据传输的可靠性和效率。
以下是对 Channel Map Update Procedure 的详细解析:
1. 背景与目的
BLE 使用 2.4 GHz ISM 频段,有 40 个射频信道:
- 3 个信道用于广播(advertising channels):37、38、39。
- 37 个信道用于数据通信(data channels):0 到 36。
由于干扰(如 Wi-Fi 或其他蓝牙设备)或硬件问题(如某些频段受阻),某些数据通道可能无法可靠地传输数据。因此,Channel Map Update 允许主设备(Central)通知从设备(Peripheral)使用哪些信道进行通信,以避免干扰。
2. 过程详解
Channel Map Update Procedure 是主从设备间的协商机制,主要步骤如下:
(1) 触发更新
- 主设备发起:主设备(Central)监测数据传输质量,如发现某些通道通信质量较差,会决定更新通道映射表。
- 触发时机:
- 周围环境发生变化(如新增干扰源)。
- 通信失败率升高。
(2) Channel Map Indication
主设备通过 Link Layer 数据包中的 Channel Map Indication
向从设备发送新的通道映射表。
-
内容:
- Channel Map(37 位):表示每个数据通道是否被启用(1 = 启用,0 = 禁用)。
- Instant:表示更新生效的时间点(单位为连接事件)。
-
实例:
Channel Map: 1111111111111100111111111100000000000 Instant: 12345
上述映射表示禁用了几个数据通道,Instant 指定了更新将在连接事件计数达到 12345 时生效。
(3) 更新生效
- 双方设备在
Instant
指定的连接事件时刻,同时切换到新的通道映射。 - 如果从设备在更新中丢失或未收到指令,会中断连接。
3. 优点
- 动态调整:根据实时环境变化优化通信通道。
- 减少干扰:避开被占用或干扰严重的信道,提高连接稳定性。
- 节能:避免重传数据,延长设备电池寿命。
4. 注意事项
- 主设备决定通道更新:从设备只能被动接受。
- 必须使用至少两个通道:通道映射中必须至少有两个通道被启用,否则协议不允许更新。
- 即时同步:主从设备需要在
Instant
同步更新,否则可能导致通信中断。
5. 典型场景
- 拥挤环境:如办公楼中有多个蓝牙设备,Channel Map Update 会关闭干扰通道。
- 动态环境:如移动中的 BLE 设备(手环、耳机),可能需要随时调整信道映射。
Encryption procedure
在蓝牙低功耗(BLE)中,**Encryption Procedure(加密过程)**是用于确保数据传输安全的关键步骤。它在主设备(Central)和从设备(Peripheral)之间协商并建立一个加密会话,从而保护通信内容不被窃听或篡改。
以下是对 BLE Encryption Procedure 的详细解析:
1. 加密的必要性
BLE 的加密提供以下功能:
- 数据保密性:防止未授权的第三方窃听数据。
- 数据完整性:确保传输数据未被篡改。
- 身份验证:验证通信设备的身份。
加密过程依赖于设备配对时生成的共享密钥(LTK
,Long Term Key)。
2. 加密过程的参与者
加密过程涉及以下关键实体:
- LTK(Long Term Key):配对时生成的长时密钥,用于数据加密和解密。
- EDIV(Encrypted Diversifier) 和 RAND:用来标识和验证 LTK。
- STK(Short Term Key):在未分发 LTK 的情况下,用于临时加密。
- IV(Initialization Vector):初始化向量,用于加密过程中的随机化。
3. 加密过程详解
(1) 启动加密过程
-
Central 发送加密请求:
-
在连接建立后,Central 向 Peripheral 发送
LL_ENC_REQ
数据包。 -
包含:
- RAND:随机数,用于标识 LTK。
- EDIV:加密多样化标识符,匹配 LTK。
- SKDm 和 IVm:主设备的会话密钥分量和初始化向量。
-
-
Peripheral 响应:
- Peripheral 接收到
LL_ENC_REQ
后,发送LL_ENC_RSP
。 - 包含:
- SKDs 和 IVs:从设备的会话密钥分量和初始化向量。
- Peripheral 接收到
(2) 生成会话密钥(Session Key)
-
主从设备共同生成会话密钥(sk)
SK = E(SKD, LTK)
SKD
=SKDm || SKDs
(合并主从设备的会话密钥分量)。E
是 AES-128 加密算法。LTK
是共享密钥,用于生成SK
。
(3) 启用加密
- 双方生成会话密钥后,使用共享的
IV
初始化加密引擎。 - 加密引擎基于会话密钥对数据包进行加密和解密。
- Central 向 Peripheral 发送
LL_START_ENC_REQ
指令以开始加密。
- Peripheral 响应
LL_START_ENC_RSP
,确认启用加密。
(4) 密钥验证
- 双方使用
RAND
和EDIV
确保使用的 LTK 是一致的。 - 如果验证失败,则加密过程终止,连接可能会断开。
(5) 通信加密
一旦加密启用:
- 所有数据包都通过会话密钥和 AES-CCM(Counter Mode with CBC-MAC)算法进行加密。
- 数据包包含:
- 加密的数据负载。
- MIC(Message Integrity Check)字段,用于验证数据完整性。
4. 加密模式
BLE 支持以下两种加密模式:
- Legacy Pairing:
- 使用 STK 作为会话密钥(适用于蓝牙 4.0)。
- 安全性较低。
- LE Secure Connections:
- 使用 LTK 作为会话密钥(适用于蓝牙 4.2+)。
- 基于 ECC(椭圆曲线密码学),安全性更高。
5. 常见问题
- 加密失败:
- LTK 不匹配。
- 环境中存在干扰或数据包丢失。
- 配对过程中未成功分发 LTK。
- 安全漏洞:
- Legacy Pairing 存在中间人攻击(MITM)风险。
- 建议使用 LE Secure Connections。
Feature Exchange procedure
Feature Exchange Procedure 是蓝牙低功耗(BLE)链路层中的一项控制过程,用于在主设备(Central)和从设备(Peripheral)之间交换各自支持的功能特性。这一过程确保设备能够根据共同支持的功能进行通信,避免使用对方不支持的功能而导致错误。
以下是 Feature Exchange Procedure 的详细解析:
1. 目的与作用
- 目的:
- 确定主从设备共同支持的功能特性。
- 为后续的链路层操作(如加密、信道更新、物理层切换)奠定基础。
- 作用:
- 避免使用对方设备不支持的功能。
- 提高设备间的兼容性和互操作性。
2. 过程详解
(1) 触发时机
- Feature Exchange Procedure 通常在 连接建立后 自动启动。
- 也可以通过其他链路层事件(如功能更新需求)手动触发。
(2) 消息交互
Feature Exchange Procedure 基于链路层控制数据包进行消息交互,包括以下步骤:
- Feature Request:
- 主设备发送
LL_FEATURE_REQ
数据包。 - 数据包中包含主设备支持的功能特性(用位字段表示)。
- 主设备发送
- Feature Response:
- 从设备接收到请求后,发送
LL_FEATURE_RSP
数据包。 - 数据包中包含从设备支持的功能特性。
- 从设备接收到请求后,发送
- 功能协商:
- 主设备根据双方的特性列表,选择双方都支持的功能集。
(3) 数据包结构
每个 Feature Exchange 数据包的主要字段:
- Opcode:操作码,标识这是
LL_FEATURE_REQ
或LL_FEATURE_RSP
。 - Features:一个 64 位字段,用于表示设备支持的功能特性。
例如:
Features = 0x000000000000002F
其中每个位对应一个功能:
- 第 0 位:LE Encryption
- 第 1 位:Connection Parameters Request Procedure
- 第 2 位:Extended Reject Indication
- 第 3 位:Slave-initiated Features Exchange
- 第 4 位:LE Ping
- 第 5 位:LE Data Packet Length Extension
- …
3. 常见支持功能
以下是 BLE 协议中一些常见的功能特性:
功能特性 | 描述 |
---|---|
LE Encryption | 支持加密功能,保护数据安全。 |
Connection Parameters Request Procedure | 支持连接参数更新过程。 |
Extended Reject Indication | 支持扩展拒绝指示,用于提供更详细的错误信息。 |
Slave-initiated Features Exchange | 从设备可以主动发起 Feature Exchange Procedure。 |
LE Ping | 支持 LE Ping 功能,确保长连接状态下的链接有效性。 |
LE Data Packet Length Extension | 支持数据包长度扩展,增加传输效率。 |
LE 2M PHY | 支持 2 Mbps 数据传输速率。 |
LE Coded PHY | 支持编码物理层(长距离通信)。 |
Periodic Advertising | 支持周期性广播,用于同步多个设备。 |
设备可能会根据硬件和软件支持情况实现这些特性中的一部分。
4. 后续操作
Feature Exchange Procedure 完成后,链路层可以根据双方支持的功能执行其他操作:
- 如果双方都支持加密,则可以启用 Encryption Procedure。
- 如果支持数据包长度扩展,则可以启动 Data Length Update Procedure。
- 如果支持物理层切换,则可以启动 PHY Update Procedure。
5. 注意事项
- 兼容性问题:
- 如果两个设备功能支持不一致,则只能使用共同支持的功能集。
- 如果从设备不支持 Feature Exchange,则主设备可能会降级功能。
- 错误处理:
- 如果从设备无法处理
LL_FEATURE_REQ
数据包,则可能会发送LL_UNKNOWN_RSP
响应。
- 如果从设备无法处理
- 低功耗影响:
- Feature Exchange 的数据包占用少量连接事件,不会显著增加功耗。
6. 应用场景
- 物联网设备:确保设备之间的互操作性,尤其是在具有不同硬件能力的设备之间。
- 低功耗传感器:协商支持的最低功能集,以优化功耗和性能。
- 蓝牙耳机或音频设备:根据主设备的功能调整传输速率和模式(如 LE Audio)。
总结
Feature Exchange Procedure 是 BLE 链路层中的重要步骤,用于功能协商,确保设备之间的兼容性。它是 BLE 协议栈中实现动态适配和优化的重要机制之一。如果需要了解具体的实现方式或调试示例,请告诉我!
一些常见概念和名词
ble的T_IFS表示什么
在 BLE(Bluetooth Low Energy) 通信中,T_IFS 表示 Inter-Frame Space,即帧间隔时间。
T_IFS的含义:
- T_IFS 是两个连续 BLE 数据包之间的间隔时间。
- 根据 BLE 规范,T_IFS 的标准值为 150 µs(微秒)。
- 这个时间是固定的,用于确保 BLE 链路上两个设备之间数据包交换的稳定性和一致性。
BLE 协议栈中的作用:
- 发送方与接收方之间:在 BLE 通信中,设备在发送数据包后,需要等待一个 T_IFS 时间后才能发送下一个数据包或进行回应。
- 保持时间同步:T_IFS 保证 BLE 通信双方时间间隔的准确性,以避免冲突。
- 协议要求:BLE 协议严格规定了这个时间,如果 T_IFS 时间违反(比如超过或不足 150 µs),通信可能会出错。
从你的截图中看到:
- T_IFS = 146.875 µs,比标准的 150 µs 短了约 1.125 µs。
- T_IFS Violation 显示了 “1.125 µs too short”,这意味着时间间隔不符合 BLE 协议要求。
可能的影响:
T_IFS 违规可能会导致:
- 数据包无法被对端设备正确接收。
- 通信链路出现问题,甚至导致连接断开。
- T_IFS 的不规范(如过短)可能导致手机无法检测到广播包。这是因为 BLE 设备严格依赖标准协议进行通信。建议尽快修复 T_IFS 定时问题,确保时间间隔符合 150 µs 标准,从而保证广播的正常解析和连接的稳定性。
解决方法:
- 检查发送端和接收端的时间同步机制。
- 确保通信栈或硬件中 T_IFS 定时器的实现符合 BLE 协议的要求(150 µs)。
instant概念
在 BLE(Bluetooth Low Energy) 通信中,instant 是一个用于表示 特定时刻 的概念,主要用于 链路层(Link Layer) 的控制命令中,确保通信双方在约定的时刻同步执行特定操作。
Instant 点的定义
- Instant 是链路层控制消息(如连接参数更新、信道映射更新等)中的一个字段,用于指定 何时 应执行所请求的操作。
- 这个时间点基于 连接事件计数器(Connection Event Counter),即 BLE 链路层通信中事件的计数。
Instant 的作用场景
- 连接参数更新(Connection Parameter Update)
- 当主设备(Master)请求修改连接间隔、超时时间等参数时,会通过
LL_CONNECTION_PARAM_REQ
消息传递新参数,并设置一个 Instant 点。 - 从设备(Slave)在 Instant 指定的连接事件时刻开始使用新参数。
- 当主设备(Master)请求修改连接间隔、超时时间等参数时,会通过
- 信道映射更新(Channel Map Update)
- 信道映射表更新也使用 Instant 点,确保双方在相同的连接事件时刻开始使用新的信道映射。
- 跳频与时钟同步
- Instant 确保主从设备在指定的时刻同步更新参数,避免主从设备之间出现跳频或时钟偏移导致的通信失步。
Instant 的特点
- 基于连接事件计数器
- BLE 链路层通过 连接事件计数器 追踪每次通信的事件编号。
- Instant 是一个 未来的事件编号,通常在当前事件之后的几次连接事件发生时触发。
- 确保同步执行
- Instant 允许 BLE 设备双方预先知道何时应用新的设置,确保同步执行操作,而不会导致通信中断。
- 错误处理
- 如果从设备错过了 Instant(例如设备进入睡眠状态,或无法在指定事件完成更新),会导致链路断开,通信失败。
连接参数更新流程中的 Instant
-
主设备发送更新请求:
-
主设备通过 L2CAP 的
Connection Parameter Update Request
向从设备提议新的连接参数,包括:
- 新的连接间隔(
Interval
) - 新的从设备延迟(
Slave Latency
) - 新的超时时间(
Timeout
) - Instant(表示参数更新的生效时刻)
- 新的连接间隔(
-
-
从设备响应更新请求:
- 从设备根据自身能力接受或拒绝请求。
- 如果接受,从设备会记录 Instant,并继续使用旧参数直到 Instant 时刻。
-
双方同步参数更新:
- 在 Instant 指定的事件计数到达时,主从设备同时切换到新的连接参数。
Instant 的具体计算
-
Instant 的值:
- Instant 是一个 16-bit 的计数值,取自 BLE 链路层的事件计数(
Event Counter
)。 - 它通常设定为当前事件计数加上一个固定的偏移量。例如:
- 当前事件计数 = 100
- Instant = 100 + 6 = 106(即 6 个事件之后生效)
- Instant 是一个 16-bit 的计数值,取自 BLE 链路层的事件计数(
-
偏移量的作用:
- 给设备提供足够的时间来完成切换准备,例如:
- 重新配置定时器
- 校准新的参数
- 给设备提供足够的时间来完成切换准备,例如:
关键点
- 双方必须遵守 Instant:
- 无论是主设备还是从设备,只有在 Instant 指定的时刻才会切换到新的参数。
- 瞬态点的检查:
- 在连接参数更新逻辑中,双方都会检查当前事件计数与 Instant 的差值(
gap
)。 - 如果
gap == 0
或发生溢出(gap >= 32767
),说明 Instant 到达,开始切换。
- 在连接参数更新逻辑中,双方都会检查当前事件计数与 Instant 的差值(
- 失败处理:
- 如果主设备或从设备在 Instant 到达之前断开连接,参数更新将无法完成。
总结
- Instant 的核心作用是为 BLE 连接参数的更新提供一个同步的切换点。
- 它通过事件计数保证主从设备在同一时刻应用新参数,防止因参数不同步而导致的通信错误。
- 这一机制对于 BLE 的低功耗设计至关重要,因为它能在不频繁通信的情况下仍保持通信的可靠性和一致性。
LL_CONNECTION_UPDATE_IND
和 LL_CONNECTION_PARAM_REQ
是蓝牙低功耗(BLE)链路层中两种用于连接参数更新的链路层消息,主要区别在于用途、触发条件和使用场景。
示例
假设主设备发送一个连接参数更新请求:
- 当前 连接事件计数器 为 100。
- 主设备在请求中指定 Instant = 110,表示在 第 110 次连接事件 时,主从设备都开始使用新连接参数。
- 从设备接收到这个请求后,等待 第 110 次连接事件,并在该时刻同步更新参数。
总结
- Instant 是 BLE 链路层中一个表示未来时刻的概念,主要用于同步执行控制操作,如连接参数更新和信道映射更新。
- 它基于 连接事件计数器,确保 BLE 通信双方在指定的连接事件中同步完成特定任务,保证通信的稳定性和一致性。
BLE(蓝牙低功耗)中的 1M、2M、S2、S8 是指蓝牙物理层(PHY)传输速率和编码方式的配置选项。这些模式影响传输速度、抗干扰能力和通信距离,是蓝牙5.0及更高版本引入的重要特性。以下是每个模式的详细说明:
ble 1m 2m s2 s8详解
1M PHY (1 Mbps PHY)
特性
- 传输速率:1 Mbps(每秒1兆比特)。
- 编码方式:没有特殊的编码,使用基本的高斯频移键控(GFSK)调制。
- 范围:中等(通常10-50米,视环境和设备功耗而定)。
- 抗干扰能力:一般,适用于常见的近距离低功耗通信。
应用场景
- 是蓝牙低功耗的基础物理层速率,兼容性最广。
- 适合大多数 BLE 设备,如智能手环、心率监测器等。
2M PHY (2 Mbps PHY)
特性
- 传输速率:2 Mbps(每秒2兆比特)。
- 编码方式:无特殊编码,依然使用 GFSK,但速率提升一倍。
- 范围:比 1M PHY 略短(信号在高频传输下衰减较快)。
- 抗干扰能力:略弱于 1M PHY,但仍适合低干扰环境。
应用场景
- 高数据速率需求:如音频数据传输(LE Audio)、固件升级 (OTA)。
- 低延迟应用:如游戏手柄、虚拟现实设备。
S2 (LE Coded PHY, 1:2)
特性
-
传输速率:有效速率为 500 kbps(1 Mbps 的一半)。
-
编码方式:使用前向纠错(FEC)编码,
1:2 编码率。
- 每1位数据用2位符号表示,提高数据冗余。
-
范围:比 1M PHY 更远,适合复杂环境。
-
抗干扰能力:显著提高,适用于嘈杂环境。
应用场景
- 需要较远距离但不追求高数据速率的场景。
- 工业物联网(IIoT)、资产跟踪设备(Asset Tracker)等。
S8 (LE Coded PHY, 1:8)
特性
- 传输速率:有效速率为 125 kbps(1 Mbps 的八分之一)。
- 编码方式:使用 FEC 编码,1:8 编码率。
- 每1位数据用8位符号表示,极大增强冗余性。
- 范围:最远的 PHY 模式(比 S2 和 1M PHY 都远)。
- 抗干扰能力:最强,适用于极其复杂或干扰严重的环境。
应用场景
- 超远距离通信:户外定位、农业物联网设备。
- 恶劣环境:信号穿透力和抗干扰能力要求高的场景。
总结对比
PHY 模式 | 传输速率 | 范围 | 抗干扰能力 | 典型应用 |
---|---|---|---|---|
1M PHY | 1 Mbps | 中等 | 一般 | 智能手环、低功耗设备 |
2M PHY | 2 Mbps | 略短 | 较弱 | 高速传输、LE Audio |
S2 | 500 kbps | 更远 | 较强 | 工业物联网、远距离设备 |
S8 | 125 kbps | 最远 | 最强 | 超远距离通信、复杂环境 |
BLE PHY 模式的选择
- 优先范围:
- 如果距离优先,选择编码模式(S2 或 S8)。
- S8 最适合远距离且高可靠性要求的场景。
- 优先速率:
- 高速需求(如音频传输)选择 2M PHY。
- S2/S8 不适合大数据量传输,主要用于小数据包的可靠传输。
- 能耗权衡:
- 编码模式(S2/S8)增加了冗余性,解码耗电更多,但通信距离延长。
- 2M PHY 在速率提升的同时能耗变化不大。
- 环境干扰:
- 干扰严重时,编码模式(S2/S8)可以显著提高通信稳定性。
如需更深入了解,或希望针对具体设备和使用场景进行分析,可以提供更多细节!
相关文章:

BLE core 内容整理解释
本文内容比较杂散,只是做记录使用,后续会整理的有条理些 link layer 基本介绍 **Link Layer Control(链路层控制)**是蓝牙低功耗(BLE)协议栈的核心部分,负责实现设备间可靠、安全、低功耗的数…...

Linux CPU调度算法
简述 ● CPU数量 < 进程数 ● 每次CPU都要决定下一个运行的进程,这个选择叫做CPU调度;这个选择工作就叫做CPU调度程序 ● 如果一个进程中有多个线程的话,内核管理的线程就以线程为基本单位 ● 进程通常分为两种,一种长时间占…...

Linux套接字通信学习
Linux套接字通信 在网络通信的时候, 程序猿需要负责的应用层数据的处理(最上层),而底层的数据封装与解封装(如TCP/IP协议栈的功能)通常由操作系统、网络协议栈或相关网络库(如Socket库)实现。(程序员只需要…...

mybatis-plus 用法总结
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,旨在简化开发者的 CRUD 操作。它在 MyBatis 的基础上提供了更多的功能和便利性,如代码生成器、分页插件、性能分析插件等,使开发者能够更高效地进行数据库操作。MyBatis-P…...

小程序配置文件 —— 14 全局配置 - tabbar配置
全局配置 - tabBar配置 tabBar 字段:定义小程序顶部、底部 tab 栏,用以实现页面之间的快速切换;可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面; 在上面图中,标注了一些 tabBar …...

Redis-十大数据类型
Reids数据类型指的是value的类型,key都是字符串 redis-server:启动redis服务 redis-cli:进入redis交互式终端 常用的key的操作 redis的命令和参数不区分大小写 ,key和value区分 1、查看当前库所有的key keys * 2、判断某个key是否存在 exists key 3、查…...
linux系统编程(七)管道和FIFO
1、管道 使用系统调用pipe可以创建一个新管道: #include <unistd.h> int pipe(int filedes[2]);成功的pipe调用会在数组filedes中返回两个打开的文件描述符,读取端为filedes[0],写入端为filedes[1]。我们可以使用read/write系统调用在…...

【vLLM大模型TPS测试三部曲】
安装 pip install vllm模型自行下载 例如: https://modelscope.cn/models/jackle/Qwen2.5-Coder-32B-GPTQ-Int4/ 部署测试 export VLLM_MODELQwen2.5-Coder-32B-GPTQ-Int4 # 启动 python3 -m vllm.entrypoints.openai.api_server --model $VLLM_MODEL --deviceauto --enf…...

Elasticsearch:使用 Ollama 和 Go 开发 RAG 应用程序
作者:来自 Elastic Gustavo Llermaly 使用 Ollama 通过 Go 创建 RAG 应用程序来利用本地模型。 关于各种开放模型,有很多话要说。其中一些被称为 Mixtral 系列,各种规模都有,而一种可能不太为人所知的是 openbiollm,这…...

Windows平台ROBOT安装
Windows环境下ROBOT的安装,按照下文进行部署ROBOT的前提是你的python已安装并且环境变量已设置好. 一、安装setuptools 1、下载后安装 https://pypi.python.org/pypi/setuptools/ 下载你需要的包 setuptools-75.6.0.tar.gz 解压下载的包在命令行中进入该包,敲击如下命令后…...

【动态规划篇】穿越算法迷雾:约瑟夫环问题的奇幻密码
欢迎拜访:羑悻的小杀马特.-CSDN博客 本篇主题:带你众人皆知的约瑟夫环问题 制作日期:2024.12.29 隶属专栏:C/C题海汇总 目录 引言: 一约瑟夫环问题介绍: 11问题介绍: 1.2起源与历史背景&…...

代码随想录算法训练营第51期第32天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
理论基础 动态规划:dp,每一个状态都是由上个状态推导出来的,因为我是先写完三道题再看理论的,所以有点感概; 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举…...

爱思唯尔word模板
爱思唯尔word模板 有时候并不一定非得latex https://download.csdn.net/download/qq_38998213/90199214 参考文献书签链接...
每日一题 354. 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题 需要对信封排序 ,重点是再宽度相同时,逐步减少其高度 class Solution { public:int maxEnvelopes(vector<vector<int>>& envelopes) {sort(envelopes.begin(),envelopes.end(),[](const vector<int>&a,const v…...

ASP.net网站的注册、登录和密码修改的操作详解
一、进入注册、登录和密码修改操作详解 ASP.net网站为用户提供不同权限状态下的操作界面。根据用户登录状态,页面会显示不同的选项。 已登录用户的操作 图1 登录后操作界面 当用户已登录系统时,会显示以下内容和功能: 1. 欢迎信息 页面顶部…...

2024.12.29(进程线程实现并发服务器)
作业 多进程多线程并发服务器实现一遍提交。 服务器 #include <myhead.h> #define PORT 12345 #define IP "192.168.124.123"void *fun(void *fd) {int newfd *(int *)fd;char buff[1024];while(1){int res recv(newfd,buff,sizeof(buff),0);if(res 0){p…...

如何在 Ubuntu 上安装 PyTorch
简介 PyTorch 因其易用性、动态计算图和高效性而日益流行,成为实现深度学习模型的首选。如果你想探索这个工具并学习如何在 Ubuntu 上安装 PyTorch,本指南将对你有所帮助! 在本教程中,我们将引导你完成在 Ubuntu 系统上使用 Pip…...

8-Gin 中间件 --[Gin 框架入门精讲与实战案例] 【文末有测试代码】
路由中间件 Gin 是一个用 Go (Golang) 编写的 HTTP web 框架。它以性能好、中间件支持灵活著称,非常适合用来构建微服务或 RESTful API 服务。下面我将提供三个使用 Gin 的路由中间件的完整示例。 示例 1: 简单的日志记录中间件 这个中间件会在每个请求处理前后打…...

【潜意识Java】深入详细理解分析Java中的toString()方法重写完整笔记总结,超级详细。
目录 一、toString() 方法是啥? (一)默认的 toString() 方法 (二)toString() 方法的作用 二、为啥要重写 toString() 方法? (一)提高代码的可读性 (二)…...

【论文笔记】Contrastive Learning for Sign Language Recognition and Translation
🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Contrastive Learning for…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

Ray框架:分布式AI训练与调参实践
Ray框架:分布式AI训练与调参实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 Ray框架:分布式AI训练与调参实践摘要引言框架架构解析1. 核心组件设计2. 关键技术实现2.1 动态资源调度2.2 …...

20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题
20250609在荣品的PRO-RK3566开发板的Android13下解决串口可以执行命令但是脚本执行命令异常的问题 2025/6/9 20:54 缘起,为了跨网段推流,千辛万苦配置好了网络参数。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在调试串口/DEBUG口正确执行。…...

World-writable config file /etc/mysql/mysql.conf.d/my.cnf is ignored
https://stackoverflow.com/questions/53741107/mysql-in-docker-on-ubuntu-warning-world-writable-config-file-is-ignored 修改权限 -> 重启mysql # 检查字符集配置 SHOW VARIABLES WHERE Variable_name IN (character_set_server, character_set_database ); --------…...