前言
本文主要结合源码研究蓝牙的配对过程
一、蓝牙配对的原理
1.蓝牙工作模式
蓝牙有两种主要的工作模式:
- 主设备模式(Master):控制连接的设备,通常是手机或电脑。
- 从设备模式(Slave):被连接的设备,如耳机或蓝牙音箱。
2. 设备扫描
当主设备需要发现附近的蓝牙设备时,它会进入扫描模式。这个过程通常包括以下步骤:
- 发送探测请求(Inquiry):主设备发送探测请求,询问附近的蓝牙设备是否在线。
- 响应(Response):任何接收到探测请求的从设备会发送响应,返回其设备名称和地址。
3. 广播机制
蓝牙设备可以在不同的时间段内广播自己的可见性信息。具体原理如下:
- 广播信号:从设备在其周围的范围内定期发送广播信号,包含设备信息,如设备名称和地址。这些广播信号是短时间内的,并且可以被附近的主设备接收。
- 周期性广播:从设备可以配置为在特定的时间间隔内发送广播信号,以提高被发现的概率。
4. 接收与处理
主设备接收到从设备的广播后,会执行以下操作:
- 解析设备信息:从广播信号中提取设备名称、地址等信息。
- 更新设备列表:将新发现的设备信息添加到列表中,以供用户选择。
5. 配对和连接
发现设备后,主设备可以选择与某个设备配对。配对过程通常涉及身份验证(如 PIN 码确认),并建立连接以进行数据传输。
二、配对步骤
以下是一个配对流程的简要代码示例:
// 初始化蓝牙适配器
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 开始发现设备
bluetoothAdapter.startDiscovery();
// 注册接收广播以接收配对请求和配对状态变化
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// 发现了一个设备
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 发起配对
device.createBond();
} else if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
// 处理配对请求
} else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
// 检查配对状态
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.BOND_NONE);
if (bondState == BluetoothDevice.BOND_BONDED) {
// 配对成功
} else if (bondState == BluetoothDevice.BOND_NONE) {
// 配对失败
}
}
}
};
// 注册广播
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
context.registerReceiver(receiver, filter);