-1

我正在创建一个连接 4 个设备的应用程序。其中一个充当服务器,另外三个充当客户端。服务器还充当客户端。这是一个纸牌游戏。我给了它 7 个 UUID。当我创建服务器时,3 个客户端中的 2 个能够连接,但是当第三个客户端加入时,应用程序崩溃。这是第三个设备尝试连接时 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

操作系统版本似乎没有出现问题。

4

1 回答 1

1

我对您提供的堆栈跟踪没有评论,但是当您尝试添加第三个对等方时出现问题的事实让我怀疑您遇到了核心蓝牙限制。让我解释。

蓝牙通信发生在具有 1 个主设备(设置时间)和多达 7 个从设备的微微网中。一个设备参与多个微微网是棘手且低效的,因为它必须在不同微微网的时钟周期之间来回跳转。根据我的经验,一个设备只能是 2 个微微网中的从属设备,因此当您尝试进入第三个微微网时它会失败(当然,它应该比这更优雅和更有信息地失败)。

一般的解决方案是将一台设备指定为微微网主设备,所有其他设备应仅连接到这台设备。在实践中,我只在允许比 Android 更多控制的系统上尝试过这个(例如,我可以显式控制主从控制)所以我​​不能说这将如何在 Android 上工作,但你应该开始根据经验,启动连接的设备将是主设备。

或者我可能会过度思考整个事情。我发现 Android 上的蓝牙堆栈非常有问题,所以你可能只是遇到了一个错误。顺便说一句,我假设您测试过的四款手机来自不止一家制造商?

于 2012-05-12T15:32:48.153 回答