Warum setCharacteristicNotification() nicht eigentlich "Benachrichtigungen" aktiviert?
Den BluetoothLeGatt
Android BLE-Beispiel enthält den folgenden code:
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);
}
}
Meine Frage ist hauptsächlich, warum wird der code markiert spezifisch die Herzfrequenz-Messung? Wie es scheint, haben Sie eine Client-Eigenschaft Config Descriptor (CCCD) charakteristisch ist die standard-Weg, um die Kontrolle Merkmal Benachrichtigung, also warum nicht setCharacteristicNotification()
kümmern zu schreiben? Und da es das nicht tut, was tut setCharacteristicNotification()
eigentlich tun?
Ich bin ziemlich neu auf BLE und es gibt keine Erklärungen, es auf dem internet, die nicht davon ausgehen, dass Sie schon alles verstehen! Also nicht davon ausgehen, ich weiß, was ein CCCD oder was auch immer ist! Es war schon schwierig genug, herauszufinden, was CCCD selbst steht für!
Edit: Siehe auch diese Antwort, die unterstützt mein Verständnis von CCCDs (und macht mich weiter zu Fragen, warum Sie haben zu schreiben, um Sie manuell in Android, wenn es eine Funktion gibt, die sieht wie sollte es für Sie tun): https://devzone.nordicsemi.com/index.php/what-does-cccd-mean
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist denke ich ein kleines bisschen spät für eine Antwort geben, aber heute hatte ich die selben Zweifel und ich fand eine klare Antwort.
Mit
setCharacteristicNotification()
Sie eine Benachrichtigung lokal (auf android Gerät) und Einstellung CCC-DeskriptorENABLE_NOTIFICATION_VALUE
Sie sich eine Benachrichtigung auf ble-Peripheriegerät. In der Tat für die Aktivierung der CCC-Meldung, die Sie haben zu verwendensetValue()
undwriteDescriptor()
werden Methoden verwendet, die zum schreiben von Eigenschaften (in diesem Fall Merkmale Deskriptoren) an remote-Gerät.Ich fand diese auf: http://processors.wiki.ti.com/index.php/SensorTag_User_Guide
setCharacteristicNotification()
das für Sie auch tun? Wenn Sie eine BLE Merkmal Inspektion app (z.B. NRF Control Panel) können Sie sehen, dass Sie haben, generischen code zu aktivieren Benachrichtigung bei jedem characterstic (ermöglicht es). Also warum die Beispiel-code sagen, dass es speziell für den Herzfrequenz-sensor?Hier ist ein Auszug aus dem O ' Reilly-Buch "Getting Started With Bluetooth Low Energy":
Ich glaube, dass dies Ihre Frage beantwortet.
So
bezieht sich auf den ersten Teil
und
bezieht sich auf die 2.
Für die Zukunft der Völker kommen über, hier ist die beste Antwort, die ich finden konnte:
Schriftlich an den Client Charakteristisch Config-Deskriptor, Ihnen, dem Kunden, sagen die BLE server-zu-switch-Konfigurationen. (Das machte für mich keinen Sinn, entweder zu Beginn, aber in Englisch:)
Dies teilt der BLE-Gerät, um die Modi zu wechseln (Konfigurationen), um aktiv zu sammeln und Bericht änderungen dieser Eigenschaft anstatt Sie zu verändern und nur die Berichterstattung, wenn es angefordert wird.
Es ist schlecht benannt, aber Graben durch die docs es scheint, dass diese auch verwendet werden für andere möglichen charakteristischen Veränderungen, die der client anfordern kann: daher der verwirrende name.
https://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.client_characteristic_configuration.xml
Dies wirft die Frage auf, warum nennen
BluetoothGatt.setCharacteristicNotification()
wenn wir nur gehen, duplizieren Sie unsere Bemühungen, indem Sie ändern die Sicherheitsbeschreibung?! Graben durch dieBluetoothGatt
Quelle zeigt uns, dass setCharacteristicNotification bereitet nur den lokalen service zu erhalten Benachrichtigungen nicht aktivieren persistente updates.Ich weiß, es sieht dumm, aber die Einstellung CCCD-Wert ist der einzige Weg, Sie können sagen, die API, ob Sie sich zu drehen, wenn die Meldung oder Anzeige.
Derzeit gibt es keine setCharacteristicIndication. Zum aktivieren der Anzeige, Sie müssen rufen Sie setCharacteristicNotification (verwirrend) und dann schreiben BluetoothGattDescriptor.ENABLE_INDICATION_VALUE zu CCCD, ähnlich zu dem, was du hast, um Benachrichtigung aktivieren.
setCharactersticNotification()
eigentlich do? I. e. was wird passieren, wenn Sie nicht nennen es aber immer noch schreibenENABLE_NOTIFICATION_VALUE
des CCCD?"Der Client Charakteristisch Configuration-descriptor legt fest, wie das Merkmal kann so konfiguriert werden, die von einem bestimmten client."