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.

Escriba los fragmentos de bytes uno por uno utilizando writeCharacteristics usando RxAndroidBLE. RxAndroidBLE es una biblioteca que permite interactuar con dispositivos Bluetooth de baja energía en Android utilizando el patrón de programación reactiva. Para escribir fragmentos de bytes uno por uno utilizando la función writeCharacteristics de RxAndroidBLE, siga estos pasos: 1. Conecte su dispositivo Bluetooth de baja energía utilizando RxAndroidBLE. 2. Obtenga una instancia de la clase RxBleConnection llamando al método establecer conexión `RxBleDevice#establishConnection(boolean autoConnect)`. 3. Suscríbase a la conexión establecida utilizando el operador `subscribe()` para recibir eventos de conexión. 4. Una vez que la conexión se haya establecido correctamente, obtenga la característica en la que desea escribir los fragmentos de bytes llamando al método `RxBleConnection#getCharacteristic(UUID)`. Asegúrese de proporcionar el UUID correcto de la característica. 5. Utilice la función `writeCharacteristics(byte[]…)` en la característica obtenida para escribir los fragmentos de bytes uno por uno. Por ejemplo: `characteristic.write(characteristicBytes)`. 6. Asegúrese de manejar cualquier respuesta o error que pueda ocurrir al intentar escribir los bytes utilizando RxAndroidBLE. Aquí está un ejemplo de cómo se vería un código para escribir fragmentos de bytes uno por uno utilizando writeCharacteristics usando RxAndroidBLE: “`java RxBleDevice bleDevice = RxBleClient.create(this).getBleDevice(deviceAddress); bleDevice.establishConnection(false) .subscribe( rxBleConnection -> { // Conexión establecida con éxito UUID characteristicUuid = UUID.fromString(“UUID_DE_LA_CARACTERÍSTICA”); RxBleConnectionCharacteristic characteristic = rxBleConnection.getCharacteristic(characteristicUuid); byte[] bytesToWrite = {0x01, 0x02, 0x03}; // Fragmentos de bytes a escribir characteristic.write(bytesToWrite) .subscribe( bytesWritten -> { // Fragmento de bytes escrito con éxito }, throwable -> { // Error al escribir los fragmentos de bytes } ); }, throwable -> { // Error al establecer la conexión Bluetooth } ); “` Asegúrese de reemplazar “UUID_DE_LA_CARACTERÍSTICA” con el UUID correspondiente de la característica en la que desea escribir los fragmentos de bytes. Recuerde también manejar cualquier excepción u error que pueda ocurrir durante la conexión o escritura de los fragmentos de bytes utilizando RxAndroidBLE.

Estoy tratando de escribir el archivo en el controlador utilizando la biblioteca RxAndroidBLE. Actualmente, estoy leyendo un archivo y convirtiéndolo en un byte[] y enviándolo en trozos de 244.

Para realizar esta tarea, estoy utilizando el siguiente flujo:

.flatMap(bytes -> getFileData())
.flatMapIterable(otaData -> otaData.getOtaByteArray())
.flatMapSingle(bytes -> mRxBleConnection.writeCharacteristic(OTA_DATA, bytes))
.subscribe(bytes -> {

    Log.e(TAG,"Response Write "+Arrays.toString(BLEUtils.toHex(bytes)));

});

aquí, getFileData devuelve el objeto otaData.

El problema con este enfoque es que todos los arreglos de bytes de flatMapIterable se están enviando en cola a mRxBleConnection.writeCharacteristic y luego se envían al controlador. En este caso, el controlador no puede leer los datos correctamente.

Por lo tanto, estoy buscando una forma en la que una vez que la función mRxBleConnection.writeCharacteristic termine de escribir un trozo de 244, luego solo tome el siguiente arreglo de byte[]. No estoy seguro de cómo calibrar los flujos aquí para asegurarme de escribir un bloque de datos y luego elegir el siguiente usando RxAndroidBLE y RxJava.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver el problema de inundar el mRxBleConnection.writeCharacteristic con todas las matrices de bytes, podemos usar el operador concatMapEager en lugar de flatMapIterable para asegurarnos de que solo se procese un fragmento a la vez.

    El flujo actualizado se vería así:

    .flatMap(bytes -> getFileData())
    .concatMapEager(otaData -> Observable.fromIterable(otaData.getOtaByteArray()))
    .flatMapSingle(bytes -> mRxBleConnection.writeCharacteristic(OTA_DATA, bytes))
    .subscribe(bytes -> {
        Log.e(TAG, "Response Write " + Arrays.toString(BLEUtils.toHex(bytes)));
    });
    

    Aquí, concatMapEager mantendrá múltiples suscripciones activas, pero las procesará en orden, asegurando que solo se procese un fragmento a la vez.

    Además, también podemos introducir un retraso entre las escrituras consecutivas para asegurarnos de que el controlador tenga suficiente tiempo para procesar cada fragmento. Esto se puede hacer utilizando el operador delay de la siguiente manera:

    .flatMap(bytes -> getFileData())
    .concatMapEager(otaData -> Observable.fromIterable(otaData.getOtaByteArray()))
    .concatMapSingle(bytes -> mRxBleConnection.writeCharacteristic(OTA_DATA, bytes).delay(50, TimeUnit.MILLISECONDS))
    .subscribe(bytes -> {
        Log.e(TAG, "Response Write " + Arrays.toString(BLEUtils.toHex(bytes)));
    });
    

    Aquí, hemos introducido un retraso de 50 milisegundos entre las escrituras consecutivas. Este valor se puede ajustar según la velocidad de procesamiento del controlador y otros factores.

Comments are closed.