【问题标题】:Android Bluetooth - Can't connect outAndroid 蓝牙 - 无法连接
【发布时间】:2010-06-18 20:15:23
【问题描述】:

我正在开发一个应用程序,它使用蓝牙连接到设备并发送/接收数据。我正在使用 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

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

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:解决方案似乎只是禁用任何蓝牙监听。有关详细信息,请参阅我的回答帖子。

【问题讨论】:

标签: java android bluetooth serial-port uuid


【解决方案1】:

事实证明,解决方案是禁用蓝牙服务的服务器功能。通过只使用createRfcommSocketToServiceRecord 而从不调用listenUsingRfcommWithServiceRecord(在BluetoothChat 示例中,这意味着从不启动“AcceptThread”),问题就得到了解决。

尽管这两个调用应该完全分开并且彼此没有影响(根据 Android 文档),但只需注释掉 listenUsingRfcommWithServiceRecord 即可解决我所谓的不相关问题。

我可以在未经编辑的情况下使用蓝牙聊天程序,它无法与我测试过的任何蓝牙设备(笔记本电脑、台式机、耳机等)建立传出连接,但如果我删除那个东西,它就可以完美运行作为客户。

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

【讨论】:

  • 这里一样,没用。使用相同的示例和 Nexus S +Galaxy 选项卡
  • 禁用监听连接对我不起作用。这将如何工作?...我偶尔会遇到这个问题,但让它无法启动接受线程会使其始终无法正常工作。
【解决方案2】:

我会忽略 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");

【讨论】:

  • 谢谢,但我实际上已经在使用您提供的 UUID。我能够让蓝牙聊天应用程序工作,但前提是我从我的设备(计算机)连接到手机,而不是相反。如果我尝试从手机连接到计算机(从应用程序菜单中),它会尝试几秒钟,然后显示“连接失败”之类的错误。
  • 您是否在您的计算机上明确添加了 RFCOMM 服务?否则计算机没有理由响应 RFCOMM 请求。就像您的计算机不会响应 FTP 请求一样,除非您安装了 FTP 服务器并打开了 21 端口。
  • 我很困惑 - 你是想让蓝牙聊天在两部手机之间还是在手机和 PC 之间工作?我认为只有前者才有意义,但我可能不理解你的最终目标。你能澄清一下吗?
  • 我没有两部 Android 手机可以对此进行测试,但我一直在使用两台 PC(在 windows 上使用 PuTTY,在 mac 上使用 Terminal)以及使用 SPP 的特殊耳机设备进行测试。它在其中任何一个上都不能作为客户端(仅作为服务器)。正如我的帖子所示,我现在已经解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2012-12-12
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多