GATTの前に、createRfcommSocketToServiceRecord、createInsecureRfcommSocketToServiceRecord
メソッドはペアのデバイスを作ることができます、
ただし、GATTにはペアリングされたデバイスに関するオプションはなく、BluetoothDevice.connectGatt(...)のみを使用してください。
すでに接続されている場合は、ペアリングされたデバイスを作成したいと思います。
どうも。
私の知る限り、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;
}
}
}
};
_