本文内容比较杂散,只是做记录使用,后续会整理的有条理些
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)可以显著提高通信稳定性。
如需更深入了解,或希望针对具体设备和使用场景进行分析,可以提供更多细节!