java.io.IOException:服务发现失败

时间:2013-07-23 13:52:56

标签: android sockets bluetooth uuid

我正在使用两个配对智能手机之间使用蓝牙连接的Android应用程序。蓝牙逻辑基于着名的BluetoothChat SDK示例:管理服务器accept()的线程的“服务”类,客户端connect()的线程和用于读取/写入套接字的线程。

一切正常,除非我关闭活动连接(来自客户端或服务器端),然后所有连续尝试启动新连接都将失败,并显示以下错误:

java.io.IOException: Service discovery failed

经过一些研究,我认为这是UUID的一个问题。我正在使用BTChat示例的UUID(fa87c0d0-afac-11de-8a39-0800200c9a66),但问题仍然存在于另一个随机UUID(它是31ef5990-dc20-11e2-a28f-0800200c9a66)。

这是相关的客户端logcat。 (客户端connect()失败了):

E/BluetoothService.cpp: stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)
D/BluetoothService: Cleaning up failed UUID channel lookup: 30:17:C8:A7:C6:C3 fa87c0d0-afac-11de-8a39-0800200c9a66
        java.io.IOException: Service discovery failed

D-Bus错误可能是由Android文档建议在cancelDiscovery()之前调用的connect()引起的。我认为failed UUID channel lookup是真正的问题,但我不知道如何解决这个问题。我应该使用另一个(众所周知的?)UUID吗?

如果需要,我可以显示代码段。然而,这个问题在逻辑上与蓝牙相似。

1 个答案:

答案 0 :(得分:4)

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
tmp = (BluetoothSocket) m.invoke(device, 1);

&安培;

m = mAdapter.getClass().getMethod("listenUsingRfcommOn", new Class[] { int.class });
tmp = (BluetoothServerSocket) m.invoke(mAdapter, BLUETOOTH_CHANNEL);

嗯....我不是BT专家,但我知道我的代码在没有UUID的情况下使用反射。我不认为这是一个很好的解决方案,如果你想要一些干净的东西,但我只知道,在我的情况下,它有效(在2.3.6):)