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

How to force Bluetooth LE "Just Works" Pairing in Android

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

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

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

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

谢谢

问题的根源在于 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 配置参数有条件地构建的。

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