1

Ich versuche, den Wert zu lesen, der in einem BluetoothGattCharacteristic gespeichert wird. Hier finden Sie meine BluetoothGattCallback Code, wo die meisten der Aktion stattfindet:Das Lesen von einem BluetoothGattCharacteristic schlägt fehl

private final BluetoothGattCallback mGattCallback = 
      new BluetoothGattCallback() { 
       @Override 
       public void onConnectionStateChange(BluetoothGatt gatt, int status, 
                int newState) { 
        if (newState == BluetoothProfile.STATE_CONNECTED) { 
         Log.i(TAG, "Connected to GATT server."); 
         Log.i(TAG, "Getting services...."); 
         gatt.discoverServices(); 
        } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { 
         Log.i(TAG, "Disconnected from GATT server."); 
        } 
       } 

       @Override 
       public void onServicesDiscovered(BluetoothGatt gatt, int status) { 
        if (status == BluetoothGatt.GATT_SUCCESS) { 
         BluetoothGattService serv = gatt.getService(Constants.MY_UUID); 
         if (serv != null) { 
          BluetoothGattCharacteristic characteristic = serv.getCharacteristic(Constants.ANOTHER_UUID); 
          boolean res = gatt.readCharacteristic(characteristic); 
          if (res) { 
           Log.d(TAG, "res was true"); 
          } else { 
           Log.d(TAG, "res was false"); 
          } 
         } 
        } else { 
         Log.w(TAG, "onServicesDiscovered received: " + status); 
        } 
       } 

       @Override 
       public void onCharacteristicRead(BluetoothGatt gatt, 
               BluetoothGattCharacteristic characteristic, 
               int status) { 
        if (status == BluetoothGatt.GATT_SUCCESS) { 
         Log.d(TAG, "Succesfully read characteristic: " + characteristic.getValue().toString()); 
        } else { 
         Log.d(TAG, "Characteristic read not successful"); 
        } 
       } 
      }; 

So von der Eigenschaft zu lesen, ich bin versucht, die gatt.readCharacteristic() Methode zu verwenden, die eine Charakteristik nimmt und gibt einen booleschen eine erfolgreiche anzeigt Operation oder nicht. Hier gibt diese Methode false (Drucken "res war falsch") zurück und zeigt an, dass es fehlgeschlagen ist.

Es wird keine Fehlermeldung gedruckt. Was ist der richtige Weg, um ein Merkmal zu lesen? Warum würde diese Methode false zurückgeben?

EDIT: Wie Inferno vorgeschlagen, ging voran und heruntergeladen die benötigten Quellen und legen Sie anschließend einen Haltepunkt in der BluetoothGattreadCharacteristic() Methode:

Hier ist die readCharacteristic() Methode in android-23 .. \ BluetoothGatt

