
HCI_Connection_Complete事件是蓝牙通信中的一个重要事件,用于通知主机(Host)一个新的连接已经建立。
HCI_Connection_Complete 事件的事件码为 0x03。此事件是蓝牙主机控制器接口(HCI)中的一个重要事件,用于向参与连接的两个主机表明一个新的连接已经成功建立。

同时,对于发出 HCI_Create_Connection、HCI_Accept_Connection_Request 或 HCI_Reject_Connection_Request 命令,并随后收到 HCI_Command_Status 事件的主机来说,该事件也用于告知其之前发出的命令最终是否成功。
在蓝牙HCI协议中,事件类型用于区分不同类型的事件,以便主机能够正确地解析和处理。

HCI_Connection_Complete事件包含多个参数,这些参数提供了连接尝试的详细结果和相关信息。
Status 参数用于指示蓝牙连接尝试的结果。

当蓝牙设备成功建立连接时,蓝牙控制器会为该连接分配一个唯一的 Connection_Handle。这个句柄在连接的生命周期内有效,并可用于后续的数据通信和连接管理操作。例如,当主机想要向特定的蓝牙设备发送数据时,它会使用与该设备连接对应的 Connection_Handle 来指定目标设备。

Connection_Handle 的有效值范围。由于只有12位是有效的,因此其最大值为 0x0EFF(即二进制的 0000 1110 1111),最小值为 0x0000。这个范围确保了 Connection_Handle 的唯一性,在同一时间内,蓝牙控制器不会为不同的连接分配相同的句柄。在处理 HCI_Connection_Complete 事件时,主机应检查 Connection_Handle 参数的值,并将其存储在适当的数据结构中,以便在后续操作中使用。如果连接失败,则可能不会提供有效的 Connection_Handle。
BD_ADDR表示蓝牙设备地址(Bluetooth Device Address)。用于表示与当前设备建立连接的另一个蓝牙设备的地址。

当两个蓝牙设备成功建立连接时,它们的 BD_ADDR 会被记录在连接信息中。这些信息可以用于后续的数据通信和连接管理操作。例如,主机可以使用 BD_ADDR 来指定要与之通信的蓝牙设备,或者查询与特定 BD_ADDR 关联的连接状态。
Link_Type 参数用于指示蓝牙连接的类型。

0x00:表示 SCO(Synchronous Connection-Oriented)连接。SCO 连接主要用于语音传输,因为它提供了固定的带宽和较低的时延,对于实时语音通信至关重要。0x01:表示 ACL(Asynchronous Connection-Less)连接(数据通道)。ACL 连接用于数据传输,它提供了更灵活的带宽分配,可以适应不同类型的数据传输需求。ACL 连接是非面向连接的,意味着数据包可以在任何时候发送,而不需要先建立连接状态。Encryption_Enabled 参数用于指示链路层加密是否已启用。

