BLE Legacy 连接【断开连接 Disconnect command】

下面这部分讲的是 HCI_Disconnect command,也就是:

复制代码
断开一个已经存在的连接

注意:它不是 LE Controller commands 里的命令,而是在:

复制代码
7.1. Link Control commands

里面。

但是 BLE 连接建立后同样会用它来断开 ACL 连接


一、先翻译

1. 命令基本信息

复制代码
Command:
HCI_Disconnect

OCF:
0x0006

Command Parameters:
Connection_Handle
Reason

Return Parameters:
none

翻译:

这个命令是 HCI_Disconnect

它有两个命令参数:

复制代码
Connection_Handle
Reason

没有 Return Parameters。


二、Description 翻译

原文大意:

该命令用于终止一个已经存在的连接。

Connection_Handle 参数用于指明要断开哪一个连接。

Reason 参数用于说明结束连接的原因。这个原因会被复制到:

复制代码
BR/EDR 连接中的 LMP_DETACH PDU 的 error code 字段

或者:

复制代码
LE 连接中的 LL_TERMINATE_IND / LL_CIS_TERMINATE_IND PDU 的 error code 字段

所有 SCO、eSCO 和 CIS 连接,在同一物理连接上的 ACL 连接断开之前,都应该先被断开。

如果没有先断开,它们会作为 ACL 断开的一部分被隐式断开。

如果 Host 在同一个 CIS 的 HCI_LE_Create_CIS 命令 pending 时发送这个命令,并且 CIS 还没有创建,那么这个命令会成功,CIS 不会被创建。

注意:CIS 是当 Central 向 Peripheral 发送该 CIS 的 LL_CIS_IND PDU 时创建的。

注意:如果 Controller 遵循本规范 v5.4 或更早版本的要求,那么在 CIS 创建之前发送这个命令,Controller 可能返回错误。

注意:在 Central 上,CIS 的 handle 即使在断开之后仍然有效,因此 Host 后续可以使用同一个 connection handle 重新创建已断开的 CIS。


三、Errors 翻译

这部分错误主要是跟 CIS 有关,也就是 BLE Isochronous Channels,不是 BLE Legacy 普通连接的重点。

错误 1

条件:

复制代码
On the Central, the Controller has not received the HCI_LE_Create_CIS command for the same CIS

翻译:

在 Central 侧,Controller 还没有收到针对同一个 CIS 的 HCI_LE_Create_CIS 命令。

错误码:

复制代码
Command Disallowed (0x0C)

错误 2

条件:

复制代码
On the Peripheral, the Controller has not generated the HCI_LE_CIS_Established event for that CIS.

翻译:

在 Peripheral 侧,Controller 还没有为该 CIS 生成 HCI_LE_CIS_Established event

错误码:

复制代码
Command Disallowed (0x0C)

四、Command Parameters 翻译

1. Connection_Handle

复制代码
Size: 2 octets
12 bits meaningful

翻译:

Connection_Handle 占 2 字节,但真正有意义的是其中 12 bit。

取值范围:

复制代码
0x0000 到 0x0EFF

含义:

复制代码
要断开的连接句柄

也就是说,Controller 通过这个 handle 知道 Host 要断开哪一条连接。


2. Reason

复制代码
Size: 1 octet

翻译:

Reason 表示断开连接的原因。

规范允许填写的 Reason 包括:

复制代码
0x05
0x13 到 0x15
0x1A
0x29
0x3B

对应含义包括:

复制代码
0x05:Authentication Failure
0x13 ~ 0x15:Other End Terminated Connection
0x1A:Unsupported Remote Feature / Unsupported LMP Feature
0x29:Pairing With Unit Key Not Supported
0x3B:Unacceptable Connection Parameters

也就是说,Host 不是随便填一个 Reason,而是只能填规范允许的错误码。


五、Return parameters 翻译

复制代码
None.

翻译:

该命令没有 Return Parameters。

注意:没有 Return Parameters 不代表没有执行结果。

它的执行状态和最终断开结果会通过 HCI Event 返回。


六、Event(s) generated 翻译

原文大意:

当 Controller 收到 HCI_Disconnect 命令后,会向 Host 发送:

复制代码
HCI_Command_Status event

当连接终止完成后,每个 Host 都会收到:

复制代码
HCI_Disconnection_Complete event

在本地 Host 上,这个事件也表示该命令已经完成。

本地 Host 收到的 HCI_Disconnection_Complete event 中,Reason 参数应该设置为:

复制代码
Connection Terminated by Local Host (0x16)

而不是设置为 Host 在 HCI_Disconnect 命令里传入的 Reason。

但是,如果连接是因为 timer 超时而终止,并且本地 Controller 无法判断对端 Controller 是否收到了 Reason,那么本地 Host 收到的 Reason 应设置为:

复制代码
LMP Response Timeout / LL Response Timeout (0x22)

如果该命令用于 Central 侧的 CIS,并且 CIS 在创建前被成功终止,或者创建后但建立前被终止,那么还会为该 CIS 发送:

复制代码
HCI_LE_CIS_Established event

