
ACL 连接建立与断开流程(ACL CONNECTION ESTABLISHMENT AND DETACHMENT )对于多种应用场景都非常重要。在物联网设备通信中,正确的连接建立和断开流程可以确保各种传感器和执行器之间的数据交互准确无误,提高整个系统的可靠性。在无线音频设备连接(如蓝牙耳机与手机连接)场景下,这一流程能够保障音频数据的稳定传输,为用户提供良好的使用体验。同时,对于开发人员来说,深入了解这些流程有助于更好地进行蓝牙应用程序的开发和调试,确保程序在连接管理方面的健壮性。
ACL(Asynchronous Connection - Less,异步连接链路)连接在蓝牙设备通信中起着关键作用。其连接建立和断开的流程涉及多个步骤,这些步骤通过详细的消息交互来实现,对于理解设备之间如何建立可靠通信链路以及在不需要通信时如何正确断开连接至关重要。两个设备之间的连接建立和断开流程如下图所示。

该过程被细分为9个明确的步骤。其中一些步骤是可选的,比如认证和加密;而一些步骤则是必需的,比如连接请求和设置完成步骤。概览图中的步骤与后续的消息序列图中的步骤直接相关。
以下是这些步骤的一个简要概述:
这些步骤确保了设备之间连接的安全性和可靠性,同时提供了足够的灵活性以适应不同的应用场景和需求。
蓝牙连接建立是一个多步骤的过程,涉及主机(Host)与控制器(Controller)以及链路管理器(LM)之间的交互,通过一系列命令和消息的传递,逐步完成从连接发起、参数协商、安全设置(如认证、加密)到最终连接建立完成并可进行数据传输的一系列操作,并且在连接不再需要时,也有相应的断开连接流程。以下是对蓝牙连接建立过程(Connection setup)的步骤。
主机向控制器发送 HCI_Create_Connection 命令,此命令是启动蓝牙连接建立的起始信号。

控制器在接收到该命令后,会依据指定的蓝牙设备地址(BD_ADDR)执行基带寻呼(Baseband Paging)程序。基带寻呼过程主要是在蓝牙的物理层和链路层,通过特定的信号发送和接收机制,尝试与目标设备建立初步的联系,就像在广播网络中呼叫特定的设备一样,让目标设备知晓有连接请求到来。
链路管理器(LM)可能会决定在建立连接之前交换设备的功能信息。

这一步骤是可选的,主要目的是让连接双方互相了解彼此支持的蓝牙功能特性,例如支持的蓝牙协议版本、支持的蓝牙服务类型、是否具备某些高级功能(如低功耗模式、高速传输模式等)等信息。通过这种功能交换,双方可以确定在后续的连接过程中能够使用哪些功能以及如何进行相应的配置。
中央设备(Central)的链路管理器会请求发送 LMP_HOST_CONNECTION_REQ 协议数据单元(PDU),这是向目标设备(外周设备,Peripheral)正式提出建立连接的请求消息。

外周设备的链路管理器在收到该请求后,会确认连接是否可行,并确定自身偏好的连接角色(如果有选择的话)。例如,在某些蓝牙设备连接场景中,不同的设备角色可能在资源分配、数据传输控制等方面具有不同的权限和职责,所以需要进行角色协商。
如果远程主机(这里指被连接的目标设备主机)拒绝了本次连接请求,那么连接链路将会被终止。这可能是由于多种原因导致的,例如目标设备当前正处于忙碌状态、不满足连接条件(如安全策略限制、资源不足等)或者用户手动拒绝了连接等。

远程主机接受连接请求,这意味着连接建立过程可以继续进行下一步操作,双方将按照既定的蓝牙连接规范进一步配置连接参数、进行安全设置等后续步骤,以最终建立起稳定的蓝牙连接。

远程主机接受连接但偏好作为中央设备角色,这将导致在发送 LMP_ACCEPTED 消息(针对之前的 LMP_HOST_CONNECTION_REQ PDU)之前发生角色切换。这种角色切换可能会涉及到连接双方在资源管理、数据流向控制等方面的调整,例如原本作为中央设备的一方可能需要将一些控制权限移交给新的中央设备,并且双方需要重新协商一些与角色相关的连接参数。

在双方交换了功能特性并且确定自适应跳频(AFH,Adaptive Frequency Hopping)支持可用后,中央设备可以在任何时候发送 LMP_SET_AFH 和 LMP_CHANNEL_CLASSIFICATION_REQ PDU。AFH 是蓝牙技术中用于提高蓝牙通信抗干扰能力的一种技术,通过动态地选择可用的蓝牙通信频道来避免干扰。这一步骤主要是对 AFH 相关参数进行设置和频道分类信息的请求,以优化蓝牙连接在复杂电磁环境下的性能。

