Устройство BLE, которое я подключаю, испускает байты по одной из характеристик GATT в ответ на запись в характеристику. Предполагается, что клиенты должны включать уведомления об этой характеристике и интерпретировать байты изменения для характеристики. (Поведение, которое я контролирую, включает службу сканирования ближайших беспроводных сетей, а затем прослушивание вывода службы).Использование RxAndroidBle, как я могу подписаться на ответы от написания до характеристики?
Я использую RxAndroidBle и следую за examples. У меня есть активное соединение Observable. Характеристика, которую я хочу наблюдать, имеет UUID, называемый AP_SCAN_DATA
. Предполагается испустить 0xFE
в ответ на получение письменного 0xFF
.
Как я могу позвонить setupNotification
и установить Наблюдатель на него, чтобы поймать испущенный byte[]
s, а затем написать значение для характеристики, чтобы я мог поймать ответ?
Моя лучшая работа до сих пор:
connectionObservable.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<RxBleConnection>() {
@Override
public void onCompleted() { // ignore...
}
@Override
public void onError(Throwable e) { // ignore...
}
@Override
public void onNext(final RxBleConnection connection) {
Observable.just(connection)
.flatMap(new Func1<RxBleConnection, Observable<Observable<byte[]>>>() {
@Override
public Observable<Observable<byte[]>> call(RxBleConnection connection) {
return connection.setupNotification(AP_SCAN_DATA);
}
})
.doOnNext(new Action1<Observable<byte[]>>() {
@Override
public void call(Observable<byte[]> observable) {
Log.i(TAG, "notification has been set up");
// This code logs on DEBUG that a write was made, but no response ever arrives
connection.writeCharacteristic(AP_SCAN_DATA, CharacteristicValue.RESET.asBytes())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
}
})
.flatMap(new Func1<Observable<byte[]>, Observable<byte[]>>() {
@Override
public Observable<byte[]> call(Observable<byte[]> observable) {
return observable;
}
})
.doOnNext(new Action1<byte[]>() {
@Override
public void call(byte[] bytes) {
Log.i(TAG, "want to read response bytes here, but I don't... " + HexString.bytesToHex(bytes));
}
})
.subscribe();
}
});