方案:
给出,一种总是打开的设备,每秒进行一次蓝牙低能广告。
我必须实现一个Android平板电脑的应用程序,该应用程序通过蓝牙低能连接到该设备,发送一些命令,然后与之断开连接。
最小Android版本:最有效的版本,我可以自由决定。我从API 21(Android 5.0,Lollipop(
问题:
BLE堆栈遇到的问题也给我带来了麻烦:我想使用 bluetoothadapter#getRemotedevice(macAddress:string:string( methot的对象发布成功的直接连接,并且总是失败。
我的研究结果:
以下是我发现并且似乎有用的问题/答案/帖子(也许这些会帮助某人(:
- 蓝牙/BLE的发展对Android是痛苦的。有人知道任何特殊技巧吗?
- android ble慢慢连接
- GATTMANAGER的实施,该公司具有解决方法 - 公司在挪威实施:北欧半导体
- rxandroidble- 'rxandroidble是Android蓝牙低能量头痛的强大止痛药。它得到了rxjava的支持,将复杂的API作为方便的可观察到。
- 重新/连接的解决方法
问题:
除了这些之外,我查看了蓝牙源的源代码,我发现 context containe connectgatt((方法是 not> not> not>/em>完全使用:
https://android.googlesource.com/platform/frameworks/base//master/core/core/java/android/bluetooth/bluetooth/bluetoothdevice.java#1899
想知道这是否可以是BLE堆栈有缺陷的原因之一?
另外,我不明白扫描仪与 bluetoothadapter#getRemotedeDevice(macaddress:string:string:string(检索的a bluetoothdevice 对象之间有什么区别。
如果我发布直接连接( autoconnect 参数,则将 false 设置为 connectgatt(((,请通过扫描进行,通常连接成功。但是,当使用 getRemotedevice((。。
作为我想连接到每秒广告的设备,我希望直接连接到始终/大多数时间工作,例如扫描。
由于背景连接( autoconnect参数设置为true (非常慢,所以我不能依靠。
另外,由于扫描不可靠且缓慢,所以我不能强迫用户在应用程序启动时等待。
总结我的问题:
- 上下文 connectgatt((方法的参数是 not 根本使用的 - 这可以是缺陷的原因之一Ble stack有吗?我想有人把它放在那里是有充分理由的。
- 蓝牙device 对象与扫描仪检索到的对象是什么区别
-
上下文参数已在较早的Android版本中使用,但显然不再需要。您仍然应该通过一个有效的上下文,以与早期版本兼容,或者如果他们决定再次使用它,则它们的较新。
-
没有什么区别。但是,如果您只是通过蓝牙设备地址连接,您会注意到API中的缺陷,您无法传达地址类型(公共或随机(。因此,如果您尝试连接到静态随机地址,则除非您首先扫描设备,否则可能会失败。这是因为Android保留了地址的缓存以及在最新广告中具有哪种地址类型。因此,请尝试首先扫描并确保您看到要连接到的设备。然后尝试使用BluetoothAdapter#getRemotedevice(macaddress:string(。