并且 Status 为:

复制代码
Operation Cancelled by Host (0x44)

七、这部分内容表述了哪些知识

这部分主要讲了这些知识:

复制代码
1. HCI_Disconnect 用于断开已经存在的连接。

2. 断开哪条连接由 Connection_Handle 指定。

3. 断开原因由 Reason 指定。

4. 在 LE 连接中,Reason 会进入 LL_TERMINATE_IND PDU 的 error code 字段。

5. 该命令没有 Return Parameters,但会先产生 HCI_Command_Status event。

6. 真正断开完成后,会产生 HCI_Disconnection_Complete event。

7. 本地 Host 收到的 Disconnection Complete 事件中,Reason 通常是 Connection Terminated by Local Host,而不是命令里传入的 Reason。

8. 文中关于 CIS 的内容属于 BLE Isochronous Channels,不是 BLE Legacy 普通连接的重点。

八、必要 Tip 说明

Tip 1:Disconnect 用于"已经建立成功的连接"

这个命令和前面的 HCI_LE_Create_Connection_Cancel 要区分清楚。

复制代码
HCI_LE_Create_Connection_Cancel:
取消正在创建、但还没有成功建立的连接

HCI_Disconnect:
断开已经建立成功的连接

判断标准很简单:

复制代码
还没有 Connection_Handle:
用 Create Connection Cancel

已经有 Connection_Handle:
用 Disconnect

Tip 2:BLE 连接断开也用 HCI_Disconnect

虽然这个命令在 7.1 Link Control commands 里,不在 7.8 LE Controller commands 里,但 BLE 连接断开仍然会使用它。

原因是 BLE 连接建立后,本质上也是一条:

复制代码
ACL connection

HCI_Disconnect 是通用的 ACL 连接断开命令。

所以不要看到它不在 LE Controller commands 里,就以为 BLE 不用它。


Tip 3:Connection_Handle 是断开连接的关键索引

BLE 连接成功后,Controller 会通过连接完成事件返回:

复制代码
Connection_Handle

比如:

复制代码
LE Connection Complete event
LE Enhanced Connection Complete event

里面都会有 Connection_Handle。

后续 Host 要对这条连接进行操作,例如:

复制代码
断开连接
更新连接参数
读取 PHY
设置 PHY
设置 Data Length
发送 ACL Data

基本都要依赖这个 Connection_Handle。

所以:

复制代码
Connection_Handle = Host 操作某条 BLE 连接的句柄

Tip 4:Reason 是告诉对端"为什么断开"

Reason 参数不是只给本地 Controller 看,它还会被放进链路层终止 PDU。

对于 LE 连接,它会进入:

复制代码
LL_TERMINATE_IND PDU 的 error code 字段

也就是说,Controller 会通过链路层告诉对端:

复制代码
这条连接为什么被终止

例如常见的主动断开原因可以是:

复制代码
Remote User Terminated Connection
Connection Terminated by Local Host
Unacceptable Connection Parameters

不同原因会影响对端看到的断开原因。


Tip 5:命令里的 Reason 和本地收到的 Disconnection Complete Reason 不一定一样

这是这部分最容易忽略的地方。

Host 发 HCI_Disconnect 时传了一个 Reason。

但是本地 Host 最后收到:

复制代码
HCI_Disconnection_Complete event

里面的 Reason,规范要求通常是:

复制代码
Connection Terminated by Local Host (0x16)

而不是你在命令参数里传入的那个 Reason。

为什么?

因为从本地 Host 的角度看:

复制代码
这条连接是我本地主动断开的

所以本地事件里显示的是:

复制代码
Connection Terminated by Local Host

而命令里的 Reason 是要放到链路层终止包里通知对端的。

可以这样理解:

复制代码
HCI_Disconnect command 里的 Reason:
告诉对端为什么断

HCI_Disconnection_Complete event 里的 Reason:
告诉本地 Host 这条连接最终是怎么断开的

Tip 6:没有 Return Parameters,但会先有 Command Status

这个命令的 Return Parameters 是:

复制代码
None

但执行流程并不是没有反馈。

实际事件流程是:

复制代码
Host 发送 HCI_Disconnect
        ↓
Controller 返回 HCI_Command_Status event
        ↓
Controller 执行断开流程
        ↓
Controller 返回 HCI_Disconnection_Complete event

所以:

复制代码
HCI_Command_Status event:
表示命令是否被 Controller 接收并开始处理

HCI_Disconnection_Complete event:
表示连接是否真正断开完成

不能只看 Command Status 就认为连接已经断开。


Tip 7:BLE Legacy 连接重点看 ACL 和 LL_TERMINATE_IND,不必纠结 CIS

截图里多次提到了:

复制代码
CIS
HCI_LE_Create_CIS
HCI_LE_CIS_Established
LL_CIS_TERMINATE_IND

这些是 BLE Isochronous Channels 相关内容,主要用于 LE Audio 等场景。

如果你现在目标是理解:

复制代码
BLE Legacy 广播、扫描、连接、GATT 通讯