public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) { 
     if ((characteristic.getProperties() & 
       BluetoothGattCharacteristic.PROPERTY_READ) == 0) return false; 

(characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ) 0 zurückkehrt, so wird false sofort zurückgegeben wird. Nun gibt der Debugger characteristic.getProperties() einen Wert von 8 zurück, während BluetoothGattCharacteristic.PROPERTY_READ einen statischen int-Wert von 0x02 hat.

Wie ich verstehe, 0x08 & 0x02 == 0. Da die PROPERTY_READ ist ein hardcoded Wert, nehme ich an, dass etwas mit dem Wert falsch ist, der von characteristic.getProperties() zurückgegeben wird. Was könnte hier schiefgehen?

+0

Tritt der Callback 'onCharacteristicRead()' auch dann auf, wenn 'gatt.readCharacteristic() '' 'false' zurückgibt? –

+0

Nein, es wird nicht aufgerufen. – Orbit

+0

Ich werde meine Antwort aktualisieren, geben Sie mir eine zweite –

Antwort

2

Was ist der richtige Weg, um ein Merkmal zu lesen?

Zunächst einmal rufen Sie gatt.readCharacteristic(characteristic) aus dem Inneren des onServicesDiscovered() Rückruf, was in Ordnung ist. Ich sehe keine schwerwiegenden Fehler in Ihrem Code.

Was Sie in onConnectionStateChange() hinzufügen könnte, ist eine zusätzliche Prüfung vor Sie newState == BluetoothProfile.STATE_CONNECTED überprüfen:

if (status == BluetoothGatt.GATT_SUCCESS) { ... 

Warum diese Methode false zurückkommen würde?

überprüfte ich die Android-Quelle BluetoothGatthere und es stellt sich heraus, ist der Rückgabewert von false in vielen verschiedenen Fällen zurückgegeben, wie Sie den Code unten sehen können:

public boolean readCharacteristic(BluetoothGattCharacteristic characteristic) { 
    if ((characteristic.getProperties() & 
      BluetoothGattCharacteristic.PROPERTY_READ) == 0) return false; 

    if (VDBG) Log.d(TAG, "readCharacteristic() - uuid: " + characteristic.getUuid()); 
    if (mService == null || mClientIf == 0) return false; 

    BluetoothGattService service = characteristic.getService(); 
    if (service == null) return false; 

    BluetoothDevice device = service.getDevice(); 
    if (device == null) return false; 

    synchronized(mDeviceBusy) { 
     if (mDeviceBusy) return false; 
     mDeviceBusy = true; 
    } 

    try { 
     mService.readCharacteristic(mClientIf, device.getAddress(), 
      characteristic.getInstanceId(), AUTHENTICATION_NONE); 
    } catch (RemoteException e) { 
     Log.e(TAG,"",e); 
     mDeviceBusy = false; 
     return false; 
    } 

    return true; 
} 

Also, was ich empfehlen Sie zu tun ist, starten Sie den Debugger in Android Studio und setzen Sie einen Haltepunkt innerhalb der readCharacteristic() Methode (in BluetoothGatt.java) und vorsichtig Schritt durch den Code zu sehen, wo false wird zurückgegeben. Auf diese Weise werden Sie hoffentlich in der Lage sein, das Problem zu lokalisieren. Abgesehen davon würde irgendetwas anderes ein wildes Raten sein.

Natürlich müssen Sie die Quellen heruntergeladen haben, um BluetoothGatt.java anzeigen zu können. Aber Android Studio wird Ihnen eine kleine gelbe Leiste oben im Editor geben, die Sie fragt, ob Sie herunterladen und installieren möchten. Tun Sie es einfach und starten Sie Android Studio neu, nachdem der Download abgeschlossen ist. Dann sollten Sie in der Lage sein, einen Haltepunkt in BluetoothGatt.java festzulegen.

UPDATE:

Wie ich verstehe, 0x08 & 0x02 == 0. Da die PROPERTY_READ ist ein fest codierter Wert, nehme ich an, etwas stimmt nicht mit dem Wert zurückgegeben von characteristic.getProperties(). Was könnte hier schiefgehen?

Nach Bluetooth-Spezifikation Version 4.2 [Vol 3, Teil G] Seite 533, der Wert von 0x8, die durch characteristic.getProperties() Mittel zurückgeführt wird, dass Ihr Merkmal Schreib nur Berechtigungen hat. Keine Überraschung, dass alle Leseversuche fehlschlagen. Mit anderen Worten: Mit Ihrem Bluetooth-Gerät können Sie dieses bestimmte Merkmal nicht lesen.

Zitat aus der Beschreibung:

Die charakteristischen Eigenschaften Bit-Feld bestimmt, wie der Charakteristik Wert kann verwendet werden, oder, wie die charakteristischen Deskriptoren (siehe Abschnitt 3.3.3) können zugegriffen werden.

+0

Ich öffnete die 'readCharacteristic()' Methode und lud die Quelle, aber aus irgendeinem seltsamen Grund scheint es nicht die neu heruntergeladene Quelle erkannt haben, so dass ich nicht bin einen richtigen Haltepunkt setzen. – Orbit

+0

Ja, ich hatte das gleiche Problem mit Android Studio. Ich musste das Programm schließen und neu öffnen und dann zeigte es die vollständigen Quellen anstelle der Methoden-Stubs. –

+0

Ja, ich habe es schon ein paar Mal neu gestartet, werde ein paar andere Dinge ausprobieren. – Orbit

0

Ich habe versucht, Daten von einem Kuhpinsel Scratcher zu lesen, der BLE-Chip hatte. Es war unter einem Lese-Merkmal auf einem BLE-Modul. Die Daten kommen würden wieder in hex heißt 0x00 für BRUSH_OFF & 0x01 für BRUSH_ON

ich in diesen Daten in meinem Android-App zu lesen versuche, und es kam immer wieder als leeres kommen.

Problem ist 0x00 = NUll in Ascii und 0x01 = SOH ascii kann nicht auf dem Bildschirm angezeigt werden.

0x30 = 0 in ascii 0x31 = 1 in ascii

Vielleicht haben Sie Escape-Zeichen in Hex zurückkommen und sie können nicht gelesen werden.

Ich verbrachte Monate damit herauszufinden, warum ich die Werte nicht lesen konnte. Hoffe, das könnte Ihnen helfen.

Verwandte Themen