es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

  1. Android 4.3: How to connect to multiple Bluetooth Low Energy devices

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.

  1. Android BLE multiple connections

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.]

Tags:  , , ,

Answer

  1. Avatar for 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 del BluetoothGatt correspondiente al conectarse. Sin embargo, no pude reemplazar correctamente onCharacteristicChanged 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/o ViewModels, pero no estoy seguro de cómo mejorarían el proceso. Cualquier ayuda sería apreciada.

Comments are closed.