0

设想:

给定一个设备,它始终处于开启状态,并且每秒执行一次低功耗蓝牙广告。
我必须为 Android 平板电脑实现一个应用程序,该应用程序通过低功耗蓝牙连接到该设备,发送一些命令,然后断开连接。
最低 Android 版本:效果最好的版本,我可以自由决定。 我从 API 21(Android 5.0、Lollipop)开始

问题:

BLE 堆栈的问题也给我带来了麻烦:我想使用BluetoothAdapter#getRemoteDevice(MACAddress: String)方法检索到的对象发出成功的直接连接,但它总是失败。

我的研究结果:

以下是我发现并且似乎有用的问题/答案/帖子(也许这些会对某人有所帮助):

问题:

除此之外,我查看了 BluetoothDevice 的源代码,我发现connectGatt()方法的Context参数根本没有使用:https ://android.googlesource.com/platform/frameworks/base/+ /master/core/java/android/bluetooth/BluetoothDevice.java#1899 想知道这是否是 BLE 堆栈存在缺陷的原因之一?

另外,我不明白扫描仪检索到的BluetoothDevice对象与BluetoothAdapter#getRemoteDevice(MACAddress: String)方法检索到的对象有什么区别。如果我在通过扫描获得的设备上
发出直接连接(调用connectGatt()时autoconnect参数设置为false ),连接通常会成功。但是,当使用由getRemoteDevice()检索到的对象时,直接连接总是失败(状态 = 133,超时) 。

由于我要连接的设备每秒都在宣传自己,我希望直接连接始终/大部分时间都能正常工作,就像在扫描的情况下一样。
因为后台连接(autoconnect 参数设置为 true)非常慢,我不能依赖它。
此外,由于扫描不可靠且缓慢,我不能强制用户在每次应用程序启动时等待。

总结我的问题:

  • 根本没有使用connectGatt()方法的Context参数- 这可能是 BLE 堆栈存在缺陷的原因之一吗?我想有人把它放在那里是有充分理由的。
  • 扫描仪检索到的BluetoothDevice对象与BluetoothAdapter#getRemoteDevice(MACAddress: String)方法检索到的对象有什么区别?
4

1 回答 1

1
  1. context 参数在早期的 Android 版本中使用,但显然不再需要。您仍然应该传递一个有效的上下文以与早期版本兼容,或者如果他们决定再次使用它则更新。

  2. 应该没有什么区别。但是如果你只是通过蓝牙设备地址连接,你会注意到API中不能传递地址类型(公共或随机)的缺陷。因此,如果您尝试连接到静态随机地址,除非您首先扫描设备,否则可能会失败。这是因为 Android 会缓存地址以及它在最新广告中的地址类型。因此,请尝试先扫描并确保您看到要连接的设备。然后尝试使用 BluetoothAdapter#getRemoteDevice(MACAddress: String) 进行连接。

于 2018-04-29T08:56:44.613 回答