我正在创建一个连接4个设备的应用程序。其中一个充当服务器,另外三个充当客户端。服务器也充当客户端。这是一个纸牌游戏。我给了它7个UUID。当我创建服务器时,3个客户端中的2个能够连接,但是当第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
操作系统版本似乎没有出现这个问题。
答案 0 :(得分:1)
我对您提供的堆栈跟踪没有评论,但是当您尝试添加第三个对等项时出现问题这一事实让我怀疑您是否遇到了核心蓝牙限制。让我解释一下。
蓝牙通信发生在微微网中,其中包含1个主设备(设置时间)和最多7个从设备。对于参与多个微微网的一个设备来说是棘手且低效的,因为它必须在不同微微网的时钟周期之间来回跳转。根据我的经验,一个设备只能成为2个微微网中的从属设备,因此当你尝试进入第三个微微网时会失败(尽管它应该更加优雅和信息性地失败然后当然)。
一般的解决方案是将一个设备指定为微微网主设备,而所有其他设备应仅连接到这一个设备。在实践中,我只在允许Android(我可以,例如,明确控制主人与奴隶)的系统上尝试了这个,所以我不能说这将如何在Android上运行,但你应该开始根据拇指规则,启动连接的设备将成为主设备。
或者我可能会想到整件事。我发现Android上的蓝牙堆栈非常多,所以你可能只是遇到了一个bug。顺便说一句,我假设您测试的四部手机来自多家制造商?