5

Ich möchte die Daten von einem bestimmten Merkmal meines BLE-Remote-Gerät auf meinem Android-Tablet Nexus 7.Kann Merkmal nicht lesen. Android BLE

Das Problem ist, dass ich die Daten durch Aktivieren der Benachrichtigung über dieses Merkmal sogar erhalten kann ohne anzurufen readCharacteristic. Aber ich kann das Merkmal nicht erfolgreich lesen, indem ich anrufe, ohne die Benachrichtigung zu aktivieren.

mBluetoothGatt.readCharacteristic(characteristic) gibt false zurück. Somit wurde die Funktion onCharacteristicRead noch nie ausgelöst. Ich überprüfte auch den Immobilienwert BluetoothGattCharacteristic.PROPERTY_READ, es ist 30.

Hat jemand einige Ideen darüber, was hier vor sich geht? Ich muss das Merkmal wirklich separat lesen. Denn wenn ich nur Analysedaten basierend auf Benachrichtigung verwende, kann ich nicht herausfinden, wo die Daten beginnen. Dies liegt daran, dass mein Gerät jedes Mal 12 Bytes sendet. Und es wird kontinuierlich das Byte-Array senden. Die Benachrichtigung würde mir jedoch die Daten ein Byte pro Zeit bringen. Ich weiß also nicht, welches Byte das Anfangsbyte des Bytearrays ist.

Ich verwende gerade den von Android bereitgestellten Beispielcode. Hier

ist das Snippet:

public void readCharacteristic(BluetoothGattCharacteristic characteristic) { 
    if (mBluetoothAdapter == null || mBluetoothGatt == null) { 
     Log.w(TAG, "BluetoothAdapter not initialized"); 
     return; 
    } 

    boolean status = mBluetoothGatt.readCharacteristic(characteristic); 
    System.out.println("Initialize reading process status:" + status); 

} 



public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, 
              boolean enabled) { 
    if (mBluetoothAdapter == null || mBluetoothGatt == null) { 
     Log.w(TAG, "BluetoothAdapter not initialized"); 
     return; 
    } 
    mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); 

    // This is specific to Heart Rate Measurement. 
    if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { 
     BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
       UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); 
     descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); 

     mBluetoothGatt.writeDescriptor(descriptor); 
    } 
} 

Der Code in Rückruf:

@Override 
    public void onCharacteristicRead(BluetoothGatt gatt, 
            BluetoothGattCharacteristic characteristic, 
            int status) { 

     System.out.println("In onCharacteristicRead!!!!!!!"); 
     if (status == BluetoothGatt.GATT_SUCCESS) { 

      broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic); 
      System.out.println("Received Data Success!!!!!!"); 
     } 
    } 

ich durch das Dokument der Leseeigenschaft gelesen haben, aber nichts hilft. Kann mir jemand helfen? Vielen Dank!

Antwort

2

Sie müssen erst Benachrichtigungen für das Merkmal aktivieren und dann versuchen, seinen Wert zu lesen und daran denken, das geeignete Format des Byte-Arrays zu erhalten, das die characteristic.getValue() -Methode zurückgibt. Grüße

+1

Hallo, danke für deine Antwort. Ich habe versucht, die Benachrichtigung zuerst zu aktivieren, und dann das Merkmal zu lesen. Es stellt sich heraus, dass nur "onCharacteristicChanged" aufgerufen wird, wenn Daten auf dem Gerät bereitstehen, die Funktion "onCharacteristicRead" bleibt jedoch weiterhin unbenannt. Hast du eine Ahnung davon? Vielen Dank. – Magic

+0

Sie können auch versuchen, die charakteristischen Berechtigungen zu erhalten, um sicherzustellen, wenn Ihr Merkmal lesbar ist, wenn das nicht funktioniert, vielleicht ist es etwas anderes, oder versuchen, den Wert zwischen try/catch-Block zu lesen, um zu sehen, ob eine Ausnahme auslöst. hoffe zu helfen –

+0

Hast du diese setNotification als Descriptor geschrieben? –

Verwandte Themen