Подключения Google поблизости — отправка полезной нагрузки не работает после повторного подключения несколько раз

Я хочу создать оффлайн многопользовательскую игру для Android, поэтому мне нужна надежная p2p-связь между устройствами. Соединения Google поблизости работают нормально, но я обнаружил одну проблему. Настройка стандартная — устройство A объявляет, устройство D обнаруживает и подключается к A. Затем D отключается, снова обнаруживает и снова подключается. После одной-десяти итераций D все еще может подключаться к A и получать данные от A, но больше не может отправлять данные. Я вызываю sendPayload с Payload.fromBytes, получаю onSuccessCallback, но A не получает эту полезную нагрузку. Позже D получает onPayloadTransferUpdate с кодом состояния 2. Дальнейшие переподключения не решают проблему. Единственное, что надежно решает проблему, это перезагрузка.

Некоторые журналы:

03-21 12:20:25.827 30317-30317/com.alienff.ntest I/Log: [21.03.2018 12:20:25.827] [main] MainActivity: sending payload -5864147190526311071
03-21 12:20:25.841 30317-30317/com.alienff.ntest I/Log: [21.03.2018 12:20:25.841] [main] MainActivity: payload cent
...
03-21 12:21:16.925 3066-3215/? D/WifiStateMachine: Current network is: "___mm___", ID: 0 03-21 12:21:16.926 3066-3215/? D/WifiStateMachine: Текущая сеть все еще квалифицирована из-за интенсивного трафика, txSuccessRate=2.1973258256066233 rxSuccessRate=0.0 03-21 12:21:  16.926 3066-3215/?D/WifiStateMachine: Текущая сеть 5ГГц, выручайте... 03-21 12:21:17.408 4049-4049/?D/io_stats: !@ 179,0 r 906136 23065676 w 370340 7270584 5 d 4670584 d 4670584  2438912 f 147311 147270 iot 680350 657112 th 51200 0 0 pt 0 inp 0 0 55938.769 03-21 12:21:17.571 10176-30596/?  - метаданные {service_id: 0} 03-21 12:21:17.576 10176-30596/?W/NearbyConnections: Неожиданный вызов PhysicalConnectionClosed() для среды WIFI_LAN без соответствующего установленного соединения, которое было ранее открыто. -- metadata{service_id: 0}  03-21 12:21:17.579 10176-30596/?W/NearbyConnections: NearbyRecorder не ожидал больше активных физических подключений, прежде чем регистрировать это  подключение конечной точки.  -- метаданные { service_id: 0 } 03-21 12:21:17.585 3336-3929/?  E/BluetoothRemoteDevices: setRfcommConnected false 03-21 12:21:17.586 30317-30317/com.alienff.ntest I/Log: [21.03.2018 12:21:17.586] [main] MainActivity: onPayloadTransferUpdate.  endpointId: 7oRz payloadId: -5864147190526311071 bytesTransferred: 0 status: 2 03-21 12:21:17.597 30317-30317/com.alienff.ntest I/Log: [21.03.2018 12:21:17.596] [main] MainActivity: onDisconnected  : 7oRz

Знаете ли вы, как сделать так, чтобы близлежащие соединения Google надежно переподключались? Благодарю вас!


person Mikhail Sokolov    schedule 19.03.2018    source источник


Ответы (1)


Я не видел этого раньше, так что я хочу, чтобы вы сделали для меня некоторую отладку.

  1. Дайте мне названия моделей всех устройств, на которых вы можете это воспроизвести.
  2. Сообщите мне, какой тип полезной нагрузки (BYTE, FILE, STREAM) вы отправляете.
  3. Воспроизведите эту ошибку при запуске logcat. Найдите теги журнала «NearbyConnections» и «NearbyMediums». Дайте мне знать, если вы видите какие-либо ошибки/предупреждения.
  4. Воспроизведите эту ошибку, а затем принудительно завершите свое приложение. Подождите 45 секунд. Вы должны увидеть, как Wi-Fi/Bluetooth выключается/включается. Снова откройте приложение и попробуйте воспроизвести снова.

Текущее мнение: код состояния 2: "PayloadTransferUpdate.Status.FAILURE". Обычно за этим сразу же следует отключение, потому что предполагается, что сокет сломан. Тем не менее, не похоже, что розетка испортилась. Вы по-прежнему получаете данные, и внутри мы отправляем шквал управляющих сообщений через сокет при подключении, и все они проходят успешно, иначе вы не получите onConnectionResult. Это означает, что что-то не так с самой полезной нагрузкой; либо на вашей стороне, либо на нашей. Я подозреваю, что вы отправляете полезную нагрузку FILE или STREAM, потому что я не знаю, как может произойти сбой полезной нагрузки BYTE. Полезная нагрузка FILE может завершиться ошибкой, если файл был перемещен или ParcelFileDescriptor стал недействительным. Полезные нагрузки STREAM могут завершиться ошибкой, если сокет/ParceFileDescriptor закрыт или собран мусор.

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

person Xlythe    schedule 20.03.2018
comment
Позвольте мне быстро ответить на некоторые вопросы. 1. Samsung A5 2017, Samsung galaxy s3 duos 2. Использую БАЙТ, как и сказал в своем вопросе :) Для остальных сделаю это завтра. - person Mikhail Sokolov; 21.03.2018
comment
Ах, черт. Это БАЙТ? Интересно, что может пойти не так... Не могли бы вы также посмотреть номер версии сервисов Google Play (в «Настройки» > «Приложения»)? И как только вы окажетесь в плохом состоянии, можете ли вы поддерживать связь устройств, ничего не отправляя в течение ~ 30 секунд? - person Xlythe; 21.03.2018
comment
Я добавил журналы к вопросу. Это то, что у меня есть до сих пор. Видимо, это не так просто воспроизвести, как я думал. Все еще пытаюсь выяснить, что именно вызывает эту проблему. - person Mikhail Sokolov; 21.03.2018
comment
Версия Сервисов Google Play: 12.2.21 (448-188803320). Когда я был в плохом состоянии, я не отправлял никаких данных около 2 минут, затем я отправил данные из A в D (пришли) и из D в A (не пришли, а также не было вызвано onPayloadTransferUpdate. Обычно, когда D не удалось для отправки данных он получает onPayloadTransferUpdate со статусом 2, а затем отключается.) - person Mikhail Sokolov; 21.03.2018
comment
Судя по журналам, похоже, что мы каким-то образом попали в плохое состояние. Это нехорошо... Я напишу для этого тестовый пример и, надеюсь, смогу воспроизвести его локально. - person Xlythe; 21.03.2018
comment
Наверняка для воспроизведения этого требуется что-то еще, кроме простого подключения-отключения. Я не могу точно определить, что именно... - person Mikhail Sokolov; 21.03.2018