2017-11-20 1 views
0

Ich habe BLE Central in meiner App implementiert. Schritte:BLE onServicesDiscovered() nicht zurückgegebenen Eigenschaften Array

  1. Get BluetoothManager

    mBluetoothManager = (BluetoothManager) mContext.getSystemService (Context.BLUETOOTH_SERVICE);

    mBluetoothAdapter = mBluetoothManager.getAdapter();

  2. Scan für Geräte

  3. Connect-Gerät

    mGatt = bluetoothDevice.connectGatt (dies, false, gattCallback);

  4. Handle Rückruf und starten Service Discovery

Sobald das Gerät angeschlossen ist, ich einen Anruf mache Dienstleistungen zu entdecken.

gatt.discoverServices(); 

Sobald die Dienstleistungen, die es ich fangen in

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { 
    @Override 
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { 
     Log.i("onConnectionStateChange", "Status: " + status); 
     switch (newState) { 
      case BluetoothProfile.STATE_CONNECTED: 
       Log.i("gattCallback", "STATE_CONNECTED"); 
       gatt.discoverServices(); 
       break; 

      case BluetoothProfile.STATE_DISCONNECTED: 
       mGatt = null; 
       mBluetoothSingleTonClass.saveGatt(mGatt); 
       deviceDisconnected(); 
       Log.e("gattCallback", "STATE_DISCONNECTED"); 
       break; 

      case BluetoothProfile.STATE_CONNECTING : 
       Log.e("gattCallback", "STATE_CONNECTING"); 
       break; 

      default: 
       Log.e("gattCallback", "STATE_OTHER"); 
     } 
    } 

    @Override 
    public void onServicesDiscovered(BluetoothGatt gatt, int status) { 

     List<BluetoothGattService> services = new ArrayList<>(); 
     services.addAll(gatt.getServices()); 

     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(0).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(1).getUuid()); 
     Log.d("onServicesDiscovered", "uuid::" + gatt.getServices().get(2).getUuid()); 

     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(2).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(0).getCharacteristics().size()); 
     Log.d("onServicesDiscovered", "chars::" + gatt.getServices().get(1).getCharacteristics().size()); 


    } 
}; 

Das Problem ist gatt entdeckt gibt mir alle Dienste das Gerät hat, aber es ist in wenigen mobilen leer Eigenschaften Array geben. Beispiel: gatt.getServices().get(0).getCharacteristics().size() Dies war in Nexus gut, aber nach wenigen Tagen gibt es mir leere Array, d. H. Größe ist Null. Mache ich etwas falsch? Ist das das Problem mit dem Handy? Alle Referenzlinks wären hilfreich.

+0

Code anhängen –

Antwort

0

Es kann eine leere (oder zu kurze) Liste geben, wenn das Gerät während des Erkennungsverfahrens getrennt wird. Sie sollten den Statuscode im Callback überprüfen und nur davon ausgehen, dass die Services gültig sind, wenn sie 0 sind (SUCCESS).

+0

Ja, ich habe das auch überprüft. if (status == BluetoothGatt.GATT_SUCCESS) { Log.w (TAG, "onServicesDiscovered success:" + status); } else { Log.w (TAG, "onServicesDiscovered Fehler:" + Status); } Es gibt 0 –

+0

In diesem Fall könnte der Bluetooth-Stack des Telefons fehlerhaft sein. Sie sollten das HCI-Snoop-Protokoll überprüfen, um zu sehen, ob die Dienste korrekt gemeldet werden, aber der Stapel meldet später die falschen Dienste. – Emil

+0

Ich bekomme die richtigen Dienste. Problem ist mit den charakteristischen IDs. Es gibt 0. Es braucht mehr Zeit, um mit Peripheriegeräten zu verbinden. Gibt es dafür eine Lösung? –

Verwandte Themen