2016-05-06 4 views
3

In meiner Anwendung habe ich die LESEN und WRITE auf spezifische BluetoothGattCharacteristic Objekten zu arbeiten. Die BluetoothGattCallbackonCharacteristicWrite und onCharacteristicRead werden ordnungsgemäß aufgerufen. Ich habe dann versucht, die NOTIFY Option so einzurichten, dass meine Android App benachrichtigt wird, wenn sich eine bestimmte Eigenschaft auf dem Gerät ändert. Ich habe dies über den folgenden Code ein:Making Lesen, Schreiben und NOTIFY arbeitet an Android BLE (Version 21 und höher)

// Local notifications 
mGatt.setCharacteristicNotification(statusTypeCharacteristic, notify); 

// Remote notifications 
BluetoothGattDescriptor desc = statusTypeCharacteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb")); 

Log.d("Descriptor", desc.toString()); 

boolean test; 
test = desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); // return value = true 
test = mGatt.writeDescriptor(desc); // return value = true 

Wenn die charakteristischen Veränderungen der Rückruf: onCharacteristicChanged

wie erwartet aufgerufen wird

jedoch jetzt alle LESEN und WRITE Operationen nicht arbeite mehr. Wenn ich die Zeilen kommentieren, die sich mit dem Deskriptor beschäftigen, funktionieren die READ und WRITE wieder.

Ein Teil ich bin sehr unklar ist um die UUID verwendet, um den Deskriptor zu bekommen. Ist es richtig? Sollte ich stattdessen alle Deskriptoren aus dem Merkmal scannen und die Benachrichtigung auf einem aktivieren? Woher weiß ich, welche ich einstellen muss, wenn mehrere zurückkommen?

+0

Sache ist, sind alle ble Operationen wirklich, asynchron in der Natur, müssen Sie, dass der Geist in halten. – t0mm13b

Antwort

1

Ok, also habe ich das Problem herausgefunden. Am Anfang meiner Anwendung, ich konfiguriere (d. H. Schreibe) zu viele Deskriptoren. 2 Ausgaben mit sich: 1- Ein Deskriptor nur eine zu einem Zeitpunkt geschrieben werden kann 2- keine Lese-/Schreiboperationen passieren kann, wenn ein Deskriptor um das Update zu

geschrieben wird, ist es, eine Warteschlange von Schreib-Beschreiber zu erzeugen Operationen ausführen und den nächsten Deskriptor schreiben im onDescriptorWrite-Callback ausführen.

private void writeGattDescriptor(BluetoothGattDescriptor d) { 
    //put the descriptor into the write queue 
    descriptorWriteQueue.add(d); 
    //if there is only 1 item in the queue, then write it. If more than 1, we handle asynchronously in the 
    // callback 
    if(descriptorWriteQueue.size() == 1) { 
     mGatt.writeDescriptor(d); 
    } 
} 

Und dann in den Rückruf:

@Override 
    public void onDescriptorWrite (BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) { 
     // Called when the descriptor is updated for notification 
     Log.d("onDescriptorWrite", descriptor.getUuid().toString()); 

     // pop the item that we just finishing writing 
     descriptorWriteQueue.remove(); 

     // if there is more to write, do it! 
     if(descriptorWriteQueue.size() > 0) { 
      mGatt.writeDescriptor(descriptorWriteQueue.element()); 
     } 

     // Inform the framework that the scope has connected, configured and ready to process commands 
     if(descriptorWriteQueue.size() == 0) { 
      // Do something else, such as reads and writes 
     } 
    } 
Verwandte Themen