Прежде всего, я использую библиотеку RxAndroidBLE для управления подключениями BLE.
У меня есть два устройства SensorTag, и я хочу читать температура от обоих одновременно. Например, я хотел бы считывать температуру с обоих устройств ровно каждые 500 мс и отображать ее пользователю в двух TextView.
Мое приложение в настоящее время успешно подключается к обоим устройствам BLE следующим образом:
@OnClick(R.id.connectButton1)
public void connectFirstSensorTag(Button b) {
if (!isDeviceConnected(sensorTag1)) {
connectionObservable1 = sensorTag1.establishConnection(getApplicationContext(), false).compose(new ConnectionSharingAdapter());
}
connectionObservable1.subscribe(new Subscriber<RxBleConnection>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
updateStatus(statusTextView1, "SensorTag not found");
}
@Override
public void onNext(RxBleConnection rxBleConnection) {
updateStatus(statusTextView1, "Connected");
enableSensorTagTemperatureSensor(connectionObservable1);
}
});
}
@OnClick(R.id.connectButton2)
public void connectSecondSensorTag(Button b) {
if (!isDeviceConnected(sensorTag2)) {
connectionObservable2 = sensorTag2.establishConnection(getApplicationContext(), false).compose(new ConnectionSharingAdapter());
}
connectionObservable2.subscribe(new Subscriber<RxBleConnection>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
updateStatus(statusTextView2, "SensorTag not found");
}
@Override
public void onNext(RxBleConnection rxBleConnection) {
updateStatus(statusTextView2, "Connected");
enableSensorTagTemperatureSensor(connectionObservable2);
}
});
}
Теперь я ищу лучший способ считывать температуру с обоих одновременно каждые 500 мс.
Прямо сейчас я делаю что-то вроде этого:
connectionObservable1
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuidFromShortCode("AA01")))
.subscribe(bytes -> {
// first temperature was successfully read here
connectionObservable2
.flatMap(rxBleConnection -> rxBleConnection.readCharacteristic(uuidFromShortCode("AA01")))
.subscribe(bytes -> {
// second temperature was successfully read here
}, error -> {
updateStatus(error.toString());
});
}, error -> {
updateStatus(error.toString());
});
И этот блок кода находится внутри запускаемого объекта, который вызывается каждые 500 мс.
Я чувствую, что это крайне неэффективный способ сделать это. Может кто-нибудь, пожалуйста, дайте мне знать, есть ли лучший способ сделать это?
statusTextView1/2
конструктором) - person   schedule 14.08.2016