-1

4台のデバイスを接続するアプリケーションを作成しています。そのうちの 1 つがサーバーとして機能し、残りの 3 つがクライアントとして機能します。サーバーはクライアントとしても機能します。それはカードゲームです。私はそれに7つのUUIDを与えました。サーバーを作成すると、3 つのクライアントのうち 2 つが接続できますが、3 つ目のクライアントが参加するとアプリがクラッシュします。これは、3 番目のデバイスが接続を試みたときの logcat の一部です。

        05-12 15:41:55.453: E/ConnectionService(10793): getConnectedSocket : 503c7432-bc23-11de-8a39-0800200c9a66
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793): IOException in getConnectedSocket
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793): java.io.IOException: Service discovery failed
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.bluetooth.BluetoothSocket$SdpHelper.doSdp(BluetoothSocket.java:377)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:201)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at net.clc.bt.ConnectionService.getConnectedSocket(ConnectionService.java:191)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at net.clc.bt.ConnectionService.access$5(ConnectionService.java:185)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at net.clc.bt.ConnectionService$1.connect(ConnectionService.java:225)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at net.clc.bt.Connection.connect(Connection.java:191)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at net.dillen.satat.Satat.onActivityResult(Satat.java:308)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.Activity.dispatchActivityResult(Activity.java:3835)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3332)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:3378)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.ActivityThread.access$2700(ActivityThread.java:123)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1900)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.os.Handler.dispatchMessage(Handler.java:99)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.os.Looper.loop(Looper.java:123)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at android.app.ActivityThread.main(ActivityThread.java:4370)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at java.lang.reflect.Method.invokeNative(Native Method)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at java.lang.reflect.Method.invoke(Method.java:521)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-12 15:41:55.463: I/net.clc.bt.ConnectionService(10793):  at dalvik.system.NativeStart.main(Native Method)

minSdkVersion="7" 
device OS = 2.3.3 , 2.3.3, 2.1.1, 2.1.1

OSバージョンでは問題ないようです。

4

1 に答える 1

1

あなたが提供したスタック トレースについてはコメントしませんが、3 番目のピアを追加しようとしたときに問題が発生したという事実は、Bluetooth のコア制限にぶつかっているのではないかと疑っています。説明させてください。

Bluetooth 通信は、1 つのマスター (タイミングを設定する人) と最大 7 つのスレーブを持つピコネットで行われます。1 つのデバイスが複数のピコネットに参加することは、異なるピコネットのクロック サイクル間を行き来する必要があるため、扱いにくく非効率的です。私の経験では、デバイスは 2 つのピコネットでのみスレーブになることができるため、3 番目のピコネットに入ろうとすると失敗します (ただし、もちろん、これよりも適切かつ有益に失敗するはずです)。

一般的な解決策は、1 つのデバイスをピコネット マスターとして指定し、他のすべてのデバイスをこの 1 つのデバイスにのみ接続することです。実際には、Android よりもはるかに多くの制御が可能なシステム (たとえば、マスターとスレーブを明示的に制御できるシステム) でのみこれを試したので、これが Android でどのように機能するかはわかりませんが、開始する必要があります。経験則では、接続を開始するデバイスがマスターになります。

または、すべてを考えすぎている可能性があります。Android の Bluetooth スタックには非常にバグがあることがわかったので、バグに遭遇した可能性があります。ところで、あなたがテストした 4 台の電話は複数のメーカーのものだと思いますか?

于 2012-05-12T15:32:48.153 に答える