BLE-GATT-onCharacteristicChanged nicht aufgerufen, nachdem das abonnieren von Benachrichtigungen

dies ist mein Erster Beitrag auf SO.

Ich habe einige Probleme abonnieren GATT-Benachrichtigungen auf android 5.0.2 .

Was ich tun sollen ist eine Verbindung zu einem Arduino mit einem BLE-Schild auf meinem Android-Handy. Ich habe einen sensor an den Arduino und möchten, senden Sie die Daten vom Arduino auf mein Telefon mit dem BLE shield.
Es ist ein nRF8001 auf dem Schild, das ist der server, mein Handy/app-client.

, Was ich Tat bisher war das erstellen einer Android app, die scans für BLE-Geräte. Es kann eine Verbindung zu einem Gerät zu Lesen und zu schreiben Eigenschaften. So kann ich die "manuell", Lesen Sie die Charakteristik durch den Aufruf gatt.readCharacteristic(mCharacteristic);. Dies ermöglicht es mir, um die sensor Werte vom Arduino.
Ich habe auch einen benutzerdefinierten Dienst mit nRFGo Studio. Ich weiß, dass das Teil so funktioniert, wie ich in der Lage bin, zu entdecken, zu schließen und sogar eine Benachrichtigung über änderungen der Kennlinie durch Verwendung der BLE-Scanner-app erhältlich auf Google Play.
Aber abonnieren Sie die Benachrichtigungen in meine eigene app wird nicht funktionieren. Naja, zumindest das Abonnement funktioniert, aber onCharacteristicChanged(...) wird nie aufgerufen. Was komisch ist, ist die Tatsache, dass, wenn ich abonnieren Sie die Kennlinie in meine app und danach abonnieren, um es mit der BLE-scanner-app plötzlich onCharacteristicChanged(...) heißt, bis ich mich Abmelden, wieder durch die BLE-scanner-app. (Ich kann das sehen, durch das Protokoll)

Mein android code ist wie folgt:
Die GATT-Rückruf:

private final BluetoothGattCallback mGattCallback =
        new BluetoothGattCallback() {
            @Override
            public void onConnectionStateChange(BluetoothGatt gatt, int status,
                                                int newState) {
                if (newState == BluetoothProfile.STATE_CONNECTED) {
                    sendBroadcastConnected();

                    Log.i("BLE", "Connected to GATT server.");
                    Log.i("BLE", "Attempting to start service discovery:" + bleManager.startServiceDiscovery());

                } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                    sendBroadcastDisconnected();
                    Log.i("BLE", "Disconnected from GATT server.");
                }
            }

            @Override
            public void onServicesDiscovered(BluetoothGatt gatt, int status) {
                if (status == BluetoothGatt.GATT_SUCCESS) {
                    Log.w("BLE", "onServicesDiscovered ");
                    setNotifySensor(gatt);     
                }
            }

            private void setNotifySensor(BluetoothGatt gatt) {
                BluetoothGattCharacteristic characteristic = gatt.getService(Globals.MPU_SERVICE_UUID).getCharacteristic(Globals.X_ACCEL_CHARACTERISTICS_UUID);
                gatt.setCharacteristicNotification(characteristic, true);

                BluetoothGattDescriptor desc = characteristic.getDescriptor(Globals.X_ACCEL_DESCRIPTOR_UUID);
                Log.i("BLE", "Descriptor is " + desc); //this is not null
                desc.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                Log.i("BLE", "Descriptor write: " + gatt.writeDescriptor(desc)); //returns true

            }

            @Override
            public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
                               if(Globals.X_ACCEL_CHARACTERISTICS_UUID.equals(characteristic.getUuid())){
                    Log.w("BLE", "CharacteristicRead - xaccel service uuid: " + characteristic.getService().getUuid());
                    Log.w("BLE", "CharacteristicRead - xaccel value: " + characteristic.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8,0));
                }
            }

            @Override
            public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
                Log.i("BLE", "Received characteristics changed event : "+characteristic.getUuid());
                if(Globals.X_ACCEL_CHARACTERISTICS_UUID.equals(characteristic.getUuid())){
                    Log.i("BLE", "Received new value for xAccel.");
                }


            }

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

            @Override
            public void onDescriptorRead(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            }

            @Override
            public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status) {
            }
        };

