我正在使用两个配对智能手机之间的蓝牙连接的Android应用程序。蓝牙逻辑基于着名的BluetoothChat SDK示例:管理用于服务器accept()
的线程的“服务”类,用于客户端connect()
的线程以及用于在套接字上读/写的线程。java.io.IOException:服务发现失败
一切工作正常,但如果我关闭活动连接(无论是从客户端或服务器端),那么所有连续尝试启动一个新的连接将会失败,此错误:
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很相似。
不幸的是,spp uuid并没有解决它。第一个连接总是有效的,下面的连接不是。 – eang
嗯,我的服务发现在我的第一个BT应用上失败了。然后我用反射来创建套接字: 'm = mAdapter.getClass()。getMethod(“listenUsingRfcommOn”,new Class [] {int.class}); tmp =(BluetoothServerSocket)m.invoke(mAdapter,BLUETOOTH_CHANNEL);'(With BLUETOOTH_CHANNEL the socket of the socket) 但是当我改变原来的bluetoothChat代码时,我能够连接/断开多达我想要的:) –
那么,使用反射就不再需要UUID了?相反,我必须选择一个BT频道? – eang