BLE Legacy 连接【建立连接 LE Create Connection】


这部分讲的是 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_Length 和 Max_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 当前连接使用的是哪种通道选择算法。
它不是连接成功的主事件,而是连接成功后的附加信息事件。
更多推荐
所有评论(0)