Android蓝牙 – 无法连接
我正在开发一个使用蓝牙连接到设备并发送/接收数据的应用程序。 我正在使用Nexus One手机进行所有测试。
我从来没有能够建立从手机到任何设备的SPP(串行端口)连接。 但是,我已经能够使用相当于PuTTY的Mac从设备(我的笔记本电脑)连接到我的手机(唯一的例外是来自Marketplace的“蓝牙文件传输”应用程序似乎可行,但我不认为使用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示例和该代码的变体来完成我的所有测试…
解决方案或建议会很棒…或者甚至是我可以在手机上运行的一些测试代码的更好/更简单的例子,或者我可以在计算机上运行以帮助调试的python脚本或其他东西?
谢谢! 我希望这不是Android操作系统的错误,但如果是,我希望找到一个解决方法。
编辑:我还应该注意,大多数设备在蓝牙设置中显示为“已配对但未连接”。
编辑2:解决方案似乎只是禁用任何蓝牙监听。 有关更多信息,请参阅我的回答帖
事实certificate,解决方案是禁用蓝牙服务的服务器function。 通过仅使用createRfcommSocketToServiceRecord
并且从不调用listenUsingRfcommWithServiceRecord
(在BluetoothChat示例中这意味着永远不会启动“AcceptThread”)问题得到解决。
尽管这两个调用应该是完全分离的并且彼此没有影响(根据Android文档),但只需注释掉listenUsingRfcommWithServiceRecord
解决我所谓的无关问题。
我可以使用未经编辑的蓝牙聊天程序,它将无法与我测试的任何蓝牙设备(笔记本电脑,台式机,耳机等)建立传出连接,但如果我删除那一件事它作为客户端完美无瑕地工作。
无论如何,我希望如果他们遇到同样的问题,这将有助于其他人。 这必须是Android操作系统的错误,或者可能是Nexus One上的固件。
我会忽略stopDiscovery错误 – 在你建立连接之前取消发现是很好的。 根据SDK文档:
由于发现是蓝牙适配器的重量级,因此在尝试使用connect()连接到远程设备之前,应始终调用此方法。 发现不是由Activity管理,而是作为系统服务运行,因此应用程序应始终调用取消发现,即使它没有直接请求发现,只是为了确定。
那就是说,你能否在对代码进行任何修改之前让蓝牙聊天示例正常工作?
您想要的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");