7

好吧,这就是交易。我有两部启用蓝牙的 Galaxy Nexus 手机。

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

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

  • 0x1116 - 午睡
  • 0x112f - PBAP(电话簿访问配置文件)
  • 0x111f - HFP(免提)
  • 0x1105 - OPP(对象推送配置文件)
  • 0x1112 - HSP(耳机配置文件)
  • 0x110c - AVRCP
  • 0x110a - A2DP

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

但是,当我尝试socket.connect()在两部 Galaxy nexus 手机之间使用时,会出现配对对话框,然后我单击Pair两部设备上的按钮。之后,我立即得到一个Connection Refused IOException. 请注意,在配对发生后,我再也不会被问到,这是有道理的,因为安全链接已被缓存。

如果我无法使用这些标准 UUID 连接到这些标准配置文件,为什么它们会暴露?如何从我的应用程序连接到任何这些配置文件并与它们交互?是因为我的应用程序不受信任吗?奇怪的是,即使是ShareAndroid 上的功能也根本不起作用。这在 Android 上完全被破坏了吗?

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

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

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

提前致谢。

更新

因此,出于某种原因,Android 系统中的对象推送开始起作用。我实际上试图通过我的应用程序进行连接,但它无法正常工作。然后,我去了联系人应用程序并尝试分享一个神奇的联系人。然后,我回到我的应用程序,现在它可以工作了......哇。这很奇怪,必须对此进行解释。

4

2 回答 2

4

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

在我的情况下,我使用了三种不同的测试设备(Nexus 5、Galaxy S4、Note 2),由于某种原因,Note 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,但不适用于 Note 2。

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

我还没有遇到过这三种方法之一不起作用的情况。

于 2014-03-18T05:38:25.487 回答
2

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

根据我的经验,蓝牙配对对于第一次尝试是非常错误的。但是,使用自定义UUID会有所帮助。

反射方法(我认为)最初是尝试修复特定设备的错误,但是我认为有些人在其他地方也成功地使用了它。该设备被称为Spica或类似的东西。

正如还发布的评论之一,我也会在失败后再次尝试连接。

基本上编写计划第一次尝试失败的代码,但如果出现失败,代码会在 5 秒内尝试再次连接。

这些都是不完美的解决方案,但 Android 上的蓝牙实现也不完美(恕我直言)。希望有帮助

编辑

根据问题更新和评论:

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

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

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

于 2012-09-19T00:12:34.570 回答