2

我正在使用两个配对智能手机之间的蓝牙连接来开发一个 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 错误可能是由cancelDiscovery()Android 文档建议调用 before引起的connect()。我认为这failed UUID channel lookup是真正的问题,但我不知道如何解决这个问题。我应该使用另一个(众所周知的?)UUID吗?

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

4

1 回答 1

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 上):)

于 2013-07-23T14:01:02.030 回答