Status参数判断连接是否成功。以下是一个简化的C语言代码示例,用于模拟HCI_Connection_Complete事件的处理流程。请注意,这只是一个示例,实际蓝牙设备上的实现会复杂得多,并且需要依赖于特定的蓝牙协议栈和硬件接口。
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
// 假设这些结构体和枚举在蓝牙协议栈的头文件中定义
typedef struct {
uint8_t Status;
uint16_t Connection_Handle;
uint8_t BD_ADDR[6];
uint8_t Link_Type;
bool Encryption_Enabled;
} HCI_Connection_Complete_Event;
// 假设的连接状态表
typedef struct {
uint16_t Connection_Handle;
uint8_t BD_ADDR[6];
uint8_t Link_Type;
bool Encryption_Enabled;
bool IsConnected;
} ConnectionState;
#define MAX_CONNECTIONS 10
ConnectionState connectionStates[MAX_CONNECTIONS] = {0};
// 模拟事件接收函数
void receiveHCIConnectionCompleteEvent(HCI_Connection_Complete_Event* event) {
// 在这里,我们假设事件已经通过HCI接口接收并填充到event结构体中
// 这里只是简单地打印出事件信息
printf("Received HCI_Connection_Complete Event:\n");
printf("Status: 0x%02X\n", event->Status);
printf("Connection Handle: 0x%04X\n", event->Connection_Handle);
printf("BD_ADDR: ");
for (int i = 0; i < 6; i++) {
printf("%02X ", event->BD_ADDR[i]);
}
printf("\nLink Type: 0x%02X\n", event->Link_Type);
printf("Encryption Enabled: %s\n", event->Encryption_Enabled ? "Yes" : "No");
// 调用处理函数
processHCIConnectionCompleteEvent(event);
}
// 处理HCI_Connection_Complete事件的函数
void processHCIConnectionCompleteEvent(HCI_Connection_Complete_Event* event) {
if (event->Status == 0x00) {
// 连接成功
updateConnectionState(event);
notifyApplicationLayer(true, event->Connection_Handle, event->BD_ADDR);
} else {
// 连接失败
logError(event->Status, event->BD_ADDR);
notifyApplicationLayer(false, 0, NULL);
}
}
// 更新连接状态表的函数
void updateConnectionState(HCI_Connection_Complete_Event* event) {
for (int i = 0; i < MAX_CONNECTIONS; i++) {
if (!connectionStates[i].IsConnected) {
connectionStates[i].Connection_Handle = event->Connection_Handle;
memcpy(connectionStates[i].BD_ADDR, event->BD_ADDR, 6);
connectionStates[i].Link_Type = event->Link_Type;
connectionStates[i].Encryption_Enabled = event->Encryption_Enabled;
connectionStates[i].IsConnected = true;
break;
}
}
}
// 记录错误信息的函数
void logError(uint8_t status, uint8_t* bdAddr) {
// 在这里,我们可以将错误信息记录到日志文件中
// 这里只是简单地打印出错误信息
printf("Connection failed with Status: 0x%02X\n", status);
printf("BD_ADDR: ");
for (int i = 0; i < 6; i++) {
printf("%02X ", bdAddr[i]);
}
printf("\n");
}
// 通知应用程序层的函数
void notifyApplicationLayer(bool isConnected, uint16_t connectionHandle, uint8_t* bdAddr) {
// 在这里,我们可以通过回调函数或其他机制通知应用程序层
// 这里只是简单地打印出通知信息
if (isConnected) {
printf("Notifying application layer: Connection established with Handle: 0x%04X, BD_ADDR: ", connectionHandle);
} else {
printf("Notifying application layer: Connection failed\n");
return;
}
for (int i = 0; i < 6; i++) {
printf("%02X ", bdAddr[i]);
}
printf("\n");
}
int main() {
// 假设我们收到了一个HCI_Connection_Complete事件
HCI_Connection_Complete_Event event;
event.Status = 0x00; // 连接成功
event.Connection_Handle = 0x0001;
event.BD_ADDR[0] = 0xAA; event.BD_ADDR[1] = 0xBB; event.BD_ADDR[2] = 0xCC;
event.BD_ADDR[3] = 0xDD; event.BD_ADDR[4] = 0xEE; event.BD_ADDR[5] = 0xFF;
event.Link_Type = 0x01; // 假设的Link Type值
event.Encryption_Enabled = true;
// 接收并处理事件
receiveHCIConnectionCompleteEvent(&event);
return 0;
}Status参数中的错误码。Connection_Handle在有效范围内。BD_ADDR的合法性和唯一性。Link_Type确定连接类型,适配相应的通信策略。Encryption_Enabled参数表示的连接安全性。综上所述,HCI_Connection_Complete事件是蓝牙通信中一个重要的事件,用于通知主机一个新的连接已经建立,并提供了连接的相关信息。在蓝牙设备的管理和开发中,应充分利用该事件来实现设备的连接管理、数据传输准备以及连接状态监控等功能。