BLE 设备未出现在 Android Chrome 中

BLE device not showing up in Android Chrome

我有一个低功耗蓝牙 (BLE) 设备,想使用 Web 蓝牙从网页访问它 API。

这在 Chrome 和 Windows 上(至少对于 Chrome 和 Windows 的当前版本)甚至在 iPadOS 上的 WebBLE 应用程序(因为Safari 将不支持 WebBluetooth)。

但我有多个 Android 设备 运行 Android (12) 和 Chrome (97) 的当前版本,在浏览器设备选择器中,设备不会出现。其他一些未知设备出现,但我的设备没有。

只有这台设备没有显示的原因是什么?我该如何收集有关这种情况的更多信息? 它发生在本机浏览器对话框中,所以我通常的调试步骤不起作用。

更新: 我已经用chrome://bluetooth-internals查过了,结果是一样的。该设备出现在 Chrome/Windows 但未出现在 Chrome/Android。

现在我还使用了 chrome://device-log,它在 Windows 和 Android 上都只显示

Bluetooth Internals Page initiating Bluetooth discovery session

nRF Connect for Mobile 会立即显示设备,它还会显示在 Android 蓝牙设置中。只有 Chrome Web Bluetooth 不显示。

更新2: adb logcat 在 Chrome 蓝牙发现期间显示以下行:

V/BtGatt.GattService(19403): Skipping data matching denylist

那是什么? Chrome 有自己的蓝牙设备黑名单吗?

更新3: Android 有一个 BLE 设备的拒绝列表,如果应用程序 (Chrome) 具有 ACCESS_FINE_LOCATION 权限,则不应应用该列表。但三星似乎仍然应用了拒绝名单,即使 Chrome 拥有所有必要的权限。

https://www.chromium.org/developers/how-tos/file-web-bluetooth-bugs/ 列出可能有用的工具和日志查看方法,包括:

试试 requestDevice 和 "acceptAllDevices":true 如果你还没有。

设备未显示的原因是 Android 有一个黑名单,该黑名单使用广告数据匹配 Eddystone 和 iBeacon 负载。

我的设备似乎在其广告数据中包含与 Eddystone 或 iBeacon 匹配的内容,因此被忽略,即使它是数字卷尺。

来源: https://android.googlesource.com/platform/packages/apps/Bluetooth/+/master/src/com/android/bluetooth/gatt/GattService.java#255 https://android.googlesource.com/platform/packages/apps/Bluetooth/+/master/src/com/android/bluetooth/btservice/AdapterService.java#3939

不幸的是,这个设备被过滤掉了,即使它不是定位信标(iBeacon、eddyStone),但这种行为目前正在按预期工作 [= =10=].