Nearby Connections 2.0中的错误代码

Rap*_*kle 7 android bluetooth google-nearby

我一直在尝试新的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)

我很难理解这些.第一个错误代码似乎是不言自明的,只是在我没有在所谓的连接的任何一侧用"SUCCESS"返回代码命中onConnectionResult回调的情况下我看到它.我当前的代码中充满了跟踪语句,如果已经达到这些回调,我会看到日志记录条目.因此,设备可能在较低级别连接,但如果是这样,则更高级别的代码并不总能听到它.

我猜测STATUS_BLUETOOTH_ERROR表示记录它的一侧有蓝牙错误,而STATUS_ENDPOINT_IO_ERROR表示另一端有错误(可能涉及蓝牙)?是否有可能获得更多细节?我偶尔看到的STATUS_ERROR(13)状态听起来像是程序员用于那些"WTF,我们永远不会到达这里"的错误代码,但是如果没有访问源代码,我只能猜测.

请注意,我在其他时间使用相同代码精确地相互通信的设备之间会看到这些错误.有时,如果代码重试的次数足够多,它最终会获得稳定的连接.有时它会连接并立即从另一端断开连接.有时我只是得到了无休止的重复错误消息(STATUS_BLUETOOTH_ERROR和/或STATUS_ENDPOINT_IO_ERROR).

我正在使用附加连接与连接策略P2P_CLUSTER.当双方同时做广告和发现时,这些问题似乎最常发生.但是,我写了两个较小的程序,专门从事广告或发现,他们有时也会得到这些错误(但不常见).

在跟踪消息中,我还注意到来自Nearby Connections的大量警告消息如下所示:

09-04 22:54:40.070 3866-3924/? W/NearbyConnections: Cannot deserialize BluetoothDeviceName: expecting min 16 raw bytes, got 6
Run Code Online (Sandbox Code Playgroud)

我猜这是因为Nearby Connections使用自己的短令牌(比如ZGbx)而不是设备的蓝牙名称?不过,我对此并不确定.无论如何,如果这些是Nearby Connections自己的特殊令牌,那为什么会发出有关它的警告信息呢?

Xly*_*the 8

[免责声明:我在 Nearby Connections 工作] 我可以尝试提供帮助。

STATUS_ALREADY_CONNECTED_TO_ENDPOINT:如果您在与给定端点有任何挂起 (onConnectionInitiated) 或已建立 (onConnectionResult) 连接时调用“requestConnection”,则会发生这种情况。将您的日志语句更早地移至 onConnectionInitiated,您应该会明白为什么我们会抛出此错误。

STATUS_BLUETOOTH_ERROR:蓝牙出现问题。手机可能处于不良状态。这(希望)不应该经常发生。但是,如果您真的想要修复,请在重新尝试 requestConnection 之前停止广告和发现。Nearby Connections 会在检测到此错误时切换蓝牙,但前提是没有其他任何事情发生。

STATUS_ENDPOINT_IO_ERROR:我们失去了与其他设备的连接。发生这种情况的原因有多种(他们可能走得太远、蓝牙不稳定、设备停止响应等)。如果您在有联系时发现,请避免这种情况。在电话上发现可能很困难,充其量会减少带宽,最坏的情况会导致连接断开。

STATUS_ERROR:出现了不适合其他错误代码的错误。这是一个包罗万象的。这通常在 onConnectionResult(FAILED) 中返回,以通知您在 onConnectionInitiated 和等待双方接受连接之间出现问题。

我们还在即将发布的版本中降低了“无法反序列化 BluetoothDeviceName”的日志严重性,因为它并不是真正的警告。就像你说的;当我们在发现时看到非附近连接设备时的预期行为。

如果您仍然看到问题,请告诉我们您使用的设备,我们一定会将它们添加到我们的测试套件中。

  • 非常感谢!我目前在我的代码中都有日志语句,所以我将根据这些新信息重新检查我的日志,看看是否出现了模式。从内存中,一个非常常见的模式是 STATUS_BLUETOOTH_ERROR 紧随其后(在下一次重试时)和 STATUS_ALREADY_CONNECTED_TO_ENDPOINT(没有成功命中 onConnectionResult)。在重试之间添加延迟没有帮助。您是否建议我停止对每个 STATUS_BLUETOOTH_ERROR 的发现和/或广告?如果是这样,我应该在重新启动之前延迟吗? (2认同)
  • 唔。这可能是同时发生的连接冲突;如果您有 2 个设备同时相互连接,我们将(随机)在第二个设备在两个设备上触发 onConnectionInititated() 之前(随机)使设备的 requestConnection() 失败。不过,我们使用 IO_ERROR 来解决这个问题,而不是 BLUETOOTH_ERROR...是的,对 BLUETOOTH_ERROR 的有效修复是停止发现/广告,然后重试 requestConnection()。 (2认同)