Если бы не было сбоев STATUS_BLUETOOTH_ERROR, вы должны увидеть, как два устройства успешно подключились.
аюсь использовать новыйAndroid Nearby Connections v2.0 API сP2P_CLUSTER
Стратегия подключения. Следующая проблема (при которой оба устройства запрашивают соединения, но не соединяются успешно), по-видимому, возникает на разных устройствах под управлением Android K-N. Иногда код получает успешное постоянное соединение ... Иногда нет.
В этом сценарии обе стороны рекламируют и обнаруживают, обе стороны обнаруживают друг друга, и обе стороны отправляют запросы на соединение (но соединение не инициировано). Трудно создать надежную ситуацию с конкретным контрольным примером, но это случается.
Используя Android Monitor, я получил подробную информацию о том, как этот сценарий выглядит с одной стороны, и перечислил последовательность событий ниже. В этом конкретном сеансе устройство, которое я наблюдал, было очень дешевым телефоном KitKat, а удаленной конечной точкой был планшет Samsung 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)
Сразу после этого он попадает в ResultCallback requestConnection, с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)
Затем мы нажимаем ResultCallback requestConnection с помощьюSTATUS_BLUETOOTH_ERROR
(8007)
После этого я увидел устройстваподключи потом отключи, который повторяется несколько раз. Они никогда не получали успешного постоянного соединения, хотя я видел, как это произошло после множества ошибок.