目录
3.2. HCI_Disconnection_Complete事件
3.3. HCI_LE_CIS_Established事件(针对CIS)
HCI_Disconnect 命令主要用于终止一个已经存在的蓝牙连接。在蓝牙通信的各类场景中,当需要结束特定连接时,就会使用到该命令,它起到了主动断开连接、释放相关资源的重要作用。
一、命令概述
HCI_Disconnect 命令用于终止现有的蓝牙连接。它接收两个参数:Connection_Handle(连接句柄),用于指示要断开的连接;以及Reason(原因),用于指示结束连接的原因。
- 连接断开顺序:在断开ACL连接之前,必须确保在同一物理链路上的所有SCO(同步连接)、eSCO(增强同步连接)和CIS(连接导向同步)连接都已先被断开。这如果不遵循此顺序,这些连接将在ACL断开过程中被隐式断开,可能导致资源释放不当或通信混乱。
- 中央设备(Central)的限制:
- 命令顺序:在为同一个CIS发出HCI_LE_Create_CIS命令之前,不能发出HCI_Disconnect命令。否则,控制器将返回错误码“Command Disallowed (0x0C)”,表示不允许执行此命令。
- 待处理命令:若存在待处理的HCI_LE_Create_CIS命令(即CIS尚未创建),此时发出HCI_Disconnect命令将成功执行,但CIS将不会被创建。
- 外围设备(Peripheral)的限制:在控制器生成HCI_LE_CIS_Established事件之前,不能发出HCI_Disconnect命令。否则,控制器同样将返回错误码“Command Disallowed (0x0C)”。
- 连接句柄的特殊性:在中央设备上,CIS的连接句柄在断开后仍然保持有效。意味着主机可以使用相同的连接句柄在后续时间点重新创建之前断开过的CIS,为蓝牙设备间的灵活连接提供了便利。
HCI_Disconnect命令虽然功能简单,但在实际使用中需严格遵循蓝牙通信协议规定的条件、顺序和限制。这些规定目的在确保蓝牙通信系统的稳定、有序运行,避免混乱和错误状态的出现。主机和控制器应根据实际情况灵活处理不同命令的执行顺序和结果,以满足蓝牙设备间灵活建立、断开和重新建立特定连接的需求。同时,在实际设计和实现蓝牙通信系统时,应充分考虑这些限制和特殊要求,以确保系统的正确性和可靠性。
二、命令格式和参数说明
2.1. HCI_Disconnect 命令格式
HCI_Disconnect命令的格式通常包括以下几个关键部分:
-
Packet Type:表示数据包类型。对于HCI命令,其值通常为0x01。
-
Opcode:操作码,由OGF(操作码组字段)和OCF(操作码命令字段)组成。
- OGF:表示HCI命令的种类,如Link Control、Link Policy、Controller & BaseBand以及Information等。对于HCI_Disconnect命令,OGF的值为0x01,表示Link Control Command。
- OCF:表示具体的HCI命令。对于HCI_Disconnect命令,OCF的值是固定的,用于区分不同的Link Control命令。
-
Parameter Length:参数长度字段,表示后续参数的长度。对于HCI_Disconnect命令,该字段的值通常为2(或根据具体实现有所不同),表示后续有两个字节的参数。
-
Parameters:参数部分,用于提供执行命令所需的具体信息。
2.2. Connection_Handle
Connection_Handle用于标识要断开连接的句柄。在蓝牙系统中,每个建立起来的连接都会被分配一个唯一的连接句柄,通过这个句柄就能精准地指定要断开的是哪一个具体连接,就如同通过房间号来确定要关闭哪一间屋子的门一样。
主机(Host)借助 Connection_Handle 参数,明确告诉蓝牙控制器(Controller)具体需要断开的连接对象,使得控制器能够准确无误地执行断开操作,避免误断其他正在使用的连接。
2.3. Reason
Reason参数表示结束连接的原因,会被复制到对应协议数据单元(PDU)的错误码字段中。在BR/EDR连接中,会被复制到 LMP_DETACH PDU 的错误码字段;而在BLE连接里,则会被复制到 LL_TERMINATE_IND 或 LL_CIS_TERMINATE_IND PDU 的错误码字段。
- 0x05 - Authentication Failure
- 认证失败。意味着在尝试建立蓝牙连接时,认证过程未成功完成。可能是由于密码或密钥不匹配、设备不支持所需的认证方法或其他安全相关的问题导致的。
- 0x13 - Other End Terminated Connection (User Ended)
- 另一端终止了连接(用户结束)。表示远程设备或用户主动断开了蓝牙连接。可能是由于用户操作、设备故障或远程设备上的策略导致的。
- 0x14 - Other End Terminated Connection (Low Resources)
- 另一端因资源不足而终止了连接。通常意味着远程设备由于资源限制(如内存、处理能力或带宽)而无法继续维持连接。
- 0x15 - Other End Terminated Connection (About to Power Off)
- 另一端即将关机而终止了连接。表示远程设备即将关闭电源,因此主动断开了蓝牙连接。
- 0x1A - Unsupported Remote Feature
- 不支持远程功能。表示尝试使用的蓝牙功能或特性在远程设备上不受支持。
- 0x29 - Pairing with Unit Key Not Supported
- 不支持与密钥配对。意味着在尝试建立蓝牙连接时,所需的配对方法(特别是使用单元密钥的方法)在远程设备上不受支持。
- 0x3B - Unacceptable Connect