链路管理器会询问是否需要进行认证操作,通过向主机请求本次连接的链路密钥(Link Key)来实现的。链路密钥是蓝牙认证过程中的关键元素,它用于验证设备的身份合法性。如果需要认证,那么后续将根据链路密钥进行一系列的认证操作;如果不需要认证,则可以跳过相关步骤直接进入其他连接设置环节(如加密设置或直接完成连接建立)。

如果高层要求进行认证并且连接的设备之间没有共同的链路密钥,那么将启动配对程序。

这个配对过程是为了在没有预先共享链路密钥的情况下,通过 PIN 码建立起设备之间的信任关系,并生成新的链路密钥供后续认证使用。
如果设备之间存在共同的链路密钥,那么就不需要进行配对操作。
Authentication_Enable 被设置为启用认证,那么将执行认证程序。
这里的消息序列图只展示了双方都设置 Authentication_Enable 的情况,主要是为了说明在有共同链路密钥且启用认证时的操作流程,即使用共享的链路密钥按照既定的认证协议进行身份验证操作。
一旦配对或认证程序成功完成,就可以启动加密程序。这里主要展示的是建立加密的点对点连接的设置过程。加密是为了保障连接过程中数据传输的安全性,通过特定的加密算法将传输的数据进行加密处理,使得只有拥有正确解密密钥的接收方才能还原并读取数据。在蓝牙连接中,加密程序的启动通常是在认证成功后,根据双方协商的加密算法和密钥进行设置,以确保后续数据传输的安全。

链路管理器通过发送 LMP_SETUP_COMPLETE PDU 来指示连接已经设置完成,主机将接收到新的连接句柄(Connection_Handle),有了这个连接句柄,连接就可以用于发送更高层的数据,如逻辑链路控制和适配协议(L2CAP)信息等。

连接句柄是在蓝牙连接建立后,用于标识和操作该连接的一个关键标识符,类似于一个连接的 “编号”,通过它可以在主机和控制器等不同层次的软件模块中对该连接进行各种操作,如数据发送、连接状态监测、连接参数调整等。
当连接不再需要时,任何一方设备都可以使用 HCI_Disconnect 命令和 LMP_DETACH 消息 PDU 来终止连接。

