这部分讲的是 HCI_LE_Create_Connection command,也就是 BLE Legacy 连接中,Central 设备主动发起连接时使用的 HCI 命令。

它的核心作用可以概括为:

Host 通过 HCI_LE_Create_Connection 命令告诉 Controller:
去扫描指定的可连接广播设备,并尝试与它建立 BLE ACL 连接。

这里的“local device in the Central role”表示:本地设备作为 Central 角色
“connectable advertiser”表示:对方设备正在发送可连接广播,通常就是 Peripheral。


1. 这部分内容表述了哪些知识

这部分主要表述了以下几类知识:

1. HCI_LE_Create_Connection command 的作用
2. 该命令用于 Central 发起 BLE Legacy 连接
3. 该命令需要哪些参数
4. 扫描参数如何影响连接发起过程
5. Initiator_Filter_Policy 如何决定连接目标
6. Peer_Address_Type / Peer_Address 如何指定对端设备
7. Own_Address_Type 如何决定本端在连接请求包中使用什么地址
8. 连接参数 Connection Interval / Latency / Supervision Timeout 的含义
9. Min_CE_Length / Max_CE_Length 的作用
10. 命令可能出现的错误条件

2. 这条命令的核心定位

HCI_LE_Create_Connection 是 Central 发起连接的命令

BLE Legacy 连接流程中,Peripheral 先发可连接广播,例如:

ADV_IND

Central 扫描到这个广播后,如果决定连接,就通过:

HCI_LE_Create_Connection

让 Controller 去发起连接过程。

所以这条命令不是 Peripheral 用的,而是 Central / Initiator 用的

可以理解为:

Peripheral:
开启可连接广播,等待别人连接

Central:
使用 HCI_LE_Create_Connection 主动发起连接

3. Command Parameters 表达了什么

截图中列出的参数如下:

LE_Scan_Interval
LE_Scan_Window
Initiator_Filter_Policy
Peer_Address_Type
Peer_Address
Own_Address_Type
Connection_Interval_Min
Connection_Interval_Max
Max_Latency
Supervision_Timeout
Min_CE_Length
Max_CE_Length

这些参数可以分成三组理解。


第一组:连接前如何扫描目标设备

LE_Scan_Interval
LE_Scan_Window

这两个参数用于告诉 Controller:在发起连接过程中,应该如何扫描广播包。

LE_Scan_Interval

表示扫描周期。

可以理解为:

Controller 多久启动一次扫描窗口

LE_Scan_Window

表示每个扫描周期内真正扫描的时间长度。

可以理解为:

每次扫描持续多久

规范要求:

LE_Scan_Window <= LE_Scan_Interval

如果两者相等:

LE_Scan_Window == LE_Scan_Interval

表示 Controller 应该连续扫描。

也就是没有空闲间隔,扫描占空比为 100%。

这对连接建立速度有帮助,但功耗也会更高。


第二组:连接谁

Initiator_Filter_Policy
Peer_Address_Type
Peer_Address

这一组决定 Central 要连接哪个 Peripheral。


Initiator_Filter_Policy

这个参数决定是否使用 Filter Accept List。

它的核心作用是:

决定连接目标是由 Peer_Address 指定,还是由 Filter Accept List 决定。

可以分两种情况理解:

不使用 Filter Accept List:
通过 Peer_Address_Type + Peer_Address 指定目标设备

使用 Filter Accept List:
Controller 根据 Filter Accept List 里的设备决定可以连接谁

所以它影响的是 连接目标的选择方式


Peer_Address_Type

表示对端广播设备使用的地址类型。

常见类型包括:

Public Device Address
Random Device Address
Resolvable Private Address
Non-Resolvable Private Address

截图中特别说明:

Host 不应把 Peer_Address_Type 设置为 0x02 或 0x03,
除非 Host 和 Controller 都支持 HCI_LE_Set_Privacy_Mode command。

这说明 0x02 / 0x03 和隐私地址、地址解析、Privacy Mode 有关。

简单理解:

0x00 / 0x01:
常规 Public / Random 地址类型

0x02 / 0x03:
和可解析私有地址、身份地址、隐私模式相关

如果不理解 BLE Privacy,先不要把重点放在 0x02 / 0x03 上。


Peer_Address

表示对端设备地址。

它可能是:

Public Device Address
Random Static Device Address
Non-Resolvable Private Address
Resolvable Private Address

