studio example dispositivos detectar bluetoothadapter app android bluetooth

example - bluetoothadapter android



Android BLE onCharacteristicRead y onCharacteristicChanged nunca se llama (2)

Creo que te está faltando mGatt.readCharacteristic(characteristic) .

Cuando lo llame, esperará a que finalice la lectura y llamará a la característica de onCharacteristicRead .

Estoy tratando de conectarme a un termómetro Bluetooth LE. La conexión al dispositivo está funcionando bien. La única parte que me cuelga es gattCallBack y está enCharacteristicChanged / Read. el ''setNotification'' y el descriptor ''setValue'' y ''writeDescriptor'' devuelven verdadero. El onCharacteristicChanged nunca se llama para devolver un valor.

Utilicé un pequeño y práctico programa de Play Store llamado BLE Scanner para ayudarme a darme más información sobre el dispositivo y sus servicios y características.

Es por eso que simplemente codifiqué el servicio 2, característica 0. Simplemente no puedo entender por qué después de escribir el Descriptor, nunca veo nada volver. Lo interesante es que puedo usar algunas de las otras características (una de ellas es el Intervalo de temperatura) y recibo una respuesta (aunque los datos son confusos).

Además, por curiosidad, ¿por qué hay 2 descripciones en esta característica?

Este código está contenido en mi método MainActivity. No estoy seguro de si eso marcaría la diferencia aquí. He analizado y probado varios métodos publicados aquí sin suerte.

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) { ... } };

ACTUALIZACIÓN: decidí verificar el método onDescriptorWrite y registrar algo de información.

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

Lo interesante aquí es que el estado está retornando 13, que es ''Una operación de escritura excede la longitud máxima del atributo''.

Estaré investigando esto más a fondo.


Encontré el problema aquí. Asumí que el termómetro estaba usando el servicio BLE estándar y la configuración característica. No lo es. Crearon su propia característica personalizada. Una vez que cambié a esa característica, el método ''cambiado'' comenzó a disparar.