web-dev-qa-db-ja.com

Android、BLEデバイスをペアリングされたデバイス(ボンディング済み)にするにはどうすればよいですか?

GATTの前に、createRfcommSocketToServiceRecord、createInsecureRfcommSocketToServiceRecord

メソッドはペアのデバイスを作ることができます、

ただし、GATTにはペアリングされたデバイスに関するオプションはなく、BluetoothDevice.connectGatt(...)のみを使用してください。

すでに接続されている場合は、ペアリングされたデバイスを作成したいと思います。

どうも。

8
user3563211

私の知る限り、BLEでペアリング手順を開始するには、次の2つの方法があります。

1)API 19以降では、 mBluetoothDevice.createBond() を呼び出すことでペアリングを開始できます。ペアリングプロセスを開始するために、リモートBLEデバイスに接続する必要はありません。

2)ガット操作をしようとするとき、例えば方法を考えてみましょう

_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ペアリング

そしてこれがレシーバーの実装方法です

_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;
            }
        }
    }
};
_
22
Kiki