我正在开发一个 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 文档建议先调用connect()
。我觉得failed UUID channel lookup
是真正的问题,但我不知道如何解决这个问题。我应该使用另一个(众所周知的?)UUID 吗?
如果需要,我可以显示代码片段。然而这个问题在逻辑上与BluetoothChat 非常相似。
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 上):)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)