具体是哪一种,要结合:

Peer_Address_Type

一起判断。

所以 BLE 连接里不能只看地址值,还要看地址类型。

比较严谨的说法是:

连接目标 = Peer_Address_Type + Peer_Address

而不是只说“连接某个 MAC 地址”。


第三组:本端使用什么地址

Own_Address_Type

这个参数表示 Central 在连接请求包中使用什么本地地址。

也就是 Central 发起连接时,CONNECT_IND / AUX_CONNECT_REQ 里自己的地址类型。

在 Legacy 连接中,可以简单理解为:

Central 用 Public Address 发起连接
Central 用 Random Address 发起连接
Central 使用隐私地址发起连接

如果 Own_Address_Type 设置不当,会直接导致命令参数错误。

截图下面的 Errors 表格里很多错误都和 Own_Address_Type 有关。


第四组:连接建立后的连接参数

Connection_Interval_Min
Connection_Interval_Max
Max_Latency
Supervision_Timeout

这组参数不是用来“扫描”的,而是用来描述连接建立后希望使用的连接参数范围。


Connection_Interval_Min / Connection_Interval_Max

这两个参数定义允许的连接间隔范围。

Connection_Interval_Min:
最小连接间隔

Connection_Interval_Max:
最大连接间隔

规范要求:

Connection_Interval_Min <= Connection_Interval_Max

连接间隔决定两个设备多久进行一次连接事件。

连接间隔越短:

响应更快
吞吐潜力更高
功耗更高

连接间隔越长:

响应更慢
吞吐潜力降低
功耗更低

Max_Latency

这个参数表示 Peripheral latency,也就是从设备延迟。

它定义 Peripheral 最多可以跳过多少个连接事件不响应。

例如 Latency 较大时,Peripheral 不需要每个连接事件都醒来通信,可以降低功耗。

但代价是:

数据响应可能变慢
连接监督超时需要合理配置

Supervision_Timeout

这个参数表示链路监督超时时间。

也就是连接建立后,如果在一定时间内双方没有成功收到有效链路层数据,就认为连接断开。

规范中要求:

Supervision_Timeout 必须大于:
(1 + Max_Latency) × Connection_Interval_Max × 2

这个条件很重要。

它的意思是:

监督超时时间必须足够长,
否则 Peripheral 允许跳过连接事件后,
连接可能还没真正断,就被误判为超时断开。

第五组:连接事件长度建议

Min_CE_Length
Max_CE_Length

CE 是 Connection Event。

这两个参数用于告诉 Controller:

Host 期望连接事件的最小长度和最大长度

规范要求:

Min_CE_Length <= Max_CE_Length

但是截图里也说明:

Controller is not required to use these values.

也就是 Controller 不一定必须使用 Host 给的这两个值。

所以它们更像是 Host 给 Controller 的建议值,不是强制值。


4. Description 中的关键句子说明

关键句 1:用于创建 ACL connection

This command is used to create an ACL connection,
with the local device in the Central role,
to a connectable advertiser.

这句话非常关键。

它说明:

1. 建立的是 ACL connection
2. 本地设备角色是 Central
3. 对端必须是 connectable advertiser

BLE 连接建立之后,后续 ATT / GATT 数据最终都要通过 ACL Data 承载。

所以这个命令建立的是 BLE 逻辑链路的基础。


关键句 2:如果本地设备作为 Peripheral 已经被连接,该命令仍然 pending

If a connection is created with the local device in the Peripheral role
while this command is pending,
then this command remains pending.

意思是:

如果本地设备正在作为 Central 发起连接,但这时它又作为 Peripheral 被其他设备连接了,那么当前这个 HCI_LE_Create_Connection 命令不会自动结束,而是继续 pending。

这说明 Controller 可能支持多状态并行,例如:

一边作为 Central 发起连接
一边作为 Peripheral 被连接

但是否支持这些组合,还要看 Controller 支持状态能力。


关键句 3:LE_Scan_Window 小于等于 LE_Scan_Interval

The LE_Scan_Window parameter shall be set to a value
smaller or equal to the value set for the LE_Scan_Interval parameter.

这是扫描参数的基本约束。

Scan Window <= Scan Interval

如果设置成相等,就是连续扫描。


关键句 4:Initiator_Filter_Policy 决定是否使用 Filter Accept List

