Android蓝牙协议-蓝牙配对与连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android蓝牙协议-蓝牙配对与连接相关的知识,希望对你有一定的参考价值。

参考技术A

蓝牙设备在连接前,会先检查设备是否已经配对过,如果没有则先配对,配对完成后,再开始连接。

蓝牙连接开始于设备列表 DeviceListPreferenceFragment的onPreferenceTreeClick方法。
DeviceListPreferenceFragment是蓝牙设备列表,点击其中一个蓝牙设备,开始蓝牙的连接过程。

调用onDevicePreferenceClick方法,接着调用BluetoothDevicePreference的onClicked方法,开始连接,以及连接前的状态检测。

获取mCachedDevice的绑定状态,

pair方法会调用CachedBluetoothDevice.startPairing,启动配对

createBond调用BluetoothDevice.createBond方法,BluetoothDevice.createBond接着调用IBluetooth.createBond方法,下面会调用蓝牙远程服务。
和蓝牙扫描一样,实现IBluetooth接口的类是AdapterServiceBinder,

AdapterServiceBinder实现IBluetooth.Stub接口,并且是AdapterService的私有内部类, AdapterServiceBinder接受事件,都会转交AdapterService处理 ,所以IBluetooth.createBond方法会调用AdapterService.createBond方法。

createBond方法会检查一下远程设备属性信息,再次取消蓝牙扫描任务,将配对任务转交mBondStateMachine,由状态机处理该信息。
BondStateMachine状态机的初始状态是StableState,所以BondStateMachine.CREATE_BOND由StableState处理,StableState在processMessage中调用BondStateMachine.createBond方法

createBondNative方法实现com_android_bluetooth_btservice_AdapterService.cpp中

Android蓝牙开发—— 经典蓝牙连接方法

一、官方API

Android官方API给出的经典蓝牙连接方法有2个

  • createRfcommSocketToServiceRecord
    该方法建立的是一种安全的连接。意思就是,与蓝牙设备建立连接时,如果与蓝牙设备没有建立过配对关系,那么连接时会先去建立配对关系,然后再执行连接;如果与蓝牙设备已建立了配对关系,那么就会直接执行连接。
    调用的结果是,连接成功的同时也配对成功了。
//建立安全的蓝牙连接
BluetoothSocket BluetoothSocket 
= bluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(uuid));
  • createInsecureRfcommSocketToServiceRecord
    该方法建立的是一种非安全的连接。意思就是,与蓝牙设备建立连接时,如果与蓝牙设备没有建立过配对关系,就会跳过配对过程,直接执行连接。
    调用的结果是,连接成功了,但是没有建立配对关系。
//建立不安全的蓝牙连接
BluetoothSocket BluetoothSocket 
= bluetoothDevice.createInsecureRfcommSocketToServiceRecord(UUID.fromString(uuid));
二、通过反射获取的串口号连接的方法

反射方法获取的通过串口号连接方法有2个:

BluetoothSocket BluetoothSocket 
= (BluetoothSocket)mmDevice.getClass().getMethod("createRfcommSocket",new Class[] int.class).invoke(bluetoothDevice,channel);
BluetoothSocket BluetoothSocket 
= (BluetoothSocket) mmDevice.getClass().getMethod("createInsecureRfcommSocket",new Class[] int.class).invoke(bluetoothDevice,channel);

默认串口号为1,如果实际过程指定了串口号连接,需要使用指定的串口号连接。

以上是关于Android蓝牙协议-蓝牙配对与连接的主要内容,如果未能解决你的问题,请参考以下文章

Android和双模蓝牙设备:与BR / EDR(经典)配对时未找到自定义BLE服务

Android蓝牙开发——经典蓝牙:配对与解除配对 & 实现配对或连接时不弹出配对框

Android蓝牙Bluejacking可能吗?

Android开发之蓝牙(Bluetooth)操作--扫描已经配对的蓝牙设备

Android蓝牙开发—— 经典蓝牙连接方法

Android -- 蓝牙蓝牙配对和蓝牙连接