Nearby Connections 2.0中的错误代码

时间:2017-09-04 11:37:35

标签: android bluetooth google-nearby

我一直在尝试新的Android Nearby Connections v2.0 API。我的大多数设备现在可以在大多数时间互相交谈,但在尝试连接时我也会收到很多error codes。检查我的程序中的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

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

2 个答案:

答案 0 :(得分:3)

[免责声明:我在附近的连接上工作]我可以尝试帮忙。

STATUS_ALREADY_CONNECTED_TO_ENDPOINT:如果您拨打' requestConnection'而您有任何挂起(onConnectionInitiated)或已建立(onConnectionResult)连接到给定端点。将您的日志语句提前移动到onConnectionInitiated,您应该看到我们抛出此错误的原因。

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

STATUS_ENDPOINT_IO_ERROR:我们失去了与其他设备的连接。这可能由于各种原因而发生(它们可能走得太远,蓝牙不稳定,设备停止响应等)。如果您在连接时发现,请避免这种情况。手机上的发现很难,最多会降低带宽,导致连接断线最坏。

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

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

如果您继续发现问题,请告诉我们您正在使用的设备,我们一定要将它们添加到我们的测试套件中。

答案 1 :(得分:0)

我只想补充一点,调用API时可能需要有一个简短的客户端名称字符串。

,例如Nearby.Connections.requestConnection(googleApiClient, shortNameHere,....)

我一直使用UUID.randomUUID()。toString()生成我自己的客户端名称,这似乎导致了STATUS_BLUETOOTH_ERROR。 我所做的就是更改代码示例以使用UUID名称并使用P2P_CLUSTER,我收到了该错误。

这是关于STATUS_BLUETOOTH_ERROR的解决方案。