我正在开发一个使用蓝牙连接设备并发送/接收数据的应用程序。我正在使用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:解决方案似乎只是禁用任何蓝牙监听。有关详细信息,请参阅我的回答帖。
答案 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");