В настоящее время я пытаюсь провести рефакторинг моего исходного кода для использования библиотеки RxAndroidBle.
Я реализовал конечный автомат, который вызывает все успешные операции Bluetooth (уведомление, запись, чтение иитак) следующее состояние.RxBleConnection всегда следует устанавливать до тех пор, пока работает устройство Bluetooth.
Моя реализация уведомления об установке выглядит следующим образом:
protected void setNotificationOn(UUID characteristic) {
if (isConnected()) {
final Disposable disposable = connectionObservable
.flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristic))
.doOnNext(notificationObservable -> {
Timber.d("Successful set notification on for %s", BluetoothGattUuid.prettyPrint(characteristic));
nextMachineStateStep();
}
)
.flatMap(notificationObservable -> notificationObservable)
.observeOn(AndroidSchedulers.mainThread())
.retry(BT_RETRY_TIMES_ON_ERROR)
.subscribe(
bytes -> {
onBluetoothNotify(characteristic, bytes);
Timber.d("onCharacteristicChanged %s: %s",
BluetoothGattUuid.prettyPrint(characteristic),
byteInHex(bytes));
},
throwable -> onError(throwable)
);
compositeDisposable.add(disposable);
}
}
, если я только один раз установил в уведомлении характеристикуэто работает, но если произошла ошибка или если я попытаюсь установить ее еще раз, я застряну в бесконечном цикле в doOnNext, и метод setNotificationOn никогда не завершается.Я думал, doOnNext вызывается только один раз при успешной настройке уведомлений !?(Исключение BleConflictingNotificationAlreadySetException никогда не генерируется, как и другие исключения!?)
Как я могу повторно настроить уведомление для одной и той же характеристики?
Есть ли лучший способ создать конечный автомат с помощью RxAndroidBle / RxJava2?(Мне нужно вызывать различные операции Bluetooth)
Здесь вы найдете мою полную реализацию
Редактировать:
Однако, если быпопробуйте снова подписаться на .setupNotification () для той же характеристики, что оба подписчика будут использовать одно и то же уведомление.
Спасибо за объяснение, поэтому doOnNext()
больше не вызывается, потому что, если я подпишусь на setupNotification()
снова уведомление уже успешно выполнено.
Можно ли проверить, настроено ли уже уведомление (чтобы я мог пропустить этот шаг, чтобы перейти к следующему состоянию машины)?
почему ваш API выглядит так или чего именно вы хотите достичь
Я хочу добиться того, чтобы связь Bluetooth через RxAndroidBle была абстрагирована, чтобы подкласс class BluetoothCommunication
мог просто использоватьСпособы:
protected void writeBytes(UUID characteristic, byte[] bytes)
protected void readBytes(UUID characteristic)
protected void setIndicationOn(UUID characteristic)
protected void setNotificationOn(UUID characteristic)
/* Method is triggered if a Bluetooth data is read from a device. */
protected void onBluetoothRead(UUID characteristic, byte[] value) {}
/* Method is triggered if a Bluetooth data from a device is notified */
protected void onBluetoothNotify(UUID characteristic, byte[] value) {}
для настройки последовательности связи Bluetooth.Связь / последовательность / алгоритм Bluetooth всегда отличаются и не могут быть параметризованы.Но это всегда последовательно.Чтобы инициализировать шкалу Bluetooth, во-первых, мне нужно настроить уведомления A, а затем B. Во-вторых, мне нужно отправить команду C, после чего я получу один или несколько уведомлений, после чего мне придется отправить команду B и так далее.Я поддерживаю множество шкал Bluetooth от разных поставщиков, количество команд / уведомлений о настройке и алгоритм всегда различны.
Здесь вы можете увидеть подклассы с их различным алгоритмом здесь
По моему опыту, RxJava2 не нуждается в дополнительном автомате состояний, поскольку это уже библиотека, которая обрабатывает состояние
Как я могу абстрагировать состояние дескриптора библиотеки для подклассов?