Изображение буфера из уведомления BLE с помощью RxJava2 - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы буферизовать изображение из уведомления BLE.Я получаю массив длиной 20 байт в каждом уведомлении.(Пауза между уведомлениями составляет 15-20 мс.) Они идут последовательно, и я могу распознать первый и последний пакет изображения.Изображения приходят один за другим.

Моя проблема в том, что я не знаю, как реализовать это в RxJava2.У меня очень плохое решение, как вы видите ниже.Это работает, но иногда отправка изображений прерывается, поэтому я не получаю последний пакет, а новое изображение смешивается со старым.

Я бы хотел буферизовать в зависимости от значения байтового массива из первого пакетадо последней посылки.

Observable<byte[]> obs = notificationObservable()
.map(notification -> {
    return notification.getBytes();
});

disposables.add(notificationObservable()
.map(notification -> {
    return notification.getBytes();
})
.buffer(obs.delay(10, TimeUnit.MILLISECONDS)
    .filter(bytes -> {
        return bytes[2] < 0; //last package
    })
)
.map(bytes -> new MyImage(bytes))
.subscribe(
    imageSubject::onNext,
    imageSubject::onError,
    imageSubject::onComplete));

1 Ответ

0 голосов
/ 31 мая 2018

В таких случаях я обычно готовлю класс строителя, который обрабатывает детали.

См. Следующий пример:

class ImageBuilder {

    private final List<byte[]> parts = new ArrayList<>();

    public ImageBuilder append(byte[] part) {
        if (!isReady()) {
            parts.add(part);
            return this;
        } else {
            ImageBuilder builder = new ImageBuilder();
            return builder.append(part);
        }
    }

    public boolean isReady() {
        byte[] part = parts.get(parts.size() - 1);
        return part[2] < 0;
    }

    public MyImage build() {
        // take the parts and build your image
        return MyImage.buildFrom(parts);
    }

}

Затем вы можете использовать его следующим образом:

Observable<byte[]> bytePartObservable = ...;

Observable<MyImage> images = bytePartObservable
    .scan(new ImageBuilder(), ImageBuilder::append)
    .filter(ImageBuilder::isReady)
    .map(ImageBuilder::build);

images.subscribe( ... )
...