Android蓝牙 - 无法连接

时间:2010-06-18 20:15:23

标签: java android bluetooth serial-port uuid

我正在开发一个使用蓝牙连接设备并发送/接收数据的应用程序。我正在使用Nexus One手机进行所有测试。

我从来没有能够建立从手机到任何设备的SPP(串行端口)连接。但是,我已经能够使用相当于PuTTY的Mac从设备(我的笔记本电脑)连接到我的手机(唯一的例外是来自市场的“蓝牙文件传输”应用程序似乎工作,但我不认为使用RFCOM / SPP ......)。

我在LogCat日志中看到这条消息:

ERROR/BluetoothService.cpp(78): stopDiscoveryNative: D-Bus error in StopDiscovery: org.bluez.Error.Failed (Invalid discovery session)

以及这些:

java.io.IOException: Operation Canceled
java.io.IOException: Software caused connection abort

我尝试使用UUID“00001101-0000-1000-8000-00805F9B34FB”,我也尝试过使用:

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

方法代替device.createRfcommSocketToServiceRecord(UUID); - 没有运气。

我使用BluetoothChat example和该代码的变体来完成我的所有测试......

解决方案或建议会很棒...或者甚至是我可以在手机上运行的某些测试代码的更好/更简单的示例,或者我可以在计算机上运行以帮助调试的python脚本或其他东西?

谢谢!我希望这不是Android操作系统的错误,但如果是,我希望找到一个解决方法。


编辑:我还应该注意,大多数设备在蓝牙设置中显示为“已配对但未连接”。


编辑2:解决方案似乎只是禁用任何蓝牙监听。有关详细信息,请参阅我的回答帖。

2 个答案:

答案 0 :(得分:7)

事实证明,解决方案是禁用蓝牙服务的服务器功能。仅使用createRfcommSocketToServiceRecord并且从不调用listenUsingRfcommWithServiceRecord(在蓝牙示例中,这意味着永远不会启动“AcceptThread”)问题得到解决。

尽管这两个电话应该是完全分开的并且彼此之间没有任何影响(根据Android文档),但只需注释listenUsingRfcommWithServiceRecord即可解决我所谓的无关问题。

我可以使用未编辑的蓝牙聊天程序,它将无法与我测试过的任何蓝牙设备(笔记本电脑,台式机,耳机等)建立传出连接,但是如果我删除了那一件事它可以完美无缺地工作作为客户。

无论如何,我希望如果他们遇到同样的问题,这将有助于其他人。这必须是Android操作系统的错误,或者可能是Nexus One上的固件。

答案 1 :(得分:1)

我会忽略stopDiscovery错误 - 在进行连接之前取消发现是很好的。根据SDK文档:

  

因为发现是重量级的   适用于蓝牙适配器,   应始终调用此方法   在尝试连接之前   带connect()的远程设备。   发现不是由管理   活动,但作为系统运行   服务,所以应用程序应该   即使是,也总是调用取消发现   它没有直接要求   发现,只是为了确定。

因此,在您对代码进行任何修改之前,您是否能够使蓝牙聊天示例正常工作?

您希望SPP / RFCOMM使用的UUID是:

static UUID UUID_RFCOMM_GENERIC = new UUID(0x0000110100001000L,0x800000805F9B34FBL);

或定义另一种方式(两者都完成相同的事情)。

static final UUID UUID_RFCOMM_GENERIC = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");