Android,如何将BLE设备配对设备(已绑定)

时间:2014-07-09 04:40:04

标签: android bluetooth-lowenergy gatt

GATT之前, createRfcommSocketToServiceRecord, createInsecureRfcommSocketToServiceRecord

方法可以制作配对设备,

但GATT对配对设备没有选择权, 仅使用BluetoothDevice.connectGatt(...)

如果它已经连接,我想制作配对设备。

THX。

1 个答案:

答案 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_AUTHENTICATIONGATT_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;
            }
        }
    }
};