LMP_DETACH PDU。整个蓝牙连接建立过程涉及多个步骤和协议数据单元的交换,这些步骤确保了设备之间的可靠连接和通信。
实现蓝牙连接建立过程的完整代码是一个相当复杂的任务,因为蓝牙协议栈的实现涉及到底层硬件接口、复杂的协议处理以及状态机管理。然而,我可以提供一个简化的示例,展示如何通过伪代码或抽象的方式来模拟这个过程。请注意,以下代码仅用于演示目的,并不能直接在实际硬件上运行。
在实际项目中,通常会使用现有的蓝牙协议栈(如Bluedroid、BlueZ、BlueSDK等)来简化开发过程。这些协议栈提供了丰富的API和库函数,用于处理蓝牙连接的各种细节。
下面是一个简化的代码示例,用于演示蓝牙连接建立的基本步骤:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
// 伪造的蓝牙设备地址
#define TARGET_BD_ADDR "00:11:22:33:44:55"
// 伪造的连接句柄
#define CONNECTION_HANDLE 1
// 伪造的链路密钥(仅用于演示)
#define LINK_KEY "1234567890abcdef"
// 枚举连接状态
typedef enum {
DISCONNECTED,
CONNECTING,
CONNECTED,
AUTHENTICATING,
ENCRYPTING,
UNKNOWN
} ConnectionState;
// 蓝牙连接结构
typedef struct {
ConnectionState state;
char bd_addr[18]; // 蓝牙设备地址(字符串格式)
int connection_handle;
bool authenticated;
bool encrypted;
} BluetoothConnection;
// 伪造的HCI命令发送函数(实际项目中会使用蓝牙协议栈提供的API)
void hci_send_command(const char* command_name, const char* parameters) {
printf("Sending HCI command: %s with parameters: %s\n", command_name, parameters);
}
// 连接建立函数(简化版)
void establish_bluetooth_connection(BluetoothConnection* connection) {
// Step 1: 发送连接请求命令
hci_send_command("HCI_Create_Connection", TARGET_BD_ADDR);
connection->state = CONNECTING;
// 假设连接立即成功(实际项目中会有异步回调处理)
connection->state = CONNECTED;
connection->connection_handle = CONNECTION_HANDLE;
// Step 2: 交换功能(可选,这里省略)
// Step 3: 连接请求确认与角色协商(简化处理)
// 假设角色协商成功,继续下一步
// Step 4: 连接请求响应(简化处理,假设连接被接受)
// Step 5: AFH设置(可选,这里省略)
// Step 6: 请求认证
if (true) { // 假设需要认证
connection->state = AUTHENTICATING;
// Step 7: 认证过程(简化处理,假设配对成功并生成链路密钥)
// 在实际项目中,这里会涉及PIN码输入、链路密钥生成等复杂操作
connection->authenticated = true;
}
// Step 8: 启动加密(可选,这里假设需要加密)
if (connection->authenticated) {
// 假设加密成功
connection->encrypted = true;
}
// Step 9: 连接建立完成通知
if (connection->encrypted) {
printf("Bluetooth connection established with handle: %d\n", connection->connection_handle);
// 在这里可以执行其他连接建立后的操作,如发送数据等
} else {
printf("Bluetooth connection failed to establish\n");
}
// 连接状态设置为已知(实际项目中可能会有更多状态管理)
connection->state = CONNECTED;
}
// 断开连接函数(简化版)
void disconnect_bluetooth_connection(BluetoothConnection* connection) {
// 发送断开连接命令
hci_send_command("HCI_Disconnect", "");
connection->state = DISCONNECTED;
printf("Bluetooth connection disconnected\n");
}
int main() {
BluetoothConnection connection;
memset(&connection, 0, sizeof(BluetoothConnection));
strncpy(connection.bd_addr, TARGET_BD_ADDR, sizeof(connection.bd_addr) - 1);
// 建立蓝牙连接
establish_bluetooth_connection(&connection);
// ... 在这里可以进行数据传输等操作 ...
// 断开蓝牙连接
disconnect_bluetooth_connection(&connection);
return 0;
}注意事项:上述代码是高度简化的伪代码,用于演示蓝牙连接建立的基本步骤。在实际项目中,需要使用蓝牙协议栈提供的API来处理这些步骤。
ACL连接在蓝牙设备通信中扮演着重要角色。其使用场景主要涵盖了那些对数据传输实时性要求不高的应用,具体可以分为以下几个方面。
ACL链路主要用于传输分组数据,这些数据往往不需要严格的实时性保证。例如,在蓝牙设备之间传输文件、图片、视频或其他非实时性要求较高的数据内容时,ACL链路能够提供稳定且高效的数据传输服务。
虽然SCO(Synchronous Connection Oriented,同步面向连接链路)主要用于传输实时性要求很高的语音数据,但在某些情况下,ACL也可以作为音频传输的辅助链路。例如,在蓝牙音频传输中,ACL链路可以用于传输音频控制信令或音频数据的非实时部分,而SCO链路则专注于传输实时的音频数据流。
ACL链路支持点对点和点对多点连接,这使得它成为蓝牙设备间多点通信的理想选择。在蓝牙网络中,一个主设备可以与多个从设备建立ACL连接,从而实现数据在多个设备间的同步传输和共享。
由于ACL链路在蓝牙技术中得到了广泛的支持和应用,因此它具有良好的兼容性。无论是传统的蓝牙设备还是最新的低功耗蓝牙设备,都可以使用ACL链路进行数据传输。这使得ACL链路成为蓝牙设备间通信的一种通用和可靠的方式。
当使用ACL链路进行数据传输时,如果数据发生错乱或丢失,蓝牙协议栈会触发重传机制以确保数据的完整性。这种机制使得ACL链路在传输可靠性方面具有较高的表现。
ACL连接在蓝牙设备通信中主要用于数据传输、音频传输的辅助、多点连接以及提供可靠的传输服务等场景。其广泛的应用场景和良好的兼容性使得ACL链路成为蓝牙技术中不可或缺的一部分。
ACL连接在蓝牙设备通信中起着关键作用,但在使用过程中也需要注意一些事项,以确保通信的稳定性和可靠性。以下是一些关键的注意事项。
ACL连接在蓝牙设备通信中具有重要作用,但在使用过程中需要注意设备兼容性、连接稳定性、数据传输效率、安全性和隐私保护以及电源管理等方面的问题。通过遵循这些注意事项,可以确保ACL连接在蓝牙设备通信中的稳定性和可靠性。
ACL连接在蓝牙设备通信中扮演着至关重要的角色。它支持高效的数据传输,适用于音频流、文件共享及物联网设备间的信息交换。ACL连接无需严格的时序要求,使得设备间通信更加灵活。同时,它支持多点连接,增强了蓝牙网络的扩展性。在使用时,需注意设备兼容性、连接稳定性及数据传输效率,以确保通信的顺畅与安全。ACL连接的广泛应用,不仅提升了蓝牙技术的实用性,也为用户带来了更加便捷、高效的无线通信体验。