Dies ist, wie ich eine Verbindung zum GATT:

        bt_device = createBluetoothDevice(DEVICE_ADRESS);
        BluetoothGatt mBluetoothGatt = bt_device.connectGatt(context, false, mGattCallback);

Alle dieser code läuft in einem hintergrund-Dienst gestartet wird nach einem von der BLE Gerät ausgewählt ist.

, Was ich versucht habe war die Umsetzung Dinge wie Sie sind nachweislich in den Google-Dev-API-Handbuch und ich habe auch versucht diese Lösung (ohne Erfolg). Weder die Suche auf Google, Lesen Fragen schon gefragt, ALSO (Zum Beispiel diese eine ) oder mit einem Blick auf die nordischen Developer Zone haben hilft viel in diesem Fall.

Schließlich meine Frage ist: Was habe ich falsch gemacht? Bin ich etwas fehlt?
Ich kann einfach nicht herausfinden, und es macht mich verrückt jetzt seit zwei Tagen. Ich weiß nicht, wo sonst könnte ich Suche nach einer Lösung, so dass ich hoffe, Sie können mir helfen..

BEARBEITEN Globals-Klasse:

//BLE Services
public static final UUID MPU_SERVICE_UUID = UUID.fromString("3f540001-1ee0-4245-a7ef-35885ccae141");
//BLE Characteristics
public static final UUID X_ACCEL_CHARACTERISTICS_UUID = UUID.fromString("3f540002-1ee0-4245-a7ef-35885ccae141");
//BLE Descriptors
public static final UUID X_ACCEL_DESCRIPTOR_UUID = UUID.fromString("3f542902-1ee0-4245-a7ef-35885ccae141");

BEARBEITEN, Was ich in BLE Scanner:
Ich habe einfach Scannen nach BLE-Geräten. Es findet mein Gerät und nach Tippen auf es es zeigt mir alle meine Leistungen, die ich eingerichtet habe auf dem Arduino-board. Nach der Auswahl eines service zeigt er mir alle meine chatacteristics, die ich bei diesem Service angegebenen. Und wenn ich Tippen Sie auf ein Merkmal, zeigt er mir seine UUID und seinen Dienst durch die UUID. Auch die BLE-Scanner-app ermöglicht es mir, zu abonnieren, um die Benachrichtigung oder zum Lesen der Eigenschaft. Wenn ich ein Abonnement der Wert wird fortlaufend aktualisiert.

  • Können Sie Ihre Globals?
  • Auch, können Sie veröffentlichen, was Sie tun, BLE Scanner, um es zu arbeiten?
  • Ja, ich war meist wollen wissen, ob Sie sicher sind, dass Ihre UUIDs übereinstimmen, diejenigen, die Sie wählen Sie in der BLE Scanner.
  • Ähnliche Frage: stackoverflow.com/questions/17910322/...
  • Danke für den link, aber ich fand bereits dieses: Als ich nicht mehr als eine Eigenschaft, die ich nicht eine Warteschlange erstellen.Derzeit bin ich nicht, reding oder schreiben jede Eigenschaft, Tat aber so für Testzwecke. Obwohl, wenn ich getestet habe, lese ich sicher, dass onDescriptorWrite() schon genannt wurde. Neustart mein Gerät hat auch nicht geholfen. Der Deskriptor geschrieben wird, ähnlich wie in der ersten Antwort. Ich auch geprüft die UUIDs, aber Sie alle mit denjenigen übereinstimmen, die in der BLE-Scanner und die, die ich einrichten in nRFGo Studio.
  • OK, ich hatte einen Blick auf den code der RedBearLab Android-App und fand, daß Sie übergeben werden, eine UUID für den Deskriptor, der hat eine andere Basis als die Merkmale: github.com/RedBearLab/Android/blob/master/Examples/Chat/src/com/..., Aber das, was ich Tue, wird ein Deskriptor für das Merkmal, also es hat die gleiche Basis. Wo steht die UUID kommt aus dem RBL Beispiel? Ich hatte auch einen Blick auf die nrfGo xml-Datei, aber ich kann nicht finden die UUID...

InformationsquelleAutor ordsen | 2015-05-06
Schreibe einen Kommentar