Gestión de notificaciones en Android con múltiples conexiones periféricas BLE.
Así que, soy nuevo en el desarrollo de Android y estoy intentando conectar mi dispositivo a múltiples dispositivos BLE (T-Wristband) para recibir notificaciones frecuentes (datos de sensores IMU de menos de 20 bytes a 50Hz).
Cuando me conecto a múltiples dispositivos, me pierdo datos de uno o más dispositivos. Sospecho que la razón es que mi método BluetoothGattCallback
, onCharacteristicChanged
, está trabajando en el mismo hilo para todos los dispositivos (Nota: he verificado eso registrando Thread.currentThread.getName()
).
Lo que he intentado:
Sospecho que todos los que agregan retardos simplemente están permitiendo que el sistema BLE complete la acción que ha solicitado antes de enviar otra.
Problema: No puedo agregar retardos al recibir notificaciones ya que interferiría con mi frecuencia de muestreo, y no estoy seguro de cuándo podré recibir nuevas notificaciones de otro dispositivo, o incluso del mismo dispositivo.
Para lograr múltiples conexiones BLE, debes almacenar múltiples objetos
BluetoothGatt
y usar esos objetos para un dispositivo diferente.
En este sentido: he intentado escribir una clase personalizada para mi dispositivo, TTGODevice
, que guarda una instancia del correspondiente BluetoothGatt
después de la conexión:
public class TTGODevice {
/* Un montón de constantes psf */
private BluetoothDevice device;
private Context context;
private Accelerometer acc;
private BluetoothGatt server;
private int deviceStatus;
private final BluetoothGattCallback bluetoothGattCallback = new BluetoothGattCallback() { ...
};
public TTGODevice(Context context, BluetoothDevice device) {
this.device = device;
this.context = context;
this.acc = new Accelerometer(); // Mi clase personalizada para el acelerómetro en el (los) dispositivo(s) T-Wristband
}
public void connect(boolean autoConnect) {
server = device.connectGatt(context, false, bluetoothGattCallback);
}
/* Getters para device, server, y deviceStatus */
}
En el BluetoothGattCallback
, sobrescribo mi onCharacteristicChanged
de la siguiente manera:
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
byte[] bytes = characteristic.getValue();
// actualizando el acelerómetro
acc.update(bytes);
Log.d(TAG, "onCharacteristicChanged: " + Thread.currentThread().getName());
}
También he intentado usar la instancia exacta de mi server
en el callback anterior, pero no he tenido suerte.
byte[] bytes = server.getService(SERVICE_UUID).getCharacteristic(CHARACTERISTIC_UUID).getValue();
La historia larga corta es que no he tenido éxito. Agradecería cualquier otro hilo relevante.
[Nota: se me ha sugerido usar Fragments
y/o ViewModels
. No estoy seguro de cómo son relevantes.]
davy.ai
Conexión de múltiples dispositivos BLE en Android Studio
Como alguien nuevo en el desarrollo de Android, intenté conectar mi dispositivo a varios dispositivos BLE para recibir notificaciones frecuentes, pero me encontré con un problema: me faltaban datos de uno o más dispositivos. Después de investigar, parecía que mi método
BluetoothGattCallback
,onCharacteristicChanged
, se estaba ejecutando en el mismo hilo para todos los dispositivos. Esto es lo que intenté y dónde estoy:1. Android 4.3: cómo conectarse a varios dispositivos Bluetooth de baja energía
Me encontré con este hilo y sospeché que el problema podría resolverse agregando retrasos, pero eso no era factible para mí porque podría afectar mi frecuencia de muestreo. Nunca estoy seguro de cuándo podría recibir una nueva notificación de otro dispositivo, o incluso del mismo dispositivo.
2. Conexiones múltiples BLE de Android
Otro hilo sugirió que almacenara varios objetos
BluetoothGatt
y usara esos objetos para diferentes dispositivos. Para implementar esto, creé una clase personalizada para mi dispositivo,TTGODevice
, que guarda una instancia delBluetoothGatt
correspondiente al conectarse. Sin embargo, no pude reemplazar correctamenteonCharacteristicChanged
para cada dispositivo y terminé con el mismo problema. Intenté usar la instancia exacta de mi servidor en la devolución de llamada, pero eso tampoco funcionó.Se necesitan sugerencias
He agotado mis opciones y agradecería cualquier otro hilo o sugerencia relevante. También me recomendaron usar
Fragments
y/oViewModels
, pero no estoy seguro de cómo mejorarían el proceso. Cualquier ayuda sería apreciada.