草庐IT

android - Nearby Connections 2.0 : Both sides request connections, 但连接不成功

coder 2023-12-29 原文

我正在尝试使用新的 Android Nearby Connections v2.0具有 P2P_CLUSTER 连接策略的 API。以下问题(其中两个设备都请求连接,但未成功连接)似乎发生在运行 Android K-N 的各种设备上。有时代码会获得成功的持久连接……有时不会。

在这个场景中,双方都在广播和发现,双方互相发现对方,双方都发送连接请求(但不发起连接)。很难用特定的测试用例使这种情况可靠地发生,但它确实发生了。

使用 Android Monitor,我从一个方面捕获了有关此场景的详细信息,并在下面列出了事件序列。在这个特定的 session 中,我监控的设备是一款非常便宜的 KitKat 手机,远程端点是三星 Lollipop 平板电脑(以防万一)。

  • 发现远程节点,我们发出requestConnection
  • 紧接着,Android Monitor 显示此错误:

    09-28 11:49:38.706 17321-17823/? E/NearbyConnections: In startClient(), UKEY2 failed with endpoint AqXW
                                                      java.io.IOException: bt socket closed, read return: -1
                                                          at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:647)
                                                          at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                          at java.io.InputStream.read(InputStream.java:162)
                                                          at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:149)
                                                          at java.io.BufferedInputStream.read(BufferedInputStream.java:295)
                                                          at libcore.io.Streams.readFully(Streams.java:81)
                                                          at java.io.DataInputStream.readInt(DataInputStream.java:103)
                                                          at xkj.c(:com.google.android.gms@11509230:1)
                                                          at xkg.run(:com.google.android.gms@11509230:8)
                                                          at mng.run(:com.google.android.gms@11509230:25)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                          at mso.run(:com.google.android.gms@11509230)
                                                          at java.lang.Thread.run(Thread.java:818)
    

  • 紧接着,它会触发 requestConnection 的 ResultCallback,返回 STATUS_ENDPOINT_IO_ERROR (8012)。

  • 接下来,由于 requestConnection 返回错误,我们停止发现,等待 3 秒,然后再次开始发现。
  • 我们重新启动发现后的下一条跟踪消息是来自 NearbyConnections 的:

    09-28 11:49:46.333 17321-17412/? E/NearbyConnections: onIncomingConnection() for client 308946494 failed to initialize the connection with IkFxWFf_F-sAAAAAAAAAHHA_I2pIK25WaixTQEZSNHtVbmtub3duIFVzZXI
                                                      java.io.IOException: Failed to read ConnectionRequestFrame
                                                          at xjj.a(:com.google.android.gms@11509230:61)
                                                          at xlr.run(:com.google.android.gms@11509230:12)
                                                          at mng.run(:com.google.android.gms@11509230:25)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                          at mso.run(:com.google.android.gms@11509230)
                                                          at java.lang.Thread.run(Thread.java:818)
                                                       Caused by: java.io.IOException: bt socket closed, read return: -1
                                                          at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:647)
                                                          at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
                                                          at java.io.InputStream.read(InputStream.java:162)
                                                          at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:149)
                                                          at java.io.BufferedInputStream.read(BufferedInputStream.java:295)
                                                          at libcore.io.Streams.readFully(Streams.java:81)
                                                          at java.io.DataInputStream.readInt(DataInputStream.java:103)
                                                          at xkj.c(:com.google.android.gms@11509230:1)
                                                          at xjj.a(:com.google.android.gms@11509230:56)
                                                          at xlr.run(:com.google.android.gms@11509230:12) 
                                                          at mng.run(:com.google.android.gms@11509230:25) 
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                                                          at mso.run(:com.google.android.gms@11509230) 
                                                          at java.lang.Thread.run(Thread.java:818)
    

  • 我猜上述错误是由另一端的 requestConnection 触发的?如果我们没有那个错误,它会转到我的 onConnectionInitiated 回调吗? (澄清一下:它没有命中我的 onConnectionInitiated 回调。)

  • 接下来,我再次发现另一个节点,并再次requestConnection

  • 在此之后,我立即看到来自 NearbyConnections 的以下(不同的)错误消息:

    09-28 11:51:14.639 17321-17412/? E/NearbyConnections: sendConnectionRequest() for client 308946494 failed to initialize the connection with endpoint AqXW
                                                      xjx: In connectImpl(), failed to connect to Bluetooth device 28:BE:03:0C:F1:5B for endpoint AqXW
                                                          at xlo.a(:com.google.android.gms@11509230:126)
                                                          at xjs.run(:com.google.android.gms@11509230:12)
                                                          at mng.run(:com.google.android.gms@11509230:25)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                                                          at mso.run(:com.google.android.gms@11509230)
                                                          at java.lang.Thread.run(Thread.java:818)
    

  • 接下来,我们使用 STATUS_BLUETOOTH_ERROR (8007)

  • 命中 requestConnection 的 ResultCallback
  • 在此之后,我看到了设备 connect then auto-disconnect , 重复了几次。他们从未获得成功的持久连接,尽管我已经看到这种情况发生在一堆错误之后。

最佳答案

那是同时发生的连接冲突;如果您有 2 个设备同时相互连接,则在第二个设备在两个设备上触发 onConnectionInititated() 之前,Nearby Connections 将(随机)使其中一个设备的 requestConnection() 失败。这就是为什么您会在第一个日志中看到“java.io.IOException:bt 套接字已关闭,读取返回:-1”。

如果不是因为 STATUS_BLUETOOTH_ERROR 失败,您应该会看到两个设备成功连接。

关于android - Nearby Connections 2.0 : Both sides request connections, 但连接不成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46510187/

有关android - Nearby Connections 2.0 : Both sides request connections, 但连接不成功的更多相关文章

随机推荐