GATT之前, createRfcommSocketToServiceRecord, createInsecureRfcommSocketToServiceRecord
方法可以制作配对设备,
但GATT对配对设备没有选择权, 仅使用BluetoothDevice.connectGatt(...)
如果它已经连接,我想制作配对设备。
THX。
答案 0 :(得分:21)
据我所知,在BLE中启动配对程序有两种方法:
1)从API 19开始,您可以通过调用mBluetoothDevice.createBond()
开始配对。您无需与远程BLE设备连接即可开始配对过程。
2)当你尝试进行Gatt操作时,让我们采取例如方法
mBluetoothGatt.readCharacteristic(characteristic)
如果远程BLE设备需要绑定以进行任何通信,那么当回调
时 onCharacteristicRead(
BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
被称为其status
参数值将等于GATT_INSUFFICIENT_AUTHENTICATION
或GATT_INSUFFICIENT_ENCRYPTION
,且不等于GATT_SUCCESS
。如果发生这种情况,配对程序将自动开始。
这是一个示例,可以在调用onCharacteristicRead
回调后找出它失败的时间
@Override
public void onCharacteristicRead(
BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
{
if(BluetoothGatt.GATT_SUCCESS == status)
{
// characteristic was read successful
}
else if(BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION == status ||
BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION == status)
{
/*
* failed to complete the operation because of encryption issues,
* this means we need to bond with the device
*/
/*
* registering Bluetooth BroadcastReceiver to be notified
* for any bonding messages
*/
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
mActivity.registerReceiver(mReceiver, filter);
}
else
{
// operation failed for some other reason
}
}
其他人提到此操作会自动启动配对过程: Android Bluetooth Low Energy Pairing
这就是接收器的实现方式
private final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
final String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED))
{
final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
switch(state){
case BluetoothDevice.BOND_BONDING:
// Bonding...
break;
case BluetoothDevice.BOND_BONDED:
// Bonded...
mActivity.unregisterReceiver(mReceiver);
break;
case BluetoothDevice.BOND_NONE:
// Not bonded...
break;
}
}
}
};