2012-09-18 53 views
7

好吧,这里是交易。我有两个启用蓝牙的Galaxy Nexus手机。Android蓝牙IOException:连接被拒绝

我写了一个蓝牙连接管理应用程序,用于设备发现和连接。它还输出设备可支持的所有可用UUID。

http://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm查看以下标准UUID是从Galaxy Nexus设备公开的。

  • 0x1116 - NAP
  • 0x112f - PBAP(电话簿连接配置文件)
  • 0x111F的 - HFP(免提)
  • 0x1105 - OPP(对象推送模式)
  • 0x1112 - HSP(耳机模式)
  • 0x110c - AVRCP
  • 0x110a - A2DP

我正尝试通过OPP配置文件(UUID 00001105-0000-1000-8000-00805F9B34FB)连接并在设备之间推送对象(文件)。我已经去了整个Android API documentation如何发现,配对/绑定(线程等)和管理所有的蓝牙连接。我设法通过SPP(0x1101)配置文件成功连接并与传统主板设备通话。

但是,当我尝试在两个星系联网电话之间使用socket.connect()时,配对对话框出现,并且我在两个设备上单击了Pair按钮。之后,我立即得到一个Connection Refused IOException。请注意,在配对发生后,一旦我再也不会再问到问题,因为安全链接已被缓存。

如果我无法使用这些标准UUID连接到这些标准配置文件,为什么它们暴露?如何从我的应用程序连接到这些配置文件中的任何一个并与它们交互?是否因为我的应用程序不是某种可信的?奇怪的是,即使Android上的Share功能也根本不起作用。这是Android上完全破坏的东西吗?

请避免给我暗示使用“众所周知的UUID SPP一个0x1101”像文档说。这不是我想要的。我对这些东西的工作原理有了很好的理解,并且正在寻找真正的解决方案或问题的解释。

我见过典型的“反射”解决方案,但我不明白为什么这仍然是Android上的问题?为什么人们使用反思来完成这项工作?我们可以在Android上提交一个错误来解决这个问题吗?

如果这些UUID是标准的,那么任何应用程序都应该能够连接并与它们交互。为什么这是一个问题,为什么我会得到这个异常?

在此先感谢。

UPDATE

所以,出于某种原因,在Android系统中的对象推送开始工作。我实际上试图通过我的应用程序连接,它不工作。然后,我去了通讯录应用程序,并试图分享一个神奇的联系人。然后,我回到我的应用程序,现在它的工作原理...哇。这很奇怪,必须有解释。

+0

你设置了正确的权限? http://developer.android.com/guide/topics/connectivity/bluetooth.html#Permissions – Lars

+0

@Lars当然,他做到了。 dnkoutso:你究竟打开了什么插口?你可以尝试重新配对,那就是 - 不配对然后再配对。顺便说一句,它是2层? – nullpotent

+0

@iccthedral,你是什么意思2层?我经常进入两台设备上的真实设置应用并删除配对。一旦我再次调用'socket.connect()',它会提示我配对对话框和填入的密钥号码。不幸的是,在我得到“Connection Refused”IOException后。 – dnkoutso

回答

2

您是否尝试过使用非标准配置文件?即只为您的应用定制UUID。这也将帮助您了解您的(最有可能)只连接到您自己的应用程序,而不是其他一些使用相同配置文件注册的应用程序。

从我的经验来看,蓝牙配对对于第一对尝试来说是非常麻烦的。但是,使用自定义UUID有助于这一点。

反射方法(我认为),本来是修复bug与特定设备的尝试,但我觉得有些人发现在使用它在其他地方,以及成功。该设备被称为Spica或类似的东西。

作为其中一条评论也张贴,我也会尝试失败后再次连接。

基本上写计划失败的第一次尝试的代码,但随后的代码尝试,如果有一个未能在5秒内重新连接。

这些都是不完美的解决方案,但Android上的蓝牙实现也不完美(恕我直言)。希望基于问题的更新和评论,帮助

编辑

我同意的东西绝对是越野车。我认为部分问题是BT驱动程序各不相同,而且每个BT堆栈都有不同的怪癖。我还发现使用反射方法和自定义UUID以及其他标准方法的问题。这对我来说似乎极端,但确实涵盖了最多的内容。不幸的是,作为应用程序开发人员,我们无法控制低级堆栈/代码/驱动程序。

我发现与我的两个蓝牙共享应用程序第一次配对总是棘手

我很高兴知道这不只是我。

+1

我设法与自己的自定义UUID建立连接。我只是不明白这些公共蓝牙标准UUID是如何工作的。他们也没有在Android上正常的“共享”系统上工作,这也暗示Android代码中有些bug。 – dnkoutso

+0

我同意的东西肯定是越野车。我认为部分问题是BT驱动程序各不相同,而且每个BT堆栈都有不同的怪癖。我还发现一个使用反射方法和自定义以及其他标准方法的问题。这对我来说似乎极端,但确实涵盖了最多的内容。不幸的是,作为应用程序开发人员,我们无法控制低级堆栈/代码/驱动程序。 – pjco

4

我遇到了同样的问题,并设法找到了适合我的解决方案。

在我来说,我用三种不同的测试设备(Nexus 5上,银河S4,注2),由于某种原因,该注2将无法连接到我的蓝牙模块,但另外两个会。

我发现的理由是,蓝牙驱动程序有所不同,需要稍微不同的连接方法来创建不同设备之间的连接。

这三种方法我用被称为“安全的”,“不安全”和“反射法” /“HAX”。

  switch(connType) 
      { 
      case Secure: 
       tmpSocket = device.createRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Insecure: 
       tmpSocket = device.createInsecureRfcommSocketToServiceRecord(_uuid); 
       break; 

      case Hax: 
       Method createSocket = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}); 
       tmpSocket = (BluetoothSocket)createSocket.invoke(device, Integer.valueOf(1)); 
       break; 
      } 

在我的情况下,安全模式下工作为Nexus 5都和Galaxy S4但它没有为注2

工作,经过一些测试,我发现了注2只能用'不安全“模式,所以为了迎合这一点,我基本上尝试连接并在必要时循环通过不同的模式。当尝试不同的连接模式时,我只需提示'重试连接'。所以,如果连接失败使用安全,那么我会尝试使用不安全,然后使用反射方法。

我还没有遇到这三种方法之一没有奏效的情况。