Conexiones cercanas 2.0: Ambas partes solicitan conexiones, pero no se conectan con éxito

Estoy tratando de usar el nuevoConexiones cercanas de Android v2.0 API con elP2P_CLUSTER estrategia de conexión. El siguiente problema (en el que ambos dispositivos solicitan conexiones, pero no se conectan correctamente) parece ocurrir en una variedad de dispositivos que ejecutan Android K-N. A veces, el código obtiene una conexión persistente exitosa ... A veces no.

En este escenario, ambas partes anuncian y descubren, ambas partes se descubren y ambas partes envían solicitudes de conexión (pero la conexión no se inicia). Es difícil hacer que esta situación suceda de manera confiable con un caso de prueba específico, pero sucede.

Usando Android Monitor, capturé información detallada sobre cómo se ve este escenario desde un lado, y enumeré la secuencia de eventos a continuación. En esta sesión en particular, el dispositivo que estaba monitoreando era un teléfono KitKat muy barato, y el punto final remoto era una tableta Samsung Lollipop (en caso de que sea relevante).

Se descubre el nodo remoto y emitimosrequestConnection

Inmediatamente después, Android Monitor muestra este error:

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)

Inmediatamente después de eso, golpea el ResultCallback de requestConnection, conSTATUS_ENDPOINT_IO_ERROR (8012).

A continuación, porque elrequestConnection devolvió un error, detenemos el descubrimiento, esperamos 3 segundos y luego iniciamos el descubrimiento nuevamente.

El siguiente mensaje de rastreo después de reiniciar el descubrimiento es este de 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)

Supongo que el error anterior se activó desde una requestConnection desde el otro lado. Y si no hubiéramos tenido ese error, habría ido a mionConnectionInitiated ¿llamar de vuelta? (Solo para aclarar: no golpeó mionConnectionInitiated llamar de vuelta.)

Luego, nuevamente descubro el otro nodo, yrequestConnection una vez más.

Inmediatamente después de esto, veo el siguiente mensaje de error (diferente) de 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)

A continuación, presionamos ResultCallback de requestConnection conSTATUS_BLUETOOTH_ERROR (8007)

Después de esto, vi los dispositivos.conectar y luego desconectar automáticamente, que repitió varias veces. Nunca obtuvieron una conexión persistente exitosa, aunque he visto que esto sucede después de un montón de errores.

Respuestas a la pregunta(1)

Su respuesta a la pregunta