【问题标题】:Nearby Connections 2.0: Successful connection, immediately followed by disconnectionNearby Connections 2.0:连接成功,紧接着断开连接
【发布时间】:2017-10-02 21:07:38
【问题描述】:

我正在尝试将 Nearby Connections 2.0 与 P2P_CLUSTER 连接策略一起使用,但在让我的设备连接并保持连接时遇到问题。根据我的跟踪日志,看起来设备连接成功,然后立即断开连接。

请注意,它有时也会成功运行相同的代码,然后保持连接。我不知道是什么让它有时工作而有时失败,而且我不知道为什么节点会自动断开连接。但是,我确定我的代码中没有发出“断开连接”。它来自较低级别的东西。

这是我目前看到的一系列事件:

  • 我们发现另一个节点(即,点击 onEndpointFound 回调),然后发出 requestConnection
  • 我们为那个端点点击了onConnectionInitiated。 (在这里检查 info.isIncomingConnection() ,这似乎是对我们自己的请求的响应,还是在其他地方发起的请求。)
  • 我们发出acceptConnection(并将我们的状态移至PENDING)
  • 我们点击了“成功”状态的onConnectionResult。一切都很好(双方都认为他们是有联系的)。
  • 紧接着,我们点击了断开连接(双方都进入了未知状态)

更新:在 acceptConnection 之前添加了 200 毫秒的延迟

这是一个很大的改进,现在这些设备几乎总能建立成功(且持久)的连接。但是,有时需要 2-3 次尝试。

例如,当运行一个简单的测试用例(使用一个广告设备和一个发现设备,并且没有复杂因素)时,会发生以下情况。从 Discoverer 的角度来看,它看起来像这样:

  • 我们点击onEndpointFoundrequestConnection
  • 我们为我们请求的连接点击onConnectionInitiated,然后接受它
  • 我们点击onConnectionResult 连接成功。
  • 不久之后,我们点击了onDisconnected
  • 我们停止发现,等待 3 秒,重新开始发现
  • 我们再次执行上述所有操作,再次断开连接

但是通过第三次连接过程,我们得到了一个很好的持久连接,并且能够可靠地发送和接收数据。

更新:广告商端的异常导致断开连接?

我发现了一长串这样的自动断开连接。每次,广告商在断开连接之前都会出现此异常。

10-09 19:17:26.365 29232-29232/? E/SearchServiceStarter: Task 174 failed or timed out. Client 128565203126930423 disconnecting from SearchService!
                                                     java.util.concurrent.CancellationException: Task was cancelled.
                                                         at com.google.common.util.concurrent.d.cp(SourceFile:75)
                                                         at com.google.common.util.concurrent.d.get(SourceFile:57)
                                                         at com.google.common.util.concurrent.cj.n(SourceFile:2)
                                                         at com.google.common.util.concurrent.ay.l(SourceFile:50)
                                                         at com.google.common.util.concurrent.ba.run(SourceFile:5)
                                                         at com.google.android.apps.gsa.shared.util.concurrent.a.bc.run(SourceFile:2)
                                                         at android.os.Handler.handleCallback(Handler.java:808)
                                                         at android.os.Handler.dispatchMessage(Handler.java:103)
                                                         at android.os.Looper.loop(Looper.java:193)
                                                         at android.app.ActivityThread.main(ActivityThread.java:5299)
                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:831)
                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
                                                         at dalvik.system.NativeStart.main(Native Method)

这是否有助于您诊断问题?

【问题讨论】:

    标签: android bluetooth google-nearby


    【解决方案1】:

    哎呀!这是附近连接中的竞争条件。它已在下一个即将发布的版本中修复。作为临时修复,将您的接受连接延迟一小段时间(约 100 毫秒?)。

    编辑:这应该从 Google Play 服务 11.6.0 开始修复

    【讨论】:

    • 自动断开连接的发生频率似乎要低得多(并且在重试时恢复得更好),延迟时间为 100 毫秒,但有时仍会发生。我应该尝试更长的延迟吗?还是可能有其他问题?
    • 如果您仍然看到它,是的,更长的延迟应该会有所帮助。
    • 延迟增加到 200 毫秒。有关详细信息,请参阅更新后的帖子。
    • 我很高兴延迟有所帮助!至于剩下的几个断线,请检查 logcat 是否有错误。应该有一个一致的“解析失败”异常,将竞态条件暴露为断开连接的原因。如果您看到其他例外情况,请告诉我 :) 顺便说一句,我们有一个 beta 程序,您可以在其中获取最新的 Play 服务更新(包含所有修复),然后再公开发布。如果你有兴趣,我只需要一个绑定到手机的 Gmail 地址。 (StackOverflow 有 PM 系统吗?)
    • 有没有办法让我的程序中的低级异常和错误消息得到通知?我可以显示我自己的消息日志,但只能在我使用 Android Monitor 监控的一侧看到较低级别的 NearbyConnections 消息(而且我只有一份 Android Studio。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2016-11-13
    • 1970-01-01
    • 2016-08-21
    • 2014-07-17
    相关资源
    最近更新 更多