

下面这部分讲的是 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,可先跳过。