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

lin*_*sek 7 android bluetooth bluetooth-lowenergy android-bluetooth

我有一个运行GATT服务器的嵌入式系统,我试图通过Android连接到该服务器.任务很简单:连接到GATT服务器,导航特征并验证读/写功能.问题是,当我尝试连接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配对?我缺少外设配置吗?

谢谢

lin*_*sek 5

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

以下是我在接口上禁用 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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 真高兴你做到了。但不确定这个解释是否有意义。因为经典蓝牙也支持 Just Works Pairing。听起来问题可能是被转移了而不是被解决了。 (2认同)
  • 这不是 BR/EDR 支持 Just Works 的问题。我正在使用默认为密钥配对的 Play 商店 Android 应用程序。我能让它们工作的唯一方法是接口处于单模式(仅限 LE)。很可能可以使用 Android 的 API 来控制此问题,因为我在使用 iOS 应用程序时没有遇到同样的问题。但我的任务只是处理嵌入式方面的事情。因为这将是一款仅限 LE 的设备。宣传不支持 BR/EDR 是有意义的。 (2认同)