Ближайший API - организация очередей полезных нагрузок. - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть сценарий использования, когда я отправляю данные управления с устройства AndroidThings на мобильный телефон Android - это периодическое считывание напряжения 10 раз в секунду, то есть каждые 100 миллисекунд. Но так как это функция API Nearby - учитывая отправку полезных нагрузок:

Отправители используют метод sendPayload () для отправки полезной нагрузки. Этот метод может вызываться несколько раз, но, поскольку мы гарантируем доставку по заказу, вторая полезная нагрузка будет помещена в очередь для отправки до тех пор, пока не будет выполнена первая полезная нагрузка.

То, что в действительности происходит в моем случае, основано на том факте, что скорость передачи изменяется, я получаю показания на телефоне с задержкой, которая увеличивается, просто очередь становится все больше и больше.

Есть идеи как это побороть? В основном мне не нужна доставка по заказу. Моя первая идея - иметь какое-то подтверждение доставки полезной нагрузки, и только после подтверждения получения вторая полезная нагрузка должна быть отправлена ​​получателю.

Спасибо за идеи

ОБНОВЛЕНИЕ:

Тип полезной нагрузки STREAM является идеальным решением. Если InputStream передает более одного набора показаний (считывание входного напряжения, максимальное напряжение и т. Д. Всего 32 байта данных), тогда я использую метод пропуска, чтобы пропустить до самых последних показаний.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

В вашем случае я бы порекомендовал использовать STREAM Payload , и тогда вы сможете продолжать потоковую передачу своих управляющих данных по этой единственной полезной нагрузке - это как раз один из вариантов использования, для которого мысоздал стрим.:)

0 голосов
/ 20 ноября 2018

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

Я бы построил класс, который кеширует «последнее напряжение». По мере получения новых показаний это значение будет перезаписываться каждый раз.

private volatile Long mostRecentVoltage;

public void updateVoltage(long voltage) {
  if (mostRecentVoltage != null) {
    Log.d(TAG, String.format("Dropping voltage %d due to poor network latency", mostRecentVoltage));
  }
  mostRecentVoltage = voltage;
}

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

@Nullable
public Long getVoltage() {
  try {
    return mostRecentVoltage;
  } finally {
    mostRecentVoltage = null;
  }
}
...