2016-12-27 5 views
0

Ich analysiere eine Probe von Android, die einen Bluetooth Low Energy Usage auf Android erklärt. Ich habe den folgenden Code gefunden, der eine Benachrichtigung setzt, aber ich kann nicht herausfinden, was hier passiert, wenn ich einen Eigenschaften-Integer und Bedingungen innerhalb von ifs verwende. Könnte es jemand ein wenig erklären?Lesen von Bluetooth Low Energy-Eigenschaften (Lesen, Benachrichtigungen) - wie es funktioniert?

Wie auch immer, vielleicht haben Sie eine bessere Quelle, die ein ble Konzept auf Android erklären kann - was und wie funktioniert hier? Die offiziellen Android-Tutorial sind wirklich schlecht, und offizielle Seite Bluetooth gibt so gut wie nichts ...

@Override 
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, 
          int childPosition, long id) { 
    if (mGattCharacteristics != null) { 
     final BluetoothGattCharacteristic characteristic = 
       mGattCharacteristics.get(groupPosition).get(childPosition); 
     final int charaProp = characteristic.getProperties(); 
     if ((charaProp | BluetoothGattCharacteristic.PROPERTY_READ) > 0) { 
      // If there is an active notification on a characteristic, clear 
      // it first so it doesn't update the data field on the user interface. 
      if (mNotifyCharacteristic != null) { 
       mBluetoothLeService.setCharacteristicNotification(
         mNotifyCharacteristic, false); 
       mNotifyCharacteristic = null; 
      } 
      mBluetoothLeService.readCharacteristic(characteristic); 
     } 
     if ((charaProp | BluetoothGattCharacteristic.PROPERTY_NOTIFY) > 0) { 
      mNotifyCharacteristic = characteristic; 
      mBluetoothLeService.setCharacteristicNotification(
        characteristic, true); 
     } 
     return true; 
    } 
    return false; 
} 
+0

Dieses Beispiel ist wirklich in allen möglichen Arten gebrochen. Es gibt wahrscheinlich Tonnen von anderen Beispielen, wenn Sie nur im Internet suchen. – Emil

+0

@Emil, Ja, es gibt WAHRSCHEINLICH viele andere Beispiele, aber ich habe versucht, einige zu finden - und sie sind auf andere Weise kompliziert. Viele von ihnen sind anders geschrieben. Keines der Beispiele/Tutorials, die ich gefunden habe, erklärt einige Grundlagen von BLE wie das Lesen von einigen Bits und so weiter, oder einfach nur dumm, eine grundlegende UUID aus der 16-Bit-Erstellung zu erklären. – Krystian

Antwort

0

Sie könnten die Bluetooth-Spezifikation versuchen Lesung (https://www.bluetooth.com/specifications/adopted-specifications, Core Version 5.0), Band 3 Teil beachten G. einfach, dass Android abstrahiert die Attribut-Handles.

Die meisten Leute schreiben jedoch eine App, die für eine bestimmte Hardware entwickelt wurde, d. H. Die gatt db wird als bekannt vorausgesetzt.

Um Objekte zu erhalten, die die Dienste, Merkmale und Deskriptoren darstellen, rufen Sie gatt.discoverServices() auf. Das Ergebnis wird asynchron mit dem Rückruf onServicesDiscovered() zurückgegeben. Dies sollte jedes Mal durchgeführt werden, wenn ein Gerät verbunden wird (im onConnectionStateChange-Callback, wenn newState GATT_CONNECTED ist).

Um in ein Merkmal zu schreiben, setzen Sie zunächst den Wert für das BluetoothGattCharacteristic-Objekt mit der setValue-Methode und anschließend gatt.writeCharacteristic (characteristic). Wenn die Operation abgeschlossen ist, wird onCharacteristicWrite aufgerufen.

Eine Leseoperation funktioniert in ähnlicher Weise; Rufen Sie gatt.readCharacteristic (characteristic) auf und das Ergebnis ist bereit, wenn onCharacteristicRead aufgerufen wird. Verwenden Sie getValue() für das Merkmalsobjekt, um den Wert zu erhalten.

Damit Benachrichtigungen funktionieren, müssen Sie zunächst BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE (0x0001) in den Konfigurationsdeskriptor für die Client-Eigenschaften schreiben, damit das Peripheriegerät Benachrichtigungen sendet. Sie müssen dem Android-Bluetooth-Stack auch mitteilen, dass die Benachrichtigungen an Ihre App weitergeleitet werden, indem Sie setCharacteristicNotification aufrufen.

Beachten Sie, dass Sie jeweils nur eine ausstehende Operation ausführen können (Lesen/Schreiben), was bedeutet, dass Sie auf den Rückruf warten müssen, bevor Sie eine neue Anfrage stellen.

Wenn Sie die Hardware kennen, mit der Sie arbeiten, müssen Sie normalerweise die charakteristischen Eigenschaften (characteristic.getProperties()) nicht überprüfen. Die Bitmaske ist in der Spezifikation Bluetooth Core V 5.0, Band 3, Teil G, Abschnitt 3.3.1.1 beschrieben und beschreibt, welche Funktionen für jedes Merkmal aktiviert sind (z. B. Lesen, Schreiben, Benachrichtigungen).

Die Konvertierung zwischen 16-Bit- und 128-Bit-UUIDs wird in der Bluetooth Core V 5.0-Spezifikation, Band 3, Teil B, Abschnitt 2.5.1 beschrieben. Beachten Sie, dass die Clientbibliotheken von Android nur 128-Bit-UUIDs verwenden.

Verwandte Themen