Коды ошибок в Nearby Connections 2.0

Я экспериментировал с новым Android Nearby Connections v2.0 API. Большинство моих устройств теперь могут общаться друг с другом большую часть времени, но я также получаю много кодов ошибок при попытке подключения. проверка status.getStatusCode() внутри моей программы я вижу следующие коды возврата:

  • STATUS_ALREADY_CONNECTED_TO_ENDPOINT (8003)
  • STATUS_BLUETOOTH_ERROR (8007)
  • STATUS_ENDPOINT_IO_ERROR (8012)
  • STATUS_ERROR (13)

Мне трудно разобраться в этом. Первый код ошибки кажется самоочевидным, за исключением того, что я вижу его в тех случаях, когда я не нажал на обратный вызов onConnectionResult с кодом возврата "SUCCESS" по обе стороны от предполагаемого соединения. Мой текущий код полон операторов трассировки, и я вижу записи в журналах, если эти обратные вызовы были достигнуты. Поэтому, возможно, устройства подключены на каком-то более низком уровне, но если это так, код более высокого уровня не всегда слышит об этом.

Я предполагаю, что STATUS_BLUETOOTH_ERROR указывает на ошибку Bluetooth на стороне, которая регистрирует его, в то время как STATUS_ENDPOINT_IO_ERROR указывает на ошибку (возможно, с Bluetooth) на другом конце? Можно ли получить более подробную информацию? Состояние STATUS_ERROR (13), которое я вижу время от времени, звучит как код ошибки, который программист использовал бы для тех моментов "WTF, мы никогда не должны попадать сюда", но без доступа к исходному коду я могу только догадываться.

Обратите внимание, что я вижу эти ошибки между устройствами, которые красиво общаются друг с другом в другое время, используя тот же код. Иногда, если код повторяется достаточно много раз, он в конечном итоге получает стабильное соединение. Иногда он подключается и мгновенно отключается от другого конца. Иногда я просто получаю бесконечный поток повторяющихся сообщений об ошибках (STATUS_BLUETOOTH_ERROR и / или STATUS_ENDPOINT_IO_ERROR).

Я использую Nearby Connections со стратегией подключения P2P_CLUSTER, Эти проблемы чаще всего случаются, когда обе стороны занимаются как рекламой, так и открытием. Однако я написал две меньшие программы, которые специализируются либо на рекламе, либо на обнаружении, и иногда они тоже получают эти ошибки (но реже).

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

09-04 22:54:40.070 3866-3924/? W/NearbyConnections: Cannot deserialize BluetoothDeviceName: expecting min 16 raw bytes, got 6

Я предполагаю, что это потому, что Nearby Connections использует свои собственные короткие токены (например, ZGbx) вместо названия устройства Bluetooth? Я совсем не уверен в этом. И в любом случае, если это собственные специальные токены Nearby Connections, то почему он будет выдавать предупреждающие сообщения об этом?

2 ответа

Решение

[Отказ от ответственности: я работаю над Близлежащими Соединениями], я могу попытаться помочь.

STATUS_ALREADY_CONNECTED_TO_ENDPOINT: это происходит, если вы вызываете 'requestConnection', когда у вас есть какие-либо ожидающие (onConnectionInitiated) или установленные (onConnectionResult) подключения к данной конечной точке. Переместите ваши операторы журнала ранее, в onConnectionInitiated, и вы должны увидеть, почему мы выдаем эту ошибку.

STATUS_BLUETOOTH_ERROR: Что-то пошло не так с Bluetooth. Телефон, вероятно, в плохом состоянии. Это (надеюсь) не должно случаться слишком часто. Но если вы действительно хотите исправить ситуацию, прекратите рекламу и обнаружение, прежде чем пытаться повторить запрос на соединение. Ближайшие соединения будут переключать Bluetooth при обнаружении этой ошибки, но только если ничего не происходит.

STATUS_ENDPOINT_IO_ERROR: мы потеряли связь с другим устройством. Это может произойти по разным причинам (они могли зайти слишком далеко, Bluetooth не работал, устройство перестало отвечать и т. Д.). Если вы обнаруживаете, пока у вас есть связи, избегайте этого. Обнаружение может быть трудным для телефона и в лучшем случае уменьшает пропускную способность, а в худшем - обрывает соединение.

STATUS_ERROR: что-то пошло не так, что не вписывается в другие коды ошибок. Это всеобъемлющее. Чаще всего это возвращается в onConnectionResult(FAILED), чтобы уведомить вас о том, что что-то пошло не так между onConnectionInitiated и ожиданием того, что обе стороны примут соединение.

Мы также снизили уровень серьезности журнала "Невозможно десериализовать BluetoothDeviceName" в следующем выпуске, поскольку это не является предупреждением. Это как ты сказал; ожидаемое поведение, когда мы видим не находящиеся рядом устройства во время обнаружения.

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

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

Например, Nearby.Connections.requestConnection(googleApiClient, shortNameHere,....)

Я генерировал свое собственное имя клиента с помощью UUID.randomUUID(). ToString(), и это, казалось, вызвало STATUS_BLUETOOTH_ERROR, Все, что я сделал, это изменил пример кода, чтобы использовать имя UUID и P2P_CLUSTER, и я получил эту ошибку.

Это было решение для меня относительно STATUS_BLUETOOTH_ERROR,

Другие вопросы по тегам