programmieren - Android BLE onCharacteristicRead und onCharacteristicChanged nie aufgerufen




android bluetooth reset (2)

Ich denke, Sie vermissen mGatt.readCharacteristic(characteristic) .

Wenn Sie es aufrufen, wartet es auf das Ende des onCharacteristicRead und ruft onCharacteristicRead .

Ich versuche, mich mit einem Bluetooth LE-Thermometer zu verbinden. Die Verbindung mit dem Gerät funktioniert gut. Der einzige Teil, der mich aufhält, ist gattCallBack und es ist onCharacteristicChanged / Read. Die 'setNotification' und der Deskriptor 'setValue' und 'writeDescriptor' geben alle wahr zurück. Der onCharacteristicChanged wird nie aufgerufen, um einen Wert zurückzugeben.

Ich habe ein ziemlich handliches kleines Programm aus dem Play Store namens BLE Scanner benutzt, um mir mehr Informationen über das Gerät und seine Dienste und Eigenschaften zu geben.

Aus diesem Grund habe ich Service 2, Merkmal 0, einfach fest programmiert. Ich kann einfach nicht herausfinden, warum ich nach dem Schreiben von Descriptor nie etwas zurückkommen sehe. Das Interessante ist, dass ich einige der anderen Merkmale (eines ist das Temperaturintervall) verwenden kann und ich eine Antwort erhalte (obwohl die Daten verstümmelt sind).

Aus Neugier, warum gibt es 2 Deskriptoren zu diesem Merkmal?

Dieser Code ist in meiner MainActivity-Methode enthalten. Nicht sicher, ob das hier einen Unterschied machen würde. Ich habe mehrere Methoden angeschaut und ausprobiert, ohne Erfolg.

private final BluetoothGattCallback gattCallback = new BluetoothGattCallback()
{
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)
    { ... }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status)
    {
        mGatt = gatt;

        List<BluetoothGattService> services = mGatt.getServices();
        Log.i("onServicesDiscovered", services.toString());

        BluetoothGattCharacteristic characteristic = services.get(2).getCharacteristics().get(0);

        mGatt.setCharacteristicNotification(characteristic, true);

        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString(CLIENT_CHARACTERISTIC_CONFIG));
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_INDICATION_VALUE);

        mGatt.writeDescriptor(descriptor);

    }            

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

    @Override
    public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic)
    { ... }
};

UPDATE: Ich habe beschlossen, die onDescriptorWrite-Methode zu überprüfen und einige Informationen zu protokollieren.

@Override            
public void onDescriptorWrite(BluetoothGatt gatt,  BluetoothGattDescriptor descriptor, int status)
    {
        Log.i("descriptorWRITE", Integer.toString(status));
    }

Interessant ist hier, dass der Status 13 zurückgibt, wobei "Ein Schreibvorgang die maximale Länge des Attributs überschreitet".

Ich werde das weiter untersuchen.


Ich habe das Problem hier gefunden. Ich nahm an, dass das Thermometer den Standard-BLE-Dienst und die charakteristische Konfiguration verwendet hat. Es ist nicht. Sie haben ihr eigenes benutzerdefiniertes Merkmal erstellt. Sobald ich zu diesem Merkmal wechselte, begann die "veränderte" Methode zu feuern.







bluetooth