Soweit ich weiß, ein Pairing in BLE gibt es zwei Möglichkeiten zu initiieren. Sie müssen nicht mit dem Remote-BLE-Gerät verbunden sein, um den Pairing-Vorgang zu starten.
2) Wenn Sie versuchen, eine Gatt Operation zu tun, lassen Sie sich
mBluetoothGatt.readCharacteristic(characteristic)
das Verfahren zum Beispiel nehmen Wenn das Remote-BLE-Gerät verbunden werden muss dann jede Kommunikation zu tun, wenn der Rückruf
onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
bekommt seinen status
Parameterwert wird gleich genannt entweder GATT_INSUFFICIENT_AUTHENTICATION
oder GATT_INSUFFICIENT_ENCRYPTION
, und nicht gleich GATT_SUCCESS
. Wenn dies geschieht, wird der Pairing-Vorgang automatisch gestartet.
Hier ist ein Beispiel, um herauszufinden, wenn es nicht einmal der onCharacteristicRead
Rückruf Erwähnen
@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
}
}
Andere Leute aufgerufen wird, dass dieser Vorgang automatisch den Kopplungsvorgang beginnt: Android Bluetooth Low Energy Pairing
Und das ist, wie die Empfänger kann
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;
}
}
}
};
implementiert werden Diese Antwort war eine große Hilfe für mich! Ich hatte Probleme mit Android 6.0 und habe Pairing-Benachrichtigungen, die der Benutzer nicht einmal sehen würde (ältere Android-Dialoge, die ich für alle Fälle wollte). Eine Sache, die ich anders gemacht habe als du, war createBond() von Anfang an aufzurufen (also schon bevor du dich mit dem Gerät verbunden hast), wenn die device.getBondState() == BluetoothDevice.BOND_NONE. Dies geschah, weil ich beim Lesen des Merkmals nicht "GATT_INSUFFICIENT_AUTHENTICATION" erhalten habe; das OS würde es halten, während es eine Benachrichtigung zum Koppeln des Geräts gesendet hat. – cclogg
Was passiert, wenn my ** onCharacteristicRead() ** niemals aufgerufen wird? –
@IgorGanapolsky Wenn Sie sich zu 100% sicher sind, dass Sie diese Methode mBluetoothGatt.readCharacteristic (Merkmal) aufrufen, wird der Callback aufgerufen, es sei denn, es gibt ein Problem mit dem Remote-Gerät, das Code betrifft oder die Verbindung verloren gegangen ist (falls dies der Fall ist) der Fall, Sie sollten einen anderen Rückruf bekommen, aber ich erinnere mich nicht an den Namen im Moment). Wenn jemand anderes weiß, lass es uns wissen. – Kiki