Подключения Google Nearby - невозможно передавать большие байты между двумя устройствами

Когда я пытаюсь отправить объект с несколькими изображениями (преобразованными в строку с использованием Base64) в качестве типа STREAM, из метода onPayloadTransferUpdate() я вижу результат «Ошибка», и устройства (проверено только при подключении 2 устройств) автоматически отключаются после что. Подключения Google Nearby не подходят для отправки больших байтов?


person Karthik    schedule 27.05.2018    source источник


Ответы (2)


Соседние соединения должны быть в состоянии справиться с этим. Для полезной нагрузки STREAM нет явного ограничения размера.

Я бы предложил разделить байты на части (например, отправить пару КБ за раз) и посмотреть, поможет ли это. Вы можете попасть в странные ситуации, когда отправляете целые файлы сразу, потому что он дважды загружает байты в память (один раз внутри вашего приложения и один раз внутри процесса Nearby), что может вызвать ошибки нехватки памяти. Binder, уровень межпроцессного взаимодействия в Android, также имеет ограниченный буфер для отправки данных между процессами.

Вы также можете сохранить его как временный файл и отправить в качестве полезной нагрузки FILE, и в этом случае мы выполним фрагментацию для вас.

Отказ от ответственности: я работаю над Nearby Connections.

person Xlythe    schedule 28.05.2018
comment
хорошо, спасибо. На самом деле, когда я использую стратегию P2P_STAR, перевод работает идеально для любого размера. Для моего приложения мне просто нужно общение 1-1 в любой момент, поэтому я использую P2P_STAR, поскольку это решает мою проблему! - person Karthik; 30.05.2018
comment
Похоже, что передача заняла очень много времени, и более высокие скорости STAR помогли. Рассмотрите возможность использования POINT_TO_POINT, если вам нужно только одно соединение за раз. - person Xlythe; 31.05.2018

1) Вам не нужно кодировать данные с помощью Base64 ради Nearby Connections — ваш STREAM может иметь необработанные двоичные данные, и это будет работать нормально.

2) Насколько велики эти данные, которые вы отправляете, и с каким смещением в байтах (это можно увидеть в PayloadTransferUpdate, который вы получаете с помощью Status.ERROR), происходит сбой? Похоже, ваши устройства просто отключаются.

3) Какую стратегию вы используете?

4) Если у вас все еще продолжается обнаружение (т. е. вы не вызвали stopDiscovery()), попробуйте остановить его, а затем отправить полезную нагрузку — обнаружение — это тяжеловесная операция, которая может затруднить надежное поддержание соединений между устройствами в течение длительных интервалов.

person Varun Kapoor    schedule 28.05.2018
comment
Для моего приложения легко работать с кодировкой Base64, поэтому я использовал ее. Во-вторых, данные, которые я пытаюсь отправить, составляют почти 20 МБ, для типа потока он не показывает общий размер, а показывает -1. Я использовал стратегию P2P_CLUSTER. Как только соединение установлено, я прекращаю и рекламу, и обнаружение. Тем не менее, простым решением было преобразовать топологию P2P_STAR, вся передача работает отлично, когда я использую эту. Поскольку мне нужно общение 1-1 в любое время, я выбираю это решение - person Karthik; 30.05.2018
comment
Спасибо, что ответил на мои вопросы, Картик. Общий размер STREAM всегда равен -1, потому что мы не всегда можем знать общий размер данных, которые передаются (потенциально) в реальном времени, но, к вашему сведению, вы можете получить количество байтов, переданных на данный момент. @Xlythe сказал все остальное, что я собирался сказать об использовании P2P_POINT_TO_POINT, в своем комментарии ниже, поэтому обязательно рассмотрите возможность его использования. :) - person Varun Kapoor; 31.05.2018