设想:
给定一个设备,它始终处于开启状态,并且每秒执行一次低功耗蓝牙广告。
我必须为 Android 平板电脑实现一个应用程序,该应用程序通过低功耗蓝牙连接到该设备,发送一些命令,然后断开连接。
最低 Android 版本:效果最好的版本,我可以自由决定。
我从 API 21(Android 5.0、Lollipop)开始
问题:
BLE 堆栈的问题也给我带来了麻烦:我想使用BluetoothAdapter#getRemoteDevice(MACAddress: String)方法检索到的对象发出成功的直接连接,但它总是失败。
我的研究结果:
以下是我发现并且似乎有用的问题/答案/帖子(也许这些会对某人有所帮助):
- 蓝牙/BLE开发在Android上惨不忍睹。有谁知道有什么特别的技巧吗?
- android ble连接慢
- GattManager 的实现,它有解决方法 - 由挪威的一家公司实现:Nordic Semiconductor
- RxAndroidBle - “RxAndroidBle 是一个强大的止痛药,可以解决 Android 的低功耗蓝牙问题。它由 RxJava 支持,将复杂的 API 实现为方便的反应性可观察对象。”
- 重新/连接的解决方法
问题:
除此之外,我查看了 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)方法检索到的对象有什么区别?