2014-07-09 8 views
7

Vor GATT, createRfcommSocketToServiceRecord, createInsecureRfcommSocketToServiceRecordAndroid, Wie kann ich BLE Gerät gekoppeltes Gerät machen (gebunden)

Methoden Gerät machen gepaart können,

aber GATT hat keine andere Wahl, über gekoppeltes Gerät, nur Verwenden Sie BluetoothDevice.connectGatt (...)

Ich möchte ein gekoppeltes Gerät erstellen, wenn es bereits verbunden ist.

thx.

1) Von API 19 und können Sie die Kopplung starten, indem Sie die mBluetoothDevice.createBond() Aufruf:

Antwort

18

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; 
      } 
     } 
    } 
}; 
+1

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

+0

Was passiert, wenn my ** onCharacteristicRead() ** niemals aufgerufen wird? –

+1

@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