【发布时间】:2019-01-10 01:30:26
【问题描述】:
目前我正在尝试重构 my source code 以使用 RxAndroidBle 库。
我实现了一个状态机,它调用每个蓝牙成功操作(通知、写入、读取等)下一个状态。只要蓝牙设备正在运行,就应该始终建立 rxBleConnection。
我的设置通知实现如下所示:
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 创建状态机? (我需要依次调用各种蓝牙操作)
你会发现我的完整实现here
编辑:
但是,如果有人尝试再次订阅 .setupNotification() 对于相同的特征,两个订阅者将共享相同的 通知。
感谢您的解释,因此不会再次调用doOnNext(),因为如果我再次订阅setupNotification(),则通知已经设置成功。
是否可以检查通知是否已设置(以便我可以跳过此步骤继续我的下一个机器状态)?
为什么你的 API 看起来像这样或者你想要实现什么
我想实现通过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) {}
设置蓝牙通信顺序。蓝牙通信/序列/算法总是不同的,不能参数化。但它始终是连续的。要初始化蓝牙秤首先我需要设置通知 A 然后 B。其次,我必须发送命令 C 之后我会收到一个或多个通知呼叫,然后我必须发送命令 B 等等。我支持来自不同供应商的许多蓝牙秤,命令/设置通知和算法的数量总是不同的。
您可以查看子类及其各种算法here
根据我的经验,RxJava2 不需要额外的状态 机器,因为它已经是一个处理状态的库
如何抽象子类的库句柄状态?
【问题讨论】:
标签: java android bluetooth rxandroidble