The Initiator_Filter_Policy is used to determine whether
the Filter Accept List is used.

这句话说明连接目标的选择有两种模式:

直接指定地址连接
使用 Filter Accept List 过滤连接

这也是很多 BLE SDK 里“直连”和“白名单连接”的底层来源。


关键句 5:Peer_Address_Type + Peer_Address 一起指定目标设备

If the Filter Accept List is not used,
the Peer_Address_Type and Peer_Address parameters specify
the address type and address of the advertising device to connect to.

这句话很关键。

它说明在不使用 Filter Accept List 的情况下,连接目标由:

Peer_Address_Type
Peer_Address

共同确定。

所以不能只看 Peer_Address。


关键句 6:Connection Interval 范围约束

Connection_Interval_Min shall not be greater than
Connection_Interval_Max.

也就是:

Connection_Interval_Min <= Connection_Interval_Max

关键句 7:Supervision Timeout 约束

The Supervision_Timeout in milliseconds shall be larger than
(1 + Max_Latency) × Connection_Interval_Max × 2

这个约束是 BLE 连接参数配置里非常重要的规则。

它避免监督超时时间设置得太短,导致连接参数本身合法性不足或者连接容易异常断开。


5. Errors 表格表达了什么

Errors 表格列出的是这个命令在什么情况下会失败,以及返回什么错误码。

它主要围绕三个方向:

1. 当前已经有连接创建命令 pending
2. 已经连接到同一个设备
3. Own_Address_Type 和地址初始化 / 隐私配置不匹配

错误 1:已有另一个 HCI_LE_Create_Connection 正在 pending

Another HCI_LE_Create_Connection command is pending in the Controller.

错误码:

Command Disallowed (0x0C)

意思是 Controller 当前已经有一个 LE Create Connection 过程还没结束,不能再发起另一个相同连接创建命令。


错误 2:已经连接到同一个设备

The local device is already connected to the same device address as the advertiser

错误码:

Connection Already Exists (0x0B)

意思是本地设备已经和这个地址对应的设备建立了连接,不能再重复建立同一个连接。

截图中特别提到:

including two different Resolvable Private Addresses
that resolve to the same IRK

意思是:

即使对方用了两个不同的 RPA,只要它们解析到同一个 IRK,也会被认为是同一个身份设备。

这和 BLE Privacy 有关。


错误 3:Own_Address_Type = 0x00,但设备没有 public address

Own_Address_Type is set to 0x00
and the device does not have a public address.

错误码:

Invalid HCI Command Parameters (0x12)

意思是 Host 要求 Controller 使用 Public Device Address,但这个设备没有 public address,所以参数无效。


错误 4:Own_Address_Type = 0x01,但 random address 没有初始化

Own_Address_Type is set to 0x01
and the random address for the device has not been initialized
using HCI_LE_Set_Random_Address command.

错误码:

Invalid HCI Command Parameters (0x12)

意思是 Host 要求使用 Random Address 发起连接,但之前没有通过:

HCI_LE_Set_Random_Address

设置随机地址。

所以如果 Own_Address_Type 使用 random address,前置命令通常是:

HCI_LE_Set_Random_Address

错误 5:Own_Address_Type = 0x02,但 resolving list 没有匹配项且设备没有 public address

这种情况涉及隐私地址。

简单理解:

Own_Address_Type = 0x02
表示本端可能使用可解析私有地址相关机制。

但是如果:

Controller 的 resolving list 没有匹配项
并且设备又没有 public address

Controller 就没有合适的本地地址可用,因此返回参数错误。


错误 6:Own_Address_Type = 0x02,使用 Filter Accept List,但设备没有 public address

当:

Own_Address_Type = 0x02
Initiator_Filter_Policy = 0x01

表示连接目标来自 Filter Accept List,同时本端地址使用隐私相关模式。

如果设备没有 public address,可能无法选择合适的 identity address,因此参数无效。


错误 7:Own_Address_Type = 0x03,但 resolving list 无匹配项,并且 random address 没初始化

这种情况也和隐私地址有关。

如果 Own_Address_Type = 0x03,Controller 可能需要在没有 resolving list 匹配项时回退到 random address。

但如果 random address 没有通过:

HCI_LE_Set_Random_Address

初始化,就会返回参数错误。


