2013-07-23 71 views
2

我正在使用两个配对智能手机之间的蓝牙连接的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很相似。

回答

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

+0

不幸的是,spp uuid并没有解决它。第一个连接总是有效的,下面的连接不是。 – eang

+1

嗯,我的服务发现在我的第一个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代码时,我能够连接/断开多达我想要的:) –

+0

那么,使用反射就不再需要UUID了?相反,我必须选择一个BT频道? – eang