那么这部分 CIS 内容可以先降低优先级。

你当前真正需要掌握的是:

复制代码
HCI_Disconnect 如何断开 BLE ACL connection
LE 连接断开时使用 LL_TERMINATE_IND
断开完成后 Host 收到 HCI_Disconnection_Complete event

九、关键信息具体说明

关键信息 1:HCI_Disconnect 用于终止已有连接

核心句子是:

复制代码
This command is used to terminate an existing connection.

具体说明:

HCI_Disconnect 不是连接建立前的取消命令,而是连接已经存在后,用于主动终止连接。

在 BLE Legacy 连接流程中:

复制代码
Central 使用 HCI_LE_Create_Connection 建立连接
连接成功后获得 Connection_Handle
后续需要主动断开时,使用 HCI_Disconnect

关键信息 2:Connection_Handle 指定要断开的连接

核心句子是:

复制代码
The Connection_Handle parameter indicates which connection is to be disconnected.

具体说明:

一个 Controller 可能同时维护多条连接。

例如一个 Central 同时连接多个 Peripheral。

这时 Host 要断开其中某一条,就不能只说"断开连接",必须通过:

复制代码
Connection_Handle

明确指定目标连接。


关键信息 3:Reason 表示断开原因,并会进入链路层终止 PDU

核心句子是:

复制代码
The Reason parameter indicates the reason for ending the connection.

对于 LE 连接,它会被复制到:

复制代码
LL_TERMINATE_IND PDU 的 error code 字段

具体说明:

BLE 两端断开连接时,不只是本地释放资源,还会通过 Link Layer 通知对端。

Reason 就是这个通知里的断开原因。

因此 Reason 的选择不是随便的,应该选择符合当前断开场景的错误码。


关键信息 4:断开完成靠 HCI_Disconnection_Complete event 通知

核心事件是:

复制代码
HCI_Disconnection_Complete event

具体说明:

Host 发送 HCI_Disconnect 后,连接并不是在发命令的一瞬间就完成断开。

Controller 还需要执行链路层断开过程。

最终断开完成后,Controller 才通过:

复制代码
HCI_Disconnection_Complete event

告诉 Host:

复制代码
连接已经终止
Connection_Handle 已经无效
断开原因是什么

关键信息 5:本地 Host 的断开完成 Reason 通常是 0x16

规范特别说明:

复制代码
The Reason parameter in the event on the local Host shall be set to
Connection Terminated by Local Host (0x16)

这说明:

即使 Host 在 HCI_Disconnect command 里传了别的 Reason,本地收到的断开完成事件里,Reason 通常还是:

复制代码
0x16:Connection Terminated by Local Host

这在看 HCI log 时很重要。

你可能会看到:

复制代码
Host 发 Disconnect,Reason = 0x13
本地 Disconnection Complete event,Reason = 0x16

这不一定是异常,而是规范要求的行为。


十、BLE Legacy 连接里最需要记住的内容

对于你现在学习 BLE Legacy 连接,这部分可以浓缩为:

复制代码
HCI_Disconnect 用于断开已经建立的 BLE ACL connection。

断开目标由 Connection_Handle 指定。

Reason 表示断开原因,并会进入 LE Link Layer 的 LL_TERMINATE_IND PDU。

命令发送后,Controller 先返回 HCI_Command_Status event。

真正断开完成后,Controller 返回 HCI_Disconnection_Complete event。

本地主动断开时,本地 Host 收到的 Disconnection Complete Reason 通常是 0x16:Connection Terminated by Local Host。

CIS 相关内容属于 BLE Isochronous Channels,可先跳过。
相关推荐
K成长日志1 天前
BLE协议之设备地址
网络·物联网·网络协议·嵌入式·蓝牙·ble
奔跑吧 android2 天前
【Bluetooth-SIG】【CoreV6.2】【Vol3 Part F】【十三】【Error Handling——ATT_ERROR_RSP】
ble·bluetooth·att·gatt·蓝牙协议·bt·core_v6.2
HiDev_2 天前
HCI 功能规范【5.1. Correctness】
蓝牙·ble·ble 蓝牙广播·蓝牙hci command·蓝牙广播扫描
HiDev_3 天前
HCI 功能规范【4.2. Controller to Host data flow control】
蓝牙·ble·ble 蓝牙广播·蓝牙hci command
HiDev_3 天前
HCI 功能规范【4.4. Command flow control】
蓝牙·ble·ble 蓝牙广播·蓝牙hci command
欢乐熊嵌入式编程21 天前
WIFI通信协议全解析18: ESP32 作为 AP 热点:打造自己的“微型路由器”(附完整实战代码)
物联网·wifi·esp32·蓝牙·wifi协议·ap热点
YF02111 个月前
Android BLE 信号强度获取与 底层原理深度解析
android·蓝牙
Refrain_zc1 个月前
无触摸屏场景下的蓝牙交互:Android 纯按键蓝牙扫描配对与 A2DP/Headset 连接
java·蓝牙
sweet丶1 个月前
iOS 蓝牙开发深入总结
ios·蓝牙