错误 8:Own_Address_Type = 0x03,使用 Filter Accept List,但 random address 没初始化

当:

Own_Address_Type = 0x03
Initiator_Filter_Policy = 0x01

并且本地 random address 没有初始化,也会返回参数错误。


6. 这部分最关键的信息

这部分最关键的信息可以整理为:

1. HCI_LE_Create_Connection 是 BLE Legacy 中 Central 发起连接的核心命令。

2. 该命令连接的是 connectable advertiser,也就是正在发送可连接广播的 Peripheral。

3. LE_Scan_Interval 和 LE_Scan_Window 决定连接发起过程中的扫描行为。

4. Initiator_Filter_Policy 决定是否使用 Filter Accept List。

5. 如果不使用 Filter Accept List,连接目标由 Peer_Address_Type + Peer_Address 指定。

6. Own_Address_Type 决定 Central 在连接请求包里使用什么本地地址。

7. Connection_Interval_Min / Max、Max_Latency、Supervision_Timeout 决定连接建立后的初始连接参数。

8. Supervision_Timeout 必须大于:
   (1 + Max_Latency) × Connection_Interval_Max × 2

9. Min_CE_Length / Max_CE_Length 是 Host 提供给 Controller 的连接事件长度建议,Controller 不一定采用。

10. 常见错误集中在:
    已有连接创建过程 pending;
    已经连接到同一设备;
    地址类型与地址初始化状态不匹配;
    隐私地址相关配置不满足条件。

7. 用一句话总结

HCI_LE_Create_Connection command 是 BLE Legacy 连接中 Central 发起连接的核心 HCI 命令,它一方面告诉 Controller 如何扫描和选择目标 Peripheral,另一方面也把连接建立后的初始连接参数一起交给 Controller。

下面这部分是 HCI_LE_Create_Connection command 的参数说明。它主要是在告诉 Host:发起 BLE Legacy 连接时,要给 Controller 哪些参数,以及这些参数分别控制什么。


一、参数翻译

1. LE_Scan_Interval

Size: 2 octets

翻译:

LE_Scan_Interval 定义为:Controller 从上一次 LE 扫描开始,到下一次 LE 扫描开始之间的时间间隔。

取值:N = 0xXXXX
范围:0x0004 到 0x4000
时间:N × 0.625 ms
时间范围:2.5 ms 到 10.24 s

说明:

这个参数表示扫描周期。
也就是 Controller 多久开启一次扫描窗口。


2. LE_Scan_Window

Size: 2 octets

翻译:

LE_Scan_Window 表示 LE 扫描持续的时间长度。

LE_Scan_Window 必须小于或等于 LE_Scan_Interval。

取值:N = 0xXXXX
范围:0x0004 到 0x4000
时间:N × 0.625 ms
时间范围:2.5 ms 到 10.24 s

说明:

这个参数表示每次扫描窗口持续多久。

如果:

LE_Scan_Window = LE_Scan_Interval

表示连续扫描。

如果:

LE_Scan_Window < LE_Scan_Interval

表示扫描一段时间,然后空闲一段时间,再继续扫描。


3. Initiator_Filter_Policy

Size: 1 octet

翻译:

Value 含义
0x00 不使用 Filter Accept List 来决定连接哪个广播设备。此时使用 Peer_Address_Type 和 Peer_Address 指定目标设备。
0x01 使用 Filter Accept List 来决定连接哪个广播设备。此时忽略 Peer_Address_Type 和 Peer_Address。
其他值 保留,未来使用。

说明:

这个参数决定 Central 发起连接时,目标设备是怎么确定的。

0x00:直接指定地址连接
0x01:通过 Filter Accept List 连接

4. Peer_Address_Type

Size: 1 octet

翻译:

Value 含义
0x00 Public Device Address
0x01 Random Device Address
0x02 Public Identity Address,对应对端的 Resolvable Private Address。只有当 Host 或 Controller 不支持 HCI_LE_Set_Privacy_Mode command 时,Host 才应使用这个值。
0x03 Random static Identity Address,对应对端的 Resolvable Private Address。只有当 Host 或 Controller 不支持 HCI_LE_Set_Privacy_Mode command 时,Host 才应使用这个值。
其他值 保留,未来使用。

说明:

Peer_Address_Type 表示要连接的对端设备地址类型。

BLE 连接时不能只看地址值,还要看地址类型。

比较准确地说,连接目标由下面两个字段共同确定:

Peer_Address_Type + Peer_Address

5. Peer_Address

Size: 6 octets

翻译:

Value 含义
0xXXXXXXXXXXXX 要连接设备的 Public Device Address、Random Device Address、Public Identity Address 或 Random static Identity Address。

说明:

Peer_Address 是对端设备地址,占 6 字节。

但是它到底是 Public Address、Random Address,还是 Identity Address,要结合:

Peer_Address_Type

一起判断。


6. Own_Address_Type

Size: 1 octet

翻译:

Value 含义
0x00 Public Device Address
0x01 Random Device Address
0x02 Controller 根据 resolving list 中的本地 IRK 生成 Resolvable Private Address。如果 resolving list 中没有匹配项,则使用 public address。
0x03 Controller 根据 resolving list 中的本地 IRK 生成 Resolvable Private Address。如果 resolving list 中没有匹配项,则使用最近一次通过 HCI_LE_Set_Random_Address command 成功设置的 random address。
其他值 保留,未来使用。

说明:

Own_Address_Type 表示本地设备在连接请求包中使用什么地址。

也就是 Central 发起连接时,自己对外表现成什么地址。

简单理解:

0x00:用本地 Public Address 发起连接
0x01:用本地 Random Address 发起连接
0x02:优先使用 RPA,没有匹配项时回退到 Public Address
0x03:优先使用 RPA,没有匹配项时回退到 Random Address

7. Connection_Interval_Min

Size: 2 octets

翻译:

连接间隔的最小值。该值必须小于或等于 Connection_Interval_Max。

取值:N = 0xXXXX
范围:0x0006 到 0x0C80
时间:N × 1.25 ms
时间范围:7.5 ms 到 4 s

说明:

这个参数表示连接建立后,允许的最小连接间隔。


8. Connection_Interval_Max

Size: 2 octets

翻译:

连接间隔的最大值。该值必须大于或等于 Connection_Interval_Min。

取值:N = 0xXXXX
范围:0x0006 到 0x0C80
时间:N × 1.25 ms
时间范围:7.5 ms 到 4 s

说明:

这个参数表示连接建立后,允许的最大连接间隔。

规范要求:

Connection_Interval_Min <= Connection_Interval_Max

9. Max_Latency

Size: 2 octets

翻译:

连接中允许的最大 Peripheral latency,单位是连接事件个数。

取值:0xXXXX
范围:0x0000 到 0x01F3

说明:

Max_Latency 表示 Peripheral 最多可以跳过多少个连接事件。

比如:

Max_Latency = 0

表示 Peripheral 不能跳过连接事件,每个连接事件都应该参与。

如果 Max_Latency 较大,Peripheral 可以少醒来几次,从而省电。


10. Supervision_Timeout

Size: 2 octets

翻译:

LE Link 的监督超时时间。

取值:N = 0xXXXX
范围:0x000A 到 0x0C80
时间:N × 10 ms
时间范围:100 ms 到 32 s

说明:

Supervision_Timeout 表示 BLE 连接的链路超时时间。

如果在这个时间内没有收到对端有效数据,Controller 就认为连接已经断开。


11. Min_CE_Length

Size: 2 octets

翻译:

为这个 LE 连接推荐的最小 connection event 长度。

取值:N = 0xXXXX
范围:0x0000 到 0xFFFF
时间:N × 0.625 ms

说明:

CE 是 Connection Event。

Min_CE_Length 表示 Host 推荐 Controller 每个连接事件至少持续多长时间。


12. Max_CE_Length

Size: 2 octets

翻译:

为这个 LE 连接推荐的最大 connection event 长度。

取值:N = 0xXXXX
范围:0x0000 到 0xFFFF
时间:N × 0.625 ms

说明:

Max_CE_Length 表示 Host 推荐 Controller 每个连接事件最多持续多长时间。


13. Return parameters

翻译:

None.

也就是这个命令没有 Return Parameters。

注意:没有 Return Parameters 不代表没有结果。
结果会通过后续 HCI Event 返回。


14. Event(s) generated

原文含义翻译:

当 Controller 收到 HCI_LE_Create_Connection command 后,Controller 会向 Host 发送:

HCI_Command_Status event

当因为该命令创建连接成功,或者连接创建过程被取消时,会生成以下事件之一:

HCI_LE_Connection_Complete event

或者:

HCI_LE_Enhanced_Connection_Complete event

如果这些事件都没有生成,则表示该命令仍然处于 pending 状态。

如果连接已经创建,并且 Controller 支持 LE Channel Selection Algorithm #2 特性,那么在生成连接完成事件后,会立即跟着生成:

HCI_LE_Channel_Selection_Algorithm event

二、必要 Tip 说明

Tip 1:这个命令不是“直接连接”,而是“开始发起连接过程”

HCI_LE_Create_Connection 不是 Host 直接把连接建立好了,而是 Host 告诉 Controller:

你去扫描目标设备的可连接广播,然后发起连接。

所以它里面才会带:

LE_Scan_Interval
LE_Scan_Window

因为 Central 在发起连接前,本质上仍然要扫描目标 Peripheral 的广播包。


Tip 2:LE_Scan_Interval 和 LE_Scan_Window 是 Initiating 阶段的扫描参数

这里的扫描参数不是普通扫描 App 设备列表时用的扫描参数,而是:

Central 发起连接时,Controller 用来寻找目标广播设备的扫描参数。

也就是说:

LE Set Scan Parameters:
用于普通扫描过程

LE Create Connection 里的 LE_Scan_Interval / LE_Scan_Window:
用于发起连接过程中的扫描过程

两者都叫 scan interval / scan window,但使用场景不同。


Tip 3:LE_Scan_Window 必须小于等于 LE_Scan_Interval

这是一个硬性规则:

LE_Scan_Window <= LE_Scan_Interval

例如:

LE_Scan_Interval = 60 ms
LE_Scan_Window = 30 ms

表示每 60 ms 开一个扫描窗口,每次扫描 30 ms。

如果:

LE_Scan_Interval = 60 ms
LE_Scan_Window = 60 ms

表示连续扫描。

连续扫描更容易快速发现目标设备,但功耗更高。


Tip 4:Initiator_Filter_Policy 决定“直连”还是“白名单连接”

这个参数非常关键。

Initiator_Filter_Policy = 0x00

表示不使用 Filter Accept List。此时 Controller 根据:

Peer_Address_Type + Peer_Address

去连接指定设备。

这就是最常见的“指定地址直连”。

Initiator_Filter_Policy = 0x01

表示使用 Filter Accept List。此时:

Peer_Address_Type 和 Peer_Address 被忽略

Controller 会从 Filter Accept List 中选择允许连接的设备。

这就是“白名单连接”。


Tip 5:Peer_Address 不能单独理解,必须和 Peer_Address_Type 一起看

BLE 中说“连接某个 MAC 地址”其实不够严谨。

更准确应该说:

连接某个 Device Address,需要同时知道 Address Value 和 Address Type。

比如同样的 6 字节地址值,在不同 Address Type 下含义可能不同。

所以连接目标应该理解为:

Peer_Address_Type + Peer_Address

Tip 6:Peer_Address_Type 的 0x02 / 0x03 和 BLE Privacy 有关

普通 BLE Legacy 连接常见的是:

0x00:Public Device Address
0x01:Random Device Address

而:

0x02:Public Identity Address
0x03:Random static Identity Address

主要和对端使用 Resolvable Private Address、IRK、Resolving List、Privacy Mode 相关。

如果现在的目标是先理解 BLE Legacy 普通连接,可以先重点掌握 0x00 和 0x01。


Tip 7:Own_Address_Type 决定 Central 在连接请求包里用什么本地地址

Peer_Address_Type / Peer_Address 是“连接谁”。

Own_Address_Type 是“我用什么地址去连接别人”。

可以这样记:

Peer = 对方
Own = 自己

例如:

Peer_Address_Type = 0x01
Peer_Address = 对方 Random Address

Own_Address_Type = 0x00

意思是:

我要连接一个使用 Random Address 的对方设备;
我自己使用 Public Address 发起连接。

Tip 8:Own_Address_Type = 0x01 时,通常要先设置随机地址

如果:

Own_Address_Type = 0x01

表示本地设备用 Random Device Address 发起连接。

这时通常要求之前已经调用过:

HCI_LE_Set_Random_Address

否则可能返回:

Invalid HCI Command Parameters

也就是说,不是把 Own_Address_Type 写成 0x01 就自动有随机地址了,随机地址需要提前配置。


Tip 9:连接参数是在发起连接时一起给 Controller 的

HCI_LE_Create_Connection 不只是告诉 Controller 连接哪个设备,还把连接建立后的初始连接参数也一起给了 Controller:

Connection_Interval_Min
Connection_Interval_Max
Max_Latency
Supervision_Timeout

也就是说,这条命令同时包含两件事:

1. 找谁连接
2. 连接后希望怎么通信

Tip 10:Connection Interval 决定连接事件频率

连接建立后,Central 和 Peripheral 不是时时刻刻都在通信,而是按照连接事件进行通信。

Connection_Interval 决定连接事件之间的间隔。

一般理解:

连接间隔越小:
响应越快,吞吐潜力越高,功耗越高

连接间隔越大:
响应越慢,吞吐潜力越低,功耗越低

取值换算:

实际时间 = N × 1.25 ms

例如:

N = 0x0018 = 24
连接间隔 = 24 × 1.25 ms = 30 ms

Tip 11:Max_Latency 是给 Peripheral 省电用的

Max_Latency 表示 Peripheral 最多可以跳过多少个连接事件。

例如:

Connection Interval = 30 ms
Max_Latency = 4

表示 Peripheral 最多可以跳过 4 个连接事件。

这样 Peripheral 不需要每次连接事件都醒来,可以省电。

但是代价是:

数据响应可能变慢

Tip 12:Supervision_Timeout 是连接保活超时

Supervision_Timeout 表示 BLE 链路多久收不到有效包就认为断开。

换算关系是:

实际时间 = N × 10 ms

例如:

N = 0x01F4 = 500
Supervision Timeout = 500 × 10 ms = 5000 ms = 5 s

它不能设置得太小,否则连接容易被误判断开。


Tip 13:Supervision_Timeout 要和 Interval / Latency 配套

前面 Description 里提到过一个非常重要的规则:

Supervision_Timeout > (1 + Max_Latency) × Connection_Interval_Max × 2

例如:

Connection_Interval_Max = 30 ms
Max_Latency = 4

最小 Supervision Timeout 应大于:
(1 + 4) × 30 ms × 2 = 300 ms

所以 Supervision Timeout 必须大于 300 ms。

这条规则的本质是:

既然允许 Peripheral 跳过一些连接事件,
那监督超时时间就必须足够长,
否则会出现参数逻辑冲突。

Tip 14:Min_CE_Length / Max_CE_Length 是建议值,不是强制值

Min_CE_LengthMax_CE_Length 是 Host 给 Controller 的连接事件长度建议。

但是规范里明确说过:

Controller is not required to use these values.

也就是 Controller 不一定采用。

所以这两个参数不要理解成“强制控制连接事件长度”。

更准确地说,它们是:

Host 对 connection event 长度的期望或建议

Tip 15:这个命令没有 Return Parameters,但结果靠 Event 返回

这里写:

Return parameters: None.

不要误解为“这个命令没有结果”。

这条命令的流程是:

Host 发送 HCI_LE_Create_Connection
Controller 先返回 HCI_Command_Status event
然后连接过程继续 pending
连接成功 / 失败 / 取消后,再通过 LE Connection Complete 或 LE Enhanced Connection Complete event 返回最终结果

所以要理解这条命令,必须和事件一起看。


Tip 16:HCI_Command_Status 不是连接成功

收到:

HCI_Command_Status event

只表示 Controller 已经接收了这个命令,并且命令开始执行或被初步拒绝。

它不表示连接已经成功。

真正表示连接结果的是:

HCI_LE_Connection_Complete event

或者:

HCI_LE_Enhanced_Connection_Complete event

Tip 17:连接流程可能长期 pending

规范说:

If one of these events is not generated, the command is considered pending.

意思是:如果连接完成事件一直没来,这个命令就仍然处于 pending 状态。

这也是为什么会有:

HCI_LE_Create_Connection_Cancel

用来取消正在进行中的连接创建过程。


Tip 18:LE Channel Selection Algorithm event 是连接成功后的附加事件

如果 Controller 支持:

LE Channel Selection Algorithm #2

那么连接成功事件后面可能马上跟一个:

HCI_LE_Channel_Selection_Algorithm event

这个事件用于告诉 Host 当前连接使用的是哪种通道选择算法。

它不是连接成功的主事件,而是连接成功后的附加信息事件。

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