BLE デバイスのリストがあり、RxJava を使用してそれらとやり取りしています。リストからアイテムを発行し、X が発生するまで特性を繰り返し書き込み、リスト内の次のアイテムに進む必要があります。
現在のコード:
Observable.from(mDevices)
.flatMap(new Func1<Device, Observable<?>>() {
@Override
public Observable<?> call(Device device) {
Log.d(TAG, "connecting for policing");
return device.connectForPolicing();
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Object>() {
@Override
public void call(Object o) {
Log.d(TAG, "subscribing... ");
}
});
次のようになり.connectForPolicing()
ます。
public Observable<byte[]> connectForPolice() {
....
return device.establishConnection(mContext, false)
.flatMap(new Func1<RxBleConnection, Observable<byte[]>>() {
@Override
public Observable<byte[]> call(RxBleConnection rxBleConnection) {
byte[] value = new byte[1];
value[0] = (byte) (3 & 0xFF);
//Buzz the device
return rxBleConnection.writeCharacteristic(Constants.BUZZER_SELECT, value);
}
})
.repeat(3)//ignore
.takeUntil(device.observeConnectionStateChanges().filter(new Func1<RxBleConnection.RxBleConnectionState, Boolean>() {
@Override
public Boolean call(RxBleConnection.RxBleConnectionState rxBleConnectionState) {
return rxBleConnectionState == RxBleConnection.RxBleConnectionState.DISCONNECTING;
}
}));
}
このコードは、リスト内のすべてのアイテムをすぐに発行するように見えるため、すべてのアイテムを同時に接続してバズさせます。一度に 1 つずつアイテムを放出して、それらとやり取りできるようにするにはどうすればよいですか?
擬似コードは次のようになります。
for(Device device : devices) {
device.connect();
while(device.isConnected()) {
device.beep();
}
}