Проблемы с отпиской

Я делаю приложение, которое работает как пульт дистанционного управления для вентилятора с помощью RxAndroidBle. У меня проблема с unsubscribe потому что когда я использую

.flatMap(rxBleConnection -> rxBleConnection.writeCharacteristic(Uuids.UUID_RX, flaktCommandConcat.getBytes()))

и после этого я использую subscription.unsubscribe(); writeCharacteristics не работает, потому что unsubscribe всегда запускается всегда, и соединение разрывается до отправки данных.

Что мне нужно это:

  • Когда я нажимаю кнопку, я хочу подключиться к вентилятору
  • Затем отправьте все значения
  • А потом отключи.
  • Если я повторю процедуру, ей придется делать одно и то же снова и снова.

Может ли кто-нибудь помочь мне с какой-то идеей? Я пытался использовать .delay(1000, Time.MILISECONDS) и это сработало, но потребовалось много времени, чтобы отправить информацию на аппарат ИВЛ.

Это мой код:

 public void writeRxCharacteristics(String flaktCommandConcat){

    rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS);


    subscription = rxBleDevice.establishConnection(true) //false
            .observeOn(AndroidSchedulers.mainThread())
            .flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
            .setCharacteristicUuid(Uuids.UUID_RX)
            .setBytes(flaktCommandConcat.getBytes())
            .build())

            .subscribe(
                    byteArray -> {
                        Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray));
                    },

                    throwable -> {
                        Log.d("CharacteristicValue","Throwable: " + throwable.toString());
                        rxBleActivity.onScanFailure(throwable, getContext());
                    }
            );


    rxBleDevice.observeConnectionStateChanges()
            .observeOn(AndroidSchedulers.mainThread())
            .delay(1000, TimeUnit.MILLISECONDS)
            .subscribe(
                    rxBleConnectionState -> {
                        Log.d("RxBleConnectionState", " CON_STATUS: " + rxBleConnectionState);
                        disconnect();

                    },
                    throwable -> {
                        Log.d("ConnectionStateChanges","Throwable: " + throwable.toString());

                    }
            );
}
public void disconnect() {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
subscription = null;
}
Log.d("CONNECTION2", " CON_STATUS: " + rxBleDevice.getConnectionState().toString());
}

1 ответ

Похоже, вам не нужно долго писать здесь. Ваши данные длиннее 20 байт?

В любом случае, библиотека освобождает соединение, когда Observable<RxBleConnection> отписался Что бы я сделал на вашем месте, это:

public void writeRxCharacteristics(String flaktCommandConcat){
    rxBleDevice = rxBleClient.getBleDevice(Uuids.DEVICE_ADDRESS);

    rxBleDevice.establishConnection(true) //false
            .flatMap(rxBleConnection -> rxBleConnection.createNewLongWriteBuilder()
                .setCharacteristicUuid(Uuids.UUID_RX)
                .setBytes(flaktCommandConcat.getBytes())
                .build()
            )
            .take(1)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                    byteArray -> {
                        Log.d("CharacteristicValue","WRITE: " + Arrays.toString(byteArray));
                    },

                    throwable -> {
                        Log.d("CharacteristicValue","Throwable: " + throwable.toString());
                        rxBleActivity.onScanFailure(throwable, getContext());
                    }
            );

Пожалуйста, убедитесь, что вы не злоупотребляете длинной записью. У него есть известная ошибка (не связанная) в 1.2.0, которая недавно была исправлена ​​в 1.3.0-SNAPSHOT.

Другие вопросы по тегам