android - 如何在 Android 中强制蓝牙 LE "Just Works"配对

标签 android bluetooth bluetooth-lowenergy android-bluetooth

我有一个运行 GATT 服务器的嵌入式系统,我正尝试通过 Android 连接到该服务器。任务很简单:连接到 GATT 服务器、导航特征并验证读/写能力。问题是当我尝试连接 Android 应用程序时,它会尝试与“密码”配对,而不是与“Just Works”配对 [ https://developer.bluetooth.org/TechnologyOverview/Pages/LE-Security.aspx] .这是 Not Acceptable ,因为我的嵌入式设备没有任何方法可以向用户显示用于配对的 key 。所以连接方式必须是Just Works。

我尝试了 Play 商店中的许多应用程序,但所有应用程序都只尝试与 Passkey 配对。但这是我目前正在使用的:https://play.google.com/store/apps/details?id=com.macdom.ble.blescanner

我使用 LightBlue 应用程序(在 OS X 和 iOS 中支持)来完成这项工作。所以我知道我的外围设备(GATT 服务器)正在工作:广告、可连接、特征可访问等。

如何强制 Android 使用 Just Works 而不是 key 配对?是否缺少外围设备配置?

谢谢

最佳答案

问题的根源在于 Linux 界面所处的模式。默认情况下同时支持 BR/EDR(经典)和 LE 的蓝牙设备处于双模式。也就是说,它们可以作为经典或 LE 设备运行。我不了解 Android API,也没有尝试开发可以检测双模设备并选择使用 Just Working 配对连接为 LE 的 Android 应用程序。但我能够在界面上禁用 BR/EDR,并验证 Android 在扫描期间将其检测为仅 LE(单模式)界面。然后,Android 应用程序使用 Just Working 配对无缝连接。

以下是我在界面上禁用 BR/EDR 的方法:

$ sudo hciconfig hci0 down
$ sudo ./btmgmt bredr off
hci0 Set BR/EDR complete, settings: connectable bondable le 
$ sudo hciconfig hci0 up
$ sudo hciconfig hci0 leadv

您可以通过下载和构建 Bluez 在 Linux 中构建 btmgmt 应用程序。 btmgmt 应用程序是根据 --enable-experimental 配置参数有条件地构建的。

更新: 另一种方法是不修改接口(interface)能力,只修改广播的接口(interface)能力。这是通过广告标志完成的。修改标志以广播不支持 BR/EDR。这是第 2 位,将创建 0x04 的标志广播。 (参见蓝牙 SIG 文档 CSS v4:A 部分,第 1.3.2 节)

关于android - 如何在 Android 中强制蓝牙 LE "Just Works"配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28307555/

相关文章:

Android 低功耗蓝牙顺序写入性能

ios - 如何更改 Objective-C 中的 CBAdvertisementDataLocalNameKey 值?

android - 如何在 xml 的布局 View 中查看不同的脚蹼?

android - xPath 更多谓词选择节点

iPhone如何知道蓝牙耳机是否已连接

android - 信标 : Android/Iphone Bluetooth range

ios - 应用程序在后台时使用iBeacon进行广告

android - Firestore 当离线设备上线时会发生什么?

android - 与 Java 相比,使用 kivy 编码时 .apk 的大小

android - 将蓝牙设备传递给服务,null getParcelableExtra