Write/Notification 使用 rxandroidble 处理
Write/Notification handling with rxandroidble
我正在尝试实现这个 write/notification 处理 () 的示例。
connectionObservable
.flatMap((Function<RxBleConnection, Observable<Observable<byte[]>>>)
(RxBleConnection rxBleConnection) -> {
return rxBleConnection.setupNotification(TX_CHAR_UUID);
},
(BiFunction<RxBleConnection, Observable<byte[]>, Observable<byte[]>>)
(rxBleConnection, apScanDataNotificationObservable) -> {
return Observable.combineLatest(
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()),
apScanDataNotificationObservable.first(),
new BiFunction<byte[], byte[], byte[]>() {
@Override
public byte[] apply(byte[] writtenBytes, byte[] responseBytes) throws Exception {
return responseBytes;
}
}
);
}
).flatMap(new Function<Observable<byte[]>, Observable<byte[]>>() {
@Override
public Observable<byte[]> apply(Observable<byte[]> observable) throws Exception {
return observable;
}
})
.first()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<byte[]>() {
@Override
public void accept(byte[] bytes) throws Exception {
Log.i("Ivan1", "notification response...." + bytes.toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("Ivan", "notification response...." + throwable.toString());
}
});
我尝试用 rxjava1 和 rxjava2 编写,但在这两种情况下我都遇到了 apScanDataNotificationObservable.first() 的编译时错误。它说 "first(byte[]) in Observable cannot be applied to ()"。所以我不知道应该将什么参数传递给第一种方法。
您收到此错误的原因是因为原始答案是为 RxAndroidBle
的 RxJava1
版本提供的,并且您至少在上面的示例中使用了 RxJava2
。
在 RxJava1
和 RxJava2
之间,方法 Observable.first()
更改了签名和实现。 RxJava2
的等效函数是 Observable.take(int count)
您应该更改此行:
apScanDataNotificationObservable.first(),
为此:
apScanDataNotificationObservable.take(1),
此外,Observable.combineLatest()
接受两个 Observable
参数,其中 rxBleConnection.writeCharacteristic()
是一个 Single
。您应该更改此行:
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()),
为此:
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()).toObservable(),
我正在尝试实现这个 write/notification 处理 (
connectionObservable
.flatMap((Function<RxBleConnection, Observable<Observable<byte[]>>>)
(RxBleConnection rxBleConnection) -> {
return rxBleConnection.setupNotification(TX_CHAR_UUID);
},
(BiFunction<RxBleConnection, Observable<byte[]>, Observable<byte[]>>)
(rxBleConnection, apScanDataNotificationObservable) -> {
return Observable.combineLatest(
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()),
apScanDataNotificationObservable.first(),
new BiFunction<byte[], byte[], byte[]>() {
@Override
public byte[] apply(byte[] writtenBytes, byte[] responseBytes) throws Exception {
return responseBytes;
}
}
);
}
).flatMap(new Function<Observable<byte[]>, Observable<byte[]>>() {
@Override
public Observable<byte[]> apply(Observable<byte[]> observable) throws Exception {
return observable;
}
})
.first()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<byte[]>() {
@Override
public void accept(byte[] bytes) throws Exception {
Log.i("Ivan1", "notification response...." + bytes.toString());
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("Ivan", "notification response...." + throwable.toString());
}
});
我尝试用 rxjava1 和 rxjava2 编写,但在这两种情况下我都遇到了 apScanDataNotificationObservable.first() 的编译时错误。它说 "first(byte[]) in Observable cannot be applied to ()"。所以我不知道应该将什么参数传递给第一种方法。
您收到此错误的原因是因为原始答案是为 RxAndroidBle
的 RxJava1
版本提供的,并且您至少在上面的示例中使用了 RxJava2
。
在 RxJava1
和 RxJava2
之间,方法 Observable.first()
更改了签名和实现。 RxJava2
的等效函数是 Observable.take(int count)
您应该更改此行:
apScanDataNotificationObservable.first(),
为此:
apScanDataNotificationObservable.take(1),
此外,Observable.combineLatest()
接受两个 Observable
参数,其中 rxBleConnection.writeCharacteristic()
是一个 Single
。您应该更改此行:
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()),
为此:
rxBleConnection.writeCharacteristic(RX_CHAR_UUID, getInputBytes